You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
183 lines
2.8 KiB
183 lines
2.8 KiB
.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, <ecx, ebx, edx, esi>
|
|
|
|
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, <esi, ebp>
|
|
|
|
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, <esi, ebp>
|
|
|
|
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
|