Операционная система Microsoft Windows 3.1 для программиста. Дополнительные главы


Листинг 5.1. Файл vxdsrv\vxdsrv.asm - часть 6


; Определяем идентификатор системной VM VMMcall Get_Sys_VM_Handle

; Планируем вызов функции обратного вызова mov esi, offset32 CallbackProc VMMcall Schedule_VM_Event

popad

; Если запускается приложение Windows, блокируем ; выполнение прерывания INT 21h в виртуальной ; машине MS-DOS clc

ret

HandlerExit: popad

; Если запускается программа MS-DOS, наш драйвер ; не мешает этому процессу stc

ret EndProc V86_Int21_Handler

; --------------------------------------------------- ; CallbackProc ; Функция обратного вызова ; Вызывается в системной VM по запросу фильтра ; прерывания INT 21h, установленного нашим драйвером ; --------------------------------------------------- BeginProc CallbackProc

; Сохраняем состояние системной VM Push_Client_State

; Начинаем вложенное выполнение VMMcall Begin_Nest_Exec

; Записываем в стек системной VM параметр - ; версию нашего VxD-драйвера mov ax, Vers VMMcall Simulate_Push

; Вызов функции обратного вызова, определенной ; в DLL-библиотеке d2w.dll mov edx, [CallbackOff] mov cx, [CallbackSel] VMMcall Simulate_Far_Call

; Выполняем вызов и восстановление состояния ; системной VM VMMcall Resume_Exec VMMcall End_Nest_Exec Pop_Client_State

; Сбрасываем семафор, разрешая обработку ; следующего прерывания INT 21h mov eax, hSem VMMcall Signal_Semaphore

ret EndProc CallbackProc

; --------------------------------------------------- ; GetCurDir ; Определение текущего диска и текущего каталога ; в виртуальной машине MS-DOS, выполняющей запуск ; программы с помощью прерывания INT 21h ; --------------------------------------------------- BeginProc GetCurDir

pushad

; Сохраняем состояние VM MS-DOS Push_Client_State

VMMcall Begin_Nest_Exec

; Определяем номер текущего диска в VM MS-DOS ; Используем для этого функцию 1900h прерывания ; INT 21h. Номер диска возвращается в регистре AL mov ax, 1900h mov word ptr [ebp.Client_AX], ax mov eax, 21h VMMcall Exec_Int

; Сохраняем номер текущего диска в VM MS-DOS mov ax, word ptr [ebp.Client_AX] mov nCurDisk, al




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



Книжный магазин