Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

VxD driver for my ISA watchdog

Status
Not open for further replies.

Dmitri

Newbie level 6
Joined
May 31, 2002
Messages
14
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
163
VxD driver for my device

Hi All

I write simple VxD driver for my ISA watchdog. I have any questions:

1. How to use WM_Timer to periodical reseting watchdog counter??
2. an other variant???

My simple VxD driver:

;--------------------------------------------------------------------------
;--
;-- wdt.asm
;-- WDT Driver for Windows 95/98 OpenHardware Project by Megalink Company
;-- Version 0.03
;-- 07 December 2002
;-- Copyright 2002 Dmitri Belimov
;-- E-mail: dimon@openhardware.ru
;-- WWW: www.openhardware.ru
;--
;-- This program is free software; you can redistribute it and/or modify
;-- it under the terms of the GNU General Public License as published by
;-- the Free Software Foundation; either version 2 of the License, or
;-- (at your option) any later version.
;--
;-- This program is distributed in the hope that it will be useful,
;-- but WITHOUT ANY WARRANTY; without even the implied warranty of
;-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;-- GNU General Public License for more details.
;--
;-- You should have received a copy of the GNU General Public License
;-- along with this program; if not, write to the Free Software
;-- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
;--
;--------------------------------------------------------------------------

.386p
.XLIST
include vmm.inc
include debug.inc
.LIST


Declare_Virtual_Device WDT,0,1,WDT_Control,Undefined_Device_ID,Undefined_Init_Order,V86_API_Handler,PM_API_Handler


VxD_REAL_INIT_SEG
BeginProc WDT_Real_Init ; Загрузка и инициализация драйвера

test bx, Duplicate_Device_ID ; check for already loaded
jnz duplicate ; jump if so

mov AH,09h
mov DX,offset msg ; Вывод сообщения о начале загрузки
int 21h
mov DX,300h ; Задаем начальный адрес поиска устройства
mov CX,7h ; Задаем количество попыток
mov BX,48
loop_find_device:
push DX
mov DX,offset mes7
int 21h
mov AH,02h
mov DL,BL
int 21h
mov AH,09h
mov DX,offset mes8
int 21h
pop DX
mov AL,01h ; Проверка на поддерживаемость аппаратного обеспечения
inc DX ; Запись в порт команды чтения номера аппаратного обеспечения
inc DX
out DX,AL
dec DX
dec DX
in AL,DX ; Чтение ответа
cmp AL,02h ; Если номер 2, поддерживается
je ok_go1
push DX
mov AH,09h ; Hardware is not supported
mov DX,offset mes13 ; Аппаратное обеспечение не поддерживается, вывод сообщения
int 21h
pop DX
jmp short loop_done ; Выход из цикла
ok_go1:
mov AL,0Ah ; Проверка на поддерживаемость микропрограммы
inc DX ; Запись в порт команды чтения версии микропрограммы
inc DX
out DX,AL
dec DX
dec DX
in AL,DX ; Чтение ответа
cmp AL,01h ; Если номер 1, поддерживается
je ok_go2
push DX
mov AH,09h ; Firmware is not supported
mov DX,offset mes14 ; Микропрограмма не поддерживается, вывод сообщения
int 21h
pop DX
jmp short loop_done ; Выход из цикла
ok_go2:
mov AL,05h ; Читаем старший байт счетчика
inc DX
inc DX
out DX,AL
dec DX
dec DX
in AL,DX ; Результат в AL
cmp AL,0h
jne short ok_go3
push DX
mov AH,09h
mov DX,offset mes1
int 21h
pop DX
jmp short loop_done
ok_go3: mov AL,04h ; Обнуляем старший байт счетчика
inc DX
inc DX
out DX,AL
dec DX
dec DX
in AL,DX ; Читаем результат выполнения
cmp AL,0h ; Если счетчик сброшен AL=0
je short ok_go4
push DX
mov AH,09h
mov DX, offset mes2
int 21h
pop DX
loop_done:
add DX,10h
inc BX
loop loop_find_device
mov AH,09h ; Устройство не найдено, попробуем позже
mov DX,offset mes11
int 21h
jmp load_done ; Проджолжаем загружать драйвер
ok_go4: mov AL,05h ; Читаем старший байт счетчика
inc DX
inc DX
out DX,AL
dec DX
dec DX
in AL,DX ; Результат в AL, должен быть 0
cmp AL,0h
je short ok_go5
push DX
mov AH,09h
mov DX,offset mes3
int 21h
pop DX
jmp loop_done
ok_go5: mov ioport_ad,DX
mov AH,09h ; Вывод на экран выбраного адреса
mov DX,offset mes10
int 21h
load_done:
xor BX, BX ; no exclusion table
xor SI, SI ; no instance data table
xor EDX, EDX ; no reference data
mov AX, Device_Load_Ok
ret

duplicate:
mov AX, Abort_Device_Load + No_Fail_Message
ret

msg db 'Finding watchdog device....',10,13,'$'
mes1 db 'High byte of counter not eqviv 0',10,13,'$'
mes2 db 'Reseting result - high byte of counter must be 0',10,13,'$'
mes3 db 'High byte of counter must be 0',10,13,'$'
mes7 db 'IOPort 0x3','$'
mes8 db '0h ','$'
mes10 db '..successful. Yep!',10,13,'$'
mes11 db '..failed :((. I`l try later on the protect mode.',10,13,'$'
mes13 db '..driver is not supported this hardware',10,13,'$'
mes14 db '..driver is not supported this firmware',10,13,'$'
ioport_ad dw 0
EndProc WDT_Real_Init
VxD_REAL_INIT_ENDS

VxD_DATA_SEG
wdt_ioport dw 0
Conf_File_Path db 80h dup (00h) ; Путь к файлу конфигурации
Conf_File_Name db "wdt.cfg",00h ; Имя конфигурационного файла
VxD_DATA_ENDS

VxD_CODE_SEG

BeginProc WDT_Control
Control_Dispatch Device_Init, WDT_Device_Init
Control_Dispatch WM_Timer, WDT_Counter_Clear
clc
ret
EndProc WDT_Control

; Процедура инициализации драйвера, ищется адрес ввода-вывода сторожвого
; таймера, если не находиться, считывает его из файла конфигурации
; %WinDir%\SYSTEM\wdt.cfg
BeginProc WDT_Device_Init

mov DX,300h ; Задаем начальный адрес поиска устройства
mov ECX,07h ; Задаем количество попыток
v_loop_find_device:
mov AL,01h ; Проверка на поддерживаемость аппаратного обеспечения
inc DX ; Запись в порт команды чтения номера аппаратного обеспечения
inc DX
out DX,AL
dec DX
dec DX
in AL,DX ; Чтение ответа
cmp AL,02h ; Если номер 2, поддерживается
je v_ok_go1
jmp v_loop_done ; Выход из цикла
v_ok_go1:
mov AL,0Ah ; Проверка на поддерживаемость микропрограммы
inc DX ; Запись в порт команды чтения версии микропрограммы
inc DX
out DX,AL
dec DX
dec DX
in AL,DX ; Чтение ответа
cmp AL,01h ; Если номер 1, поддерживается
je v_ok_go2
jmp v_loop_done ; Выход из цикла
v_ok_go2:
mov AL,05h ; Читаем старший байт счетчика
inc DX
inc DX
out DX,AL
dec DX
dec DX
in AL,DX ; Результат в AL
cmp AL,0h ; Должен быть больше нуля
jne v_ok_go3
jmp v_loop_done
v_ok_go3:
mov AL,04h ; Обнуляем старший байт счетчика
inc DX
inc DX
out DX,AL
dec DX
dec DX
in AL,DX ; Читаем результат выполнения
cmp AL,0h ; Если счетчик сброшен AL=0
je v_ok_go4
jmp v_loop_done
v_ok_go4:
mov AL,05h ; Читаем старший байт счетчика
inc DX
inc DX
out DX,AL
dec DX
dec DX
in AL,DX ; Результат в AL, должен быть 0
cmp AL,0h
je v_ok_go5
v_loop_done:
add DX,10h
loop v_loop_find_device
jmp v_find_done ; Продолжаем загружать драйвер
v_ok_go5:
mov wdt_ioport,DX
clc
ret

v_find_done:
; VMMCall Get_Exec_Path ; Получаем путь %WinDir%\SYSTEM
; mov esi,edx ; Скопировать путь в наш буфер
; mov edi,OFFSET32 Conf_File_Path
; cld
; rep movsb

; Дописать имя нашего VxD файла, сразу после пути

; mov esi,OFFSET32 Conf_File_Name
; mov ecx,09h
; cld
; rep movsb

jmp v_ok_go5

EndProc WDT_Device_Init

BeginProc WDT_Counter_Clear
clc
ret
EndProc WDT_Counter_Clear

BeginProc V86_API_Handler
ret
EndProc V86_API_Handler

BeginProc PM_API_Handler
ret
EndProc PM_API_Handler

VxD_CODE_ENDS

end WDT_Real_Init
 

I think it's could be a nice trick to use WM_TIMER event in VXD-driver! :) Unfortunately, it is impossible.
Instead of, you could create a thread in your driver which will periodically check current time with VMMCall(VTD_Get_Date_And_Time) and will go asleep with VMMCall(Time_Slice_Sleep). These calls are well defined in Win 98 DDK documentation.

Good luck!

Ace-X.
 

2Ace-X: 10x!!!! I`l try.
 

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top