windows-nt/Source/XPSP1/NT/drivers/wdm/input/samples/vxdclnt/vxd.asm

247 lines
5.4 KiB
NASM
Raw Normal View History

2020-09-26 03:20:57 -05:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; 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