.LALL TITLE $EXVECTOR .386P INCLUDE VMM.INC INCLUDE EXVECTOR.INC ; the following equate makes the VXD dynamically loadable. %DEVICE_DYNAMIC EQU 1 DECLARE_VIRTUAL_DEVICE %DEVICE, 1, 0, <%DEVICE>_Control, Undefined_Device_Id, Vmm_init_order ; ; LData ; VxD_LOCKED_DATA_SEG Public bInitAlready bInitAlready DB 0 Public _pPrevHook1 _pPrevHook1 DD 0 Public _pPrevHook3 _pPrevHook3 DD 0 Public _pfnHandler _pfnHandler DD 0 Public _pProcessHandle _pProcessHandle DD 0 VxD_LOCKED_DATA_ENDS ; ; LCode ; VxD_LOCKED_CODE_SEG Begin_Control_Dispatch %DEVICE Control_Dispatch Sys_Dynamic_Device_Init, _C_Device_Init Control_Dispatch Sys_Dynamic_Device_Exit, _C_Device_Exit Control_Dispatch W32_DEVICEIOCONTROL, DriverIOControl, sCall, End_Control_Dispatch %DEVICE BeginProc _C_Device_Init IFDEF _STDCALL extern _DriverControl@4:NEAR ELSE extern _DriverControl:NEAR ENDIF mov al, bInitAlready cmp al, 0 ; Make sure we' haven't been called already. jnz Succeed_Init_Phase inc bInitAlready ; Set the "Called Already" Flag push 0 IFDEF _STDCALL call _DriverControl@4 ELSE call _DriverControl add esp,4 ENDIF cmp eax, 1 jz Fail_Init_Phase Succeed_Init_Phase: clc ret Fail_Init_Phase: stc ret EndProc _C_Device_Init BeginProc _C_Device_Exit IFDEF _STDCALL extern _DriverControl@4:NEAR ELSE extern _DriverControl:NEAR ENDIF push 1 IFDEF _STDCALL call _DriverControl@4 ELSE call _DriverControl add esp,4 ENDIF cmp eax, 1 jz Fail_Exit_Phase Succeed_Exit_Phase: clc ret Fail_Exit_Phase: stc ret EndProc _C_Device_Exit BeginProc _C_Handle_Trap_1, HOOK_PROC, _pPrevHook1, LOCKED extern _C_Trap_Exception_Handler:NEAR pushfd pushad cli cCall _C_Trap_Exception_Handler, sti cmp eax, 0 jnz Trap1_Handled ;Try the next handler cmp [_pPrevHook1], 0 jz Trap1_Handled ;Here we go popad popfd jmp [_pPrevHook1] Trap1_Handled: popad popfd ret EndProc _C_Handle_Trap_1 BeginProc _C_Handle_Trap_3, HOOK_PROC, _pPrevHook3, LOCKED extern _C_Trap_Exception_Handler:NEAR pushfd pushad cli cCall _C_Trap_Exception_Handler, sti cmp eax, 0 jnz Trap3_Handled ;Try the next handler cmp [_pPrevHook3], 0 jz Trap3_Handled ;Here we go popad popfd jmp [_pPrevHook3] Trap3_Handled: popad popfd ret EndProc _C_Handle_Trap_3 VxD_LOCKED_CODE_ENDS ; ; Not using IData or ICode ; ; ; Or RCode ; END