windows-nt/Source/XPSP1/NT/drivers/wdm/input/samples/vxdclnt/vxd.asm
2020-09-26 16:20:57 +08:00

247 lines
5.4 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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