mirror of https://github.com/tongzx/nt5src
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.
247 lines
5.4 KiB
247 lines
5.4 KiB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;
|
|
; 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
|
|
|