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.
Cookies are required to use this site. You must accept them to continue using the site. Learn more…