247 lines
5.4 KiB
NASM
247 lines
5.4 KiB
NASM
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
;
|
|||
|
; VXD.ASM
|
|||
|
;
|
|||
|
; VXDCLNT - Sample Ring-0 HID device mapper for Memphis
|
|||
|
;
|
|||
|
; Copyright 1997 Microsoft Corp.
|
|||
|
;
|
|||
|
; (ep)
|
|||
|
;
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
|
|||
|
.386p
|
|||
|
|
|||
|
.xlist
|
|||
|
INCLUDE VMM.INC
|
|||
|
INCLUDE VMD.INC
|
|||
|
INCLUDE NTKERN.INC
|
|||
|
INCLUDE DEBUG.INC
|
|||
|
INCLUDE CONFIGMG.INC
|
|||
|
.list
|
|||
|
|
|||
|
VXDCLNT_Dynamic equ 1
|
|||
|
|
|||
|
Declare_Virtual_Device VXDCLNT, 1, 0, \
|
|||
|
VXDCLNT_Control, Undefined_Device_Id, Undefined_Init_Order
|
|||
|
|
|||
|
|
|||
|
VxD_Locked_Data_Seg
|
|||
|
|
|||
|
current_msg db 0
|
|||
|
OurThreadHandle dd 0
|
|||
|
|
|||
|
VxD_Locked_Data_Ends
|
|||
|
|
|||
|
VxD_Locked_Code_Seg
|
|||
|
|
|||
|
EXTRN _HandleShutdown:NEAR
|
|||
|
EXTRN _HandleNewDevice:NEAR
|
|||
|
EXTRN _ConnectNTDeviceDrivers@0:NEAR
|
|||
|
|
|||
|
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
;
|
|||
|
; VXDCLNT_Control
|
|||
|
;
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
BeginProc VXDCLNT_Control, PUBLIC
|
|||
|
|
|||
|
mov current_msg, al
|
|||
|
|
|||
|
Control_Dispatch SYS_DYNAMIC_DEVICE_INIT, VXDCLNT_Initialize
|
|||
|
Control_Dispatch SYS_DYNAMIC_DEVICE_EXIT, VXDCLNT_Shutdown
|
|||
|
Control_Dispatch PNP_NEW_DEVNODE , VXDCLNT_NewDevNode
|
|||
|
|
|||
|
;
|
|||
|
; Need to hook these messages in case SYS_DYNAMIC_DEVICE_INIT
|
|||
|
; comes while Windows is booting.
|
|||
|
;
|
|||
|
Control_Dispatch Kernel32_Initialized, VXDCLNT_Initialize
|
|||
|
Control_Dispatch Kernel32_Shutdown, VXDCLNT_Shutdown
|
|||
|
|
|||
|
clc
|
|||
|
ret
|
|||
|
|
|||
|
EndProc VXDCLNT_Control
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
|
|||
|
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
;
|
|||
|
; VXDCLNT_Initialize
|
|||
|
;
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
BeginProc VXDCLNT_Initialize
|
|||
|
|
|||
|
EnterProc
|
|||
|
|
|||
|
;
|
|||
|
; If Windows is still booting, wait for the Kernel to finish initializing.
|
|||
|
; (Wait for the Kernel32_Initialized message)
|
|||
|
;
|
|||
|
VMMCall VMM_GetSystemInitState
|
|||
|
cmp eax, SYSSTATE_KERNEL32INITED
|
|||
|
jb init_done
|
|||
|
|
|||
|
;
|
|||
|
; If we are being dynaloaded as a result of a PnP event,
|
|||
|
; we want to defer the open until appytime.
|
|||
|
; If we are being loaded at boot time, then we open when we
|
|||
|
; get the Kernel32_Initialized message.
|
|||
|
;
|
|||
|
cmp current_msg, Kernel32_Initialized
|
|||
|
je open_now
|
|||
|
VxDCall _CONFIGMG_Call_At_Appy_Time,<VXDCLNT_Schedule_Open, 0, 0>
|
|||
|
jmp init_done
|
|||
|
open_now:
|
|||
|
call VXDCLNT_Schedule_Open
|
|||
|
|
|||
|
init_done:
|
|||
|
clc
|
|||
|
LeaveProc
|
|||
|
return
|
|||
|
|
|||
|
EndProc VXDCLNT_Initialize
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
;
|
|||
|
; VXDCLNT_NewDevNode
|
|||
|
;
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
BeginProc VXDCLNT_NewDevNode
|
|||
|
|
|||
|
EnterProc
|
|||
|
|
|||
|
;
|
|||
|
; If system is fully booted, check to see if the new devnode
|
|||
|
; is the result of another device being plugged in.
|
|||
|
; (For the first device, we get a SYS_DYNAMIC_DEVICE_INIT msg,
|
|||
|
; but for subsequent devices plugged in after boot time, this is
|
|||
|
; the only message we get).
|
|||
|
;
|
|||
|
VMMCall VMM_GetSystemInitState
|
|||
|
cmp eax, SYSSTATE_KERNEL32INITED
|
|||
|
jb new_devnode_done
|
|||
|
|
|||
|
;
|
|||
|
; The system is initialized.
|
|||
|
; Wait for appytime to check for new devices.
|
|||
|
;
|
|||
|
VxDCall _CONFIGMG_Call_At_Appy_Time,<NewDevnode_Callback, 0, 0>
|
|||
|
|
|||
|
new_devnode_done:
|
|||
|
clc
|
|||
|
LeaveProc
|
|||
|
return
|
|||
|
|
|||
|
EndProc VXDCLNT_NewDevNode
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
;
|
|||
|
; NewDevnode_Callback
|
|||
|
;
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
BeginProc NewDevnode_Callback
|
|||
|
;
|
|||
|
; It's appytime following a PNP_NEW_DEVNODE msg.
|
|||
|
; Check for any new devices.
|
|||
|
;
|
|||
|
call _HandleNewDevice
|
|||
|
clc
|
|||
|
ret
|
|||
|
EndProc NewDevnode_Callback
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
|
|||
|
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
;
|
|||
|
; VXDCLNT_Shutdown
|
|||
|
;
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
BeginProc VXDCLNT_Shutdown
|
|||
|
call _HandleShutdown
|
|||
|
clc
|
|||
|
ret
|
|||
|
EndProc VXDCLNT_Shutdown
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
;
|
|||
|
; VXDCLNT_Schedule_Open
|
|||
|
;
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
BeginProc VXDCLNT_Schedule_Open
|
|||
|
|
|||
|
push edi
|
|||
|
VxDCall _NTKERNGetWorkerThread,<0>
|
|||
|
mov edi, eax
|
|||
|
or eax, eax
|
|||
|
jnz @F
|
|||
|
VMMCall Get_Sys_VM_Handle
|
|||
|
VMMCall Get_Initial_Thread_Handle
|
|||
|
@@:
|
|||
|
mov [OurThreadHandle], edi
|
|||
|
sCall CallRestrictedEvent,<\
|
|||
|
OFFSET32 _ConnectNTDeviceDrivers@0, 0, \
|
|||
|
0, edi>
|
|||
|
pop edi
|
|||
|
clc
|
|||
|
ret
|
|||
|
|
|||
|
EndProc VXDCLNT_Schedule_Open
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
;
|
|||
|
; CallRestrictedEvent
|
|||
|
;
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
BeginProc CallRestrictedEvent, SCALL, PUBLIC
|
|||
|
|
|||
|
ArgVar Routine, DWORD
|
|||
|
ArgVar Context, DWORD
|
|||
|
ArgVar crFlags, DWORD
|
|||
|
ArgVar thisThreadHandle, DWORD
|
|||
|
|
|||
|
EnterProc
|
|||
|
|
|||
|
SaveReg <esi, edi, ebx>
|
|||
|
|
|||
|
mov esi, Routine
|
|||
|
mov edx, Context
|
|||
|
xor eax, eax
|
|||
|
mov ecx, PEF_Wait_For_STI OR PEF_Thread_Event
|
|||
|
or ecx, crFlags
|
|||
|
mov ebx, thisThreadHandle
|
|||
|
test ebx, ebx
|
|||
|
jnz @F
|
|||
|
mov ebx, thisThreadHandle
|
|||
|
@@:
|
|||
|
VMMCall Call_Restricted_Event
|
|||
|
|
|||
|
mov eax, esi
|
|||
|
|
|||
|
RestoreReg <ebx, edi, esi>
|
|||
|
LeaveProc
|
|||
|
return
|
|||
|
|
|||
|
EndProc CallRestrictedEvent
|
|||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
VxD_Locked_Code_Ends
|
|||
|
end
|
|||
|
|