Source code of Windows XP (NT5)
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.

246 lines
5.4 KiB

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;
  3. ; VXD.ASM
  4. ;
  5. ; VXDCLNT - Sample Ring-0 HID device mapper for Memphis
  6. ;
  7. ; Copyright 1997 Microsoft Corp.
  8. ;
  9. ; (ep)
  10. ;
  11. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  12. .386p
  13. .xlist
  14. INCLUDE VMM.INC
  15. INCLUDE VMD.INC
  16. INCLUDE NTKERN.INC
  17. INCLUDE DEBUG.INC
  18. INCLUDE CONFIGMG.INC
  19. .list
  20. VXDCLNT_Dynamic equ 1
  21. Declare_Virtual_Device VXDCLNT, 1, 0, \
  22. VXDCLNT_Control, Undefined_Device_Id, Undefined_Init_Order
  23. VxD_Locked_Data_Seg
  24. current_msg db 0
  25. OurThreadHandle dd 0
  26. VxD_Locked_Data_Ends
  27. VxD_Locked_Code_Seg
  28. EXTRN _HandleShutdown:NEAR
  29. EXTRN _HandleNewDevice:NEAR
  30. EXTRN _ConnectNTDeviceDrivers@0:NEAR
  31. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  32. ;
  33. ; VXDCLNT_Control
  34. ;
  35. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  36. BeginProc VXDCLNT_Control, PUBLIC
  37. mov current_msg, al
  38. Control_Dispatch SYS_DYNAMIC_DEVICE_INIT, VXDCLNT_Initialize
  39. Control_Dispatch SYS_DYNAMIC_DEVICE_EXIT, VXDCLNT_Shutdown
  40. Control_Dispatch PNP_NEW_DEVNODE , VXDCLNT_NewDevNode
  41. ;
  42. ; Need to hook these messages in case SYS_DYNAMIC_DEVICE_INIT
  43. ; comes while Windows is booting.
  44. ;
  45. Control_Dispatch Kernel32_Initialized, VXDCLNT_Initialize
  46. Control_Dispatch Kernel32_Shutdown, VXDCLNT_Shutdown
  47. clc
  48. ret
  49. EndProc VXDCLNT_Control
  50. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  51. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  52. ;
  53. ; VXDCLNT_Initialize
  54. ;
  55. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  56. BeginProc VXDCLNT_Initialize
  57. EnterProc
  58. ;
  59. ; If Windows is still booting, wait for the Kernel to finish initializing.
  60. ; (Wait for the Kernel32_Initialized message)
  61. ;
  62. VMMCall VMM_GetSystemInitState
  63. cmp eax, SYSSTATE_KERNEL32INITED
  64. jb init_done
  65. ;
  66. ; If we are being dynaloaded as a result of a PnP event,
  67. ; we want to defer the open until appytime.
  68. ; If we are being loaded at boot time, then we open when we
  69. ; get the Kernel32_Initialized message.
  70. ;
  71. cmp current_msg, Kernel32_Initialized
  72. je open_now
  73. VxDCall _CONFIGMG_Call_At_Appy_Time,<VXDCLNT_Schedule_Open, 0, 0>
  74. jmp init_done
  75. open_now:
  76. call VXDCLNT_Schedule_Open
  77. init_done:
  78. clc
  79. LeaveProc
  80. return
  81. EndProc VXDCLNT_Initialize
  82. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  83. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  84. ;
  85. ; VXDCLNT_NewDevNode
  86. ;
  87. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  88. BeginProc VXDCLNT_NewDevNode
  89. EnterProc
  90. ;
  91. ; If system is fully booted, check to see if the new devnode
  92. ; is the result of another device being plugged in.
  93. ; (For the first device, we get a SYS_DYNAMIC_DEVICE_INIT msg,
  94. ; but for subsequent devices plugged in after boot time, this is
  95. ; the only message we get).
  96. ;
  97. VMMCall VMM_GetSystemInitState
  98. cmp eax, SYSSTATE_KERNEL32INITED
  99. jb new_devnode_done
  100. ;
  101. ; The system is initialized.
  102. ; Wait for appytime to check for new devices.
  103. ;
  104. VxDCall _CONFIGMG_Call_At_Appy_Time,<NewDevnode_Callback, 0, 0>
  105. new_devnode_done:
  106. clc
  107. LeaveProc
  108. return
  109. EndProc VXDCLNT_NewDevNode
  110. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  111. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  112. ;
  113. ; NewDevnode_Callback
  114. ;
  115. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  116. BeginProc NewDevnode_Callback
  117. ;
  118. ; It's appytime following a PNP_NEW_DEVNODE msg.
  119. ; Check for any new devices.
  120. ;
  121. call _HandleNewDevice
  122. clc
  123. ret
  124. EndProc NewDevnode_Callback
  125. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  126. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  127. ;
  128. ; VXDCLNT_Shutdown
  129. ;
  130. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  131. BeginProc VXDCLNT_Shutdown
  132. call _HandleShutdown
  133. clc
  134. ret
  135. EndProc VXDCLNT_Shutdown
  136. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  137. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  138. ;
  139. ; VXDCLNT_Schedule_Open
  140. ;
  141. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  142. BeginProc VXDCLNT_Schedule_Open
  143. push edi
  144. VxDCall _NTKERNGetWorkerThread,<0>
  145. mov edi, eax
  146. or eax, eax
  147. jnz @F
  148. VMMCall Get_Sys_VM_Handle
  149. VMMCall Get_Initial_Thread_Handle
  150. @@:
  151. mov [OurThreadHandle], edi
  152. sCall CallRestrictedEvent,<\
  153. OFFSET32 _ConnectNTDeviceDrivers@0, 0, \
  154. 0, edi>
  155. pop edi
  156. clc
  157. ret
  158. EndProc VXDCLNT_Schedule_Open
  159. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  160. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  161. ;
  162. ; CallRestrictedEvent
  163. ;
  164. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  165. BeginProc CallRestrictedEvent, SCALL, PUBLIC
  166. ArgVar Routine, DWORD
  167. ArgVar Context, DWORD
  168. ArgVar crFlags, DWORD
  169. ArgVar thisThreadHandle, DWORD
  170. EnterProc
  171. SaveReg <esi, edi, ebx>
  172. mov esi, Routine
  173. mov edx, Context
  174. xor eax, eax
  175. mov ecx, PEF_Wait_For_STI OR PEF_Thread_Event
  176. or ecx, crFlags
  177. mov ebx, thisThreadHandle
  178. test ebx, ebx
  179. jnz @F
  180. mov ebx, thisThreadHandle
  181. @@:
  182. VMMCall Call_Restricted_Event
  183. mov eax, esi
  184. RestoreReg <ebx, edi, esi>
  185. LeaveProc
  186. return
  187. EndProc CallRestrictedEvent
  188. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  189. VxD_Locked_Code_Ends
  190. end
  191.