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


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


; Соответствующий этому буферу FLAT-адрес flatpPathBuf dd 0

VxD_DATA_ENDS

; =================================================== ; Перемещаемый сегмент кода ; =================================================== VxD_CODE_SEG

; --------------------------------------------------- ; Вход API для виртуальных машин V86 ; --------------------------------------------------- BeginProc VXDSRV_V86API_Handler mov eax, 1 ; признак машины V86 mov V86CallFlag, eax

; Вызываем универсальное API драйвера call VXDSRV_API_Handler ret EndProc VXDSRV_V86API_Handler

; --------------------------------------------------- ; Вход API для виртуальных машин защищенного режима ; --------------------------------------------------- BeginProc VXDSRV_PMAPI_Handler mov eax, 0 ; признак защищенного режима mov V86CallFlag, eax

call VXDSRV_API_Handler ret EndProc VXDSRV_PMAPI_Handler

; --------------------------------------------------- ; Универсальное API драйвера, вызывается как для ; режима VM86, так и для защищенного режима ; --------------------------------------------------- BeginProc VXDSRV_API_Handler

; Загружаем номер функции API movzx eax, [ebp.Client_AX]

; Проверяем этот номер на допустимость cmp eax, VXDSRV_API_MaxCall jae short InvalidNumber

; В случае успеха сбрасываем флаг переноса и ; вызываем функцию по таблице адресов and [ebp.Client_EFlags], NOT CFlag call VXDSRV_API_Call[eax * 4] ret InvalidNumber: or [ebp.Client_EFlags], CFlag ret EndProc VXDSRV_API_Handler

; --------------------------------------------------- ; vxdapiGetVersion, номер = 0 ; Возвращает в AX номер версии: ; AH - старший номер, AL - младший номер ; --------------------------------------------------- BeginProc vxdapiGetVersion mov [ebp.Client_AX], Vers clc ; успешное завершение ret EndProc vxdapiGetVersion

; --------------------------------------------------- ; vxdapiRegisterWnd, номер = 1 ; --------------------------------------------------- BeginProc vxdapiRegisterWnd

; Можно вызывать только из защищенного режима mov eax, V86CallFlag cmp eax, 0 jnz short RW_CallFromRealMode




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



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