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
|
||
|