Драйверы устройств в системе Windows


Библиотека DLL для драйвера - часть 2


Вместо этого ее необходимо поместить в библиотеку DLL.

     Листинг 2 представляет исходный код bogusa.asm на ассемблере  для библиотеки DLL, который содержит  программу ISR и может  выполняться в окружении Windows. Программа IntSvcRtn очень похожа на свой  дубликат, работающий  в  системе  MS-DOS.  Однако  кроме  увеличения переменной-счетчика данная  программа ISR  также записывает  в очередь  сообщение Windows.  Чтобы  избежать   переполнения  очереди,  запись   сообщения производится  только   в  случае,   когда  переменная-счетчик   wCount изменяет значение от  0 к 1.  Функция обнуления счетчика  wCount после того,  как  закончена  обработка  сообщения,  передана высокоуровневой программе системы Windows.

     С первого  взгляда все  эти рассуждения  кажутся простыми, однако обработка прерываний  в системе  Windows совсем  не так  проста, как в системе MS-DOS.

page ,132

 

; masm tisr ; >err

    .286p

.xlist

include bogus.inc

include pic.h

.list

 

WM_COMMAND=0111h

 

EXTRN POSTMESSAGE:FAR

 

Words struc

LoWord dw ?

HiWord dw ?

Words ends

 

;

; Установить переменные для нашего номера прерывания

;

ife (FAKE_IRQ GE 8)

INT_DEV equ (INT_MASTER_0+(FAKE_IRQ AND 7))

PIC00 equ INTA00

PIC01 equ INTA01

else

INT_DEV equ (INT_SLAVE_0+(FAKE_IRQ AND 7))

INT_MASK equ 1 SHL (FAKE_IRQ AND 7))

PIC00 equ INTB00

PIC01 equ INTB01

endif

 

FIXED_DATA SEGMENT DWORD PUBLIC 'DATA'

PUBLIC _hWndEvent,_wParamEvent,_wCount

 

_hWndEvent label word

hWndEvent  dw   0      ; Окно для постирования событий

 

_wParamEvent label word

wParamEvent  dw  0     ; Значение wParam для постирования

 

_wCount label word

wCount dw   0          ; Счетчик необработанных прерываний

 

FIXED_DATA ENDS

 

; IP IntSvcRtn - программа обслуживания прерываний

;

; WARNINGS (Предупреждения)

;

; NOTES (Примечания)

; Данная  программа ISR  увеличивает   счетчик  прерываний  и  заново

; маскирует устройство.

; Если предыдущее  значение  счетчика  было  равно 0, то записывается




- Начало -  - Назад -  - Вперед -