vmm.inc
上传用户:xiaoan1112
上传日期:2013-04-11
资源大小:19621k
文件大小:60k
源码类别:

操作系统开发

开发平台:

Visual C++

  1. ;******************************************************************************
  2. ;
  3. ;   (C) Copyright MICROSOFT Corp., 1988-1990
  4. ;
  5. ;   Title: VMM.INC - Include file for Virtual Machine Manager
  6. ;
  7. ;   Version: 1.00
  8. ;
  9. ;   Date: 05-May-1988
  10. ;
  11. ;   Author: RAL
  12. ;
  13. ;------------------------------------------------------------------------------
  14. ;
  15. ;   Change log:
  16. ;
  17. ;      DATE REV     DESCRIPTION
  18. ;   ----------- --- -----------------------------------------------------------
  19. ;   05-May-1988 RAL Original
  20. ;
  21. ;==============================================================================
  22. ; NON Windows/386 Virtual Device sources can include this file to get some
  23. ; useful equates by declaring the symbol "Not_VxD"  If this symbol is defined,
  24. ; then everything that has to do with the specifics of the 32 bit environment
  25. ; for virtual devices is removed.  Useful equates include:  device ID's, pushad
  26. ; structure, BeginDoc/EndDoc/BeginMsg/EndMsg equates, page table equates, etc.
  27. False EQU 0
  28. True EQU NOT False
  29. ;
  30. ;   These null macros are recognized by a utility program that produces
  31. ;   documentation files.
  32. ;
  33. BeginDoc EQU <>
  34. EndDoc EQU <>
  35. BeginMsg EQU <>
  36. EndMsg EQU <>
  37. BeginDoc
  38. ;******************************************************************************
  39. ;
  40. ; EQUATES FOR REQUIRED DEVICES
  41. ;
  42. ;   Device ID formulation note:
  43. ;
  44. ; Device ID's are a combination of OEM # and device # in the form:
  45. ;
  46. ; xOOOOOOOOOODDDDD
  47. ;
  48. ; The high bit of the device ID is reserved for future use.  The next
  49. ; 10 bits are the OEM # which is assigned by Microsoft.  The last 5 bits
  50. ; are the device #.  This allows each OEM to create 32 unique devices.
  51. ; If an OEM is creating a replacement for a standard device, then it
  52. ; should re-use the standard ID listed below.  Microsoft reserves the
  53. ; first 16 OEM #'s (0 thru 0Fh)
  54. ;
  55. ;==============================================================================
  56. Undefined_Device_ID EQU 00000h
  57. VMM_Device_ID EQU 00001h ; Used for dynalink table
  58. Debug_Device_ID  EQU 00002h
  59. VPICD_Device_ID  EQU 00003h
  60. VDMAD_Device_ID  EQU 00004h
  61. VTD_Device_ID EQU 00005h
  62. V86MMGR_Device_ID EQU 00006h
  63. PageSwap_Device_ID EQU 00007h
  64. Parity_Device_ID EQU 00008h
  65. Reboot_Device_ID EQU 00009h
  66. VDD_Device_ID EQU 0000Ah
  67. VSD_Device_ID EQU 0000Bh
  68. VMD_Device_ID EQU 0000Ch
  69. VKD_Device_ID EQU 0000Dh
  70. VCD_Device_ID EQU 0000Eh
  71. VPD_Device_ID EQU 0000Fh
  72. VHD_Device_ID EQU 00010h
  73. VMCPD_Device_ID  EQU 00011h
  74. EBIOS_Device_ID  EQU 00012h
  75. BIOSXlat_Device_ID EQU 00013h
  76. VNETBIOS_Device_ID EQU 00014h
  77. DOSMGR_Device_ID EQU 00015h
  78. WINLOAD_Device_ID EQU 00016h
  79. SHELL_Device_ID  EQU 00017h
  80. VMPoll_Device_ID EQU 00018h
  81. VPROD_Device_ID  EQU 00019h
  82. DOSNET_Device_ID EQU 0001Ah
  83. VFD_Device_ID EQU 0001Bh
  84. VDD2_Device_ID EQU 0001Ch ; Secondary display adapter
  85. WINDEBUG_Device_ID EQU 0001Dh
  86. TSRLoad_Device_ID EQU 0001Eh ; TSR instance utility ID
  87. ;
  88. ;   Initialization order equates.  Devices are initialized in order from
  89. ;   LOWEST to HIGHEST. If 2 or more devices have the same initialization
  90. ;   order value, then they are initialized in order of occurance, so a
  91. ;   specific order is not guaranteed.  Holes have been left to allow maximum
  92. ;   flexibility in ordering devices.
  93. ;
  94. VMM_Init_Order EQU 000000000h
  95. Debug_Init_Order EQU 004000000h
  96. VPROD_Init_Order EQU 008000000h
  97. VPICD_Init_Order EQU 00C000000h
  98. VTD_Init_Order EQU 014000000h
  99. PageSwap_Init_Order EQU 01C000000h
  100. Parity_Init_Order EQU 020000000h
  101. Reboot_Init_Order EQU 024000000h
  102. EBIOS_Init_Order EQU 026000000h
  103. VDD_Init_Order EQU 028000000h
  104. VSD_Init_Order EQU 02C000000h
  105. VCD_Init_Order EQU 030000000h
  106. VMD_Init_Order EQU 034000000h
  107. VKD_Init_Order EQU 038000000h
  108. VPD_Init_Order EQU 03C000000h
  109. VHD_Init_Order EQU 040000000h
  110. VFD_Init_Order EQU 044000000h
  111. VMCPD_Init_Order EQU 048000000h
  112. BIOSXlat_Init_Order EQU 050000000h
  113. VNETBIOS_Init_Order EQU 054000000h
  114. DOSMGR_Init_Order EQU 058000000h
  115. DOSNET_Init_Order EQU 05C000000h
  116. WINLOAD_Init_Order EQU 060000000h
  117. VMPoll_Init_Order EQU 064000000h
  118. Undefined_Init_Order EQU 080000000h
  119. WINDEBUG_Init_Order EQU 081000000h
  120. VDMAD_Init_Order EQU 090000000h
  121. V86MMGR_Init_Order EQU 0A0000000h
  122. SHELL_Init_Order EQU 0B0000000h
  123. EndDoc
  124. ;******************************************************************************
  125. ;
  126. ;   Macro to cause a delay in between I/O accesses to the same device.
  127. ;
  128. ;------------------------------------------------------------------------------
  129. IO_Delay    macro
  130. jmp $+2
  131. ENDM
  132. Pushad_Struc STRUC
  133. Pushad_EDI dd ? ; Client's EDI
  134. Pushad_ESI dd ? ; Client's ESI
  135. Pushad_EBP dd ? ; Client's EBP
  136. Pushad_ESP dd ? ; ESP at pushall
  137. Pushad_EBX dd ? ; Client's EBX
  138. Pushad_EDX dd ? ; Client's EDX
  139. Pushad_ECX dd ? ; Client's ECX
  140. Pushad_EAX dd ? ; Client's EAX
  141. Pushad_Struc ENDS
  142. IFNDEF Not_VxD
  143. ??_CUR_CODE_SEG = 0
  144. ??_CODE  = 1
  145. ??_ICODE = 2
  146. ??_LCODE = 3
  147. ??_RCODE = 4
  148. ?_CODE equ <(??_CUR_CODE_SEG MOD 8) - ??_CODE>
  149. ?_ICODE equ <(??_CUR_CODE_SEG MOD 8) - ??_ICODE>
  150. ?_LCODE equ <(??_CUR_CODE_SEG MOD 8) - ??_LCODE>
  151. ?_RCODE equ <(??_CUR_CODE_SEG MOD 8) - ??_RCODE>
  152. ;
  153. ;  SEGMENT definitions and order
  154. ;
  155. ;* 32 Bit locked code
  156. _LTEXT SEGMENT DWORD USE32 PUBLIC 'CODE'
  157. _LTEXT ENDS
  158. ;* 32 Bit code
  159. _TEXT SEGMENT DWORD USE32 PUBLIC 'PCODE'
  160. _TEXT ENDS
  161. ;* 32 Bit initialization code
  162. _ITEXT SEGMENT DWORD USE32 PUBLIC 'ICODE'
  163. _ITEXT ENDS
  164. ;* Contains 32 Bit locked data
  165. _LDATA SEGMENT DWORD PUBLIC 'CODE'
  166. _LDATA ENDS
  167. ;* Contains 32 Bit data
  168. _DATA SEGMENT DWORD PUBLIC 'PCODE'
  169. _DATA ENDS
  170. ;* Contains 32 Bit initialization data
  171. _IDATA SEGMENT DWORD PUBLIC 'ICODE'
  172. _IDATA ENDS
  173. ;* Real Mode initialization code/data for devices
  174. _RCODE SEGMENT WORD USE16 PUBLIC 'RCODE'
  175. _RCODE ENDS
  176. _LGROUP GROUP _LTEXT, _LDATA
  177. _PGROUP GROUP _TEXT, _DATA
  178. _IGROUP GROUP _ITEXT, _IDATA
  179. ASSUME CS:FLAT, DS:FLAT, ES:FLAT, SS:FLAT
  180. OFFSET32 EQU <OFFSET FLAT:>
  181. BeginDoc
  182. ;==============================================================================
  183. ; The following macros are used in defining the routines
  184. ;   in a VxD which are going to be registered with VMM as callable entry
  185. ;   points. Once registered, the entry points can be called by any other
  186. ;   devices via the "VxDCall" macro, defined below. In the comments below,
  187. ;   replace "VxD" with the appropriate device name.
  188. ;
  189. ;*******
  190. ;   In the VxD.INC file, put the following lines, replacing <function_name>
  191. ; with an appropriate name describing the function of the routine.
  192. ;
  193. ; Begin_Service_Table VxD[,<segname>]
  194. ; VxD_Service <function_name>[,<local segname>]
  195. ; VxD_Service <function_name>[,<local segname>]
  196. ; . . .
  197. ; VxD_Service <function_name>[,<local segname>]
  198. ; End_Service_Table   VxD[,<segname>]
  199. ;
  200. ;   Note that <segname> is an optional argument and, if specified, the
  201. ; table is put in the segment defined by the macro "yyy_Data_Seg",
  202. ; where yyy=segname. Otherwise the segment is defined by the
  203. ; "VxD_Data_Seg" macro, defined below.
  204. ;   Note that <local segname> is an optional argument and, if specified,
  205. ; the procedure's segment is defined by the macro "zzz_Code_Seg",
  206. ; where zzz=segname. Otherwise the segment is defined by the
  207. ; "VxD_Code_Seg" macro, defined below.
  208. ;
  209. ;*******
  210. ; One VxD module should have the following in order to define the entry points:
  211. ;Create_VxD_Service_Table = 1 ; Only in module where table is
  212. ; INCLUDE     VxD.INC ; Include the table definition
  213. ;
  214. ;*******
  215. ; All modules that want to call the services defined in the table should include
  216. ;   VxD.INC, but not define the label "Create_VxD_Service_Table". This
  217. ;   will define the service names to be used with the VxDCall macro.
  218. ;
  219. EndDoc
  220. Begin_Service_Table MACRO Device_Name, Def_Segment
  221. IFB <Def_Segment>
  222. BST2 Device_Name, VxD
  223. ELSE
  224. BST2 Device_Name, Def_Segment
  225. ENDIF
  226. ENDM
  227. BST2 MACRO Device_Name, Def_Segment
  228. Num_&Device_Name&_Services = 0
  229. IFDEF Create_&Device_Name&_Service_Table
  230. Def_Segment&_LOCKED_DATA_SEG
  231. Device_Name&_Service_Table LABEL DWORD
  232. Device_Name&_Service MACRO Procedure, Local_Seg
  233.     PUBLIC $&&Procedure
  234.     IF1
  235.     $&&Procedure LABEL DWORD
  236.     ENDIF
  237.     IFDIFI <Local_Seg>, <LOCAL>
  238. IFNB <Local_Seg>
  239. Local_Seg&&_SEG
  240. ELSE
  241. Def_Segment&_CODE_SEG
  242. ENDIF
  243. EXTRN @&&Procedure:NEAR
  244. IFNB <Local_Seg>
  245. Local_Seg&&_ENDS
  246. ELSE
  247. Def_Segment&_CODE_ENDS
  248. ENDIF
  249.     ENDIF
  250. dd OFFSET32 @&&Procedure
  251. Procedure = (Device_Name&_Device_ID SHL 16) + Num_&Device_Name&_Services
  252. Num_&Device_Name&_Services = Num_&Device_Name&_Services + 1
  253. ENDM
  254. ELSE
  255. Device_Name&_Service MACRO Procedure
  256. Procedure = (Device_Name&_Device_ID SHL 16) + Num_&Device_Name&_Services
  257. Num_&Device_Name&_Services = Num_&Device_Name&_Services + 1
  258. ENDM
  259. ENDIF
  260. ENDM
  261. ;------------------------------------------------------------------------------
  262. End_Service_Table MACRO Device_Name, Def_Segment
  263. PURGE Device_Name&_Service
  264. IFDEF Create_&Device_Name&_Service_Table
  265. IFB <Def_Segment>
  266. VxD_LOCKED_DATA_ENDS
  267. ELSE
  268. Def_Segment&_LOCKED_DATA_ENDS
  269. ENDIF
  270. ENDIF
  271. ENDM
  272. ;******************************************************************************
  273. ;
  274. ;   Dword_Align -- Aligns code to dword boundry by inserting nops
  275. ;
  276. ;------------------------------------------------------------------------------
  277. Dword_Align MACRO Seg_Name
  278. LOCAL segn
  279. IFNB <Seg_Name>
  280. segn equ Seg_Name
  281. ELSE
  282. IFE ?_CODE
  283. segn equ <_TEXT>
  284. ELSE
  285. IFE ?_ICODE
  286. segn equ <_ITEXT>
  287. ELSE
  288. IFE ?_LCODE
  289. segn equ <_LTEXT>
  290. ELSE
  291. .err Dword_Align not supported
  292. ENDIF
  293. ENDIF
  294. ENDIF
  295. ENDIF
  296. IF (($-OFFSET segn:0) MOD 4)
  297. db 4 - (($-OFFSET segn:0) MOD 4) DUP (90h)
  298. ENDIF
  299.     ENDM
  300. BeginDoc
  301. ;******************************************************************************
  302. ;
  303. ;   Fatal_Error
  304. ;
  305. ;   DESCRIPTION:
  306. ; This macro is used to crash Windows/386 when an unrecoverable error
  307. ; is detected.  If Msg_Ptr is ommitted then no error message will be
  308. ; displayed, otherwise Msg_Ptr is the address
  309. ; when the
  310. ;
  311. ;   PARAMETERS:
  312. ; Msg_Ptr (OPTIONAL) - Points to an ASCIIZ string to display.
  313. ;
  314. ;   EXIT:
  315. ; To DOS (hopefully).  This macro never returns.
  316. ;
  317. ;==============================================================================
  318. EndDoc
  319. Fatal_Error MACRO Msg_Ptr, Exit_Flags
  320. pushad
  321. IFB <Msg_Ptr>
  322. xor esi, esi
  323. ELSE
  324. mov esi, Msg_Ptr
  325. IFB <Exit_Flags>
  326. xor eax, eax
  327. ELSE
  328. mov eax, Exit_Flags
  329. ENDIF
  330. ENDIF
  331. VMMcall Fatal_Error_Handler
  332. ENDM
  333. EF_Hang_On_Exit     EQU     1h
  334. ;******************************************************************************
  335. ;==============================================================================
  336. ;------------------------------------------------------------------------------
  337. BeginDoc
  338. ;******************************************************************************
  339. ;   The following are control block offsets of items that can be of interest
  340. ; to VxDs.
  341. ;*******
  342. ; VM status indicates globally interesting VM states
  343. CB_VM_Status EQU DWORD PTR 00h
  344. VMStat_Exclusive EQU 000000000000000000001b ; VM is exclusive mode
  345. VMStat_Exclusive_Bit EQU 0
  346. VMStat_Background EQU 000000000000000000010b ; VM runs in background
  347. VMStat_Background_Bit EQU 1
  348. VMStat_Creating  EQU 000000000000000000100b ; In process of creating
  349. VMStat_Creating_Bit EQU 2
  350. VMStat_Suspended EQU 000000000000000001000b ; VM not scheduled
  351. VMStat_Suspended_Bit EQU 3
  352. VMStat_Not_Executeable EQU 000000000000000010000b ; VM partially destroyed
  353. VMStat_Not_Executeable_Bit  EQU 4
  354. VMStat_PM_Exec EQU 000000000000000100000b ; Currently in PM app
  355. VMStat_PM_Exec_Bit EQU 5
  356. VMStat_PM_App EQU 000000000000001000000b ; PM app present in VM
  357. VMStat_PM_App_Bit EQU 6
  358. VMStat_PM_Use32  EQU 000000000000010000000b ; PM app is 32-bit
  359. VMStat_PM_Use32_Bit EQU 7
  360. VMStat_VxD_Exec  EQU 000000000000100000000b ; Call from VxD
  361. VMStat_VxD_Exec_Bit EQU 8
  362. VMStat_High_Pri_Back EQU 000000000001000000000b ; High pri background
  363. VMStat_High_Pri_Back_Bit    EQU 9
  364. VMStat_Blocked EQU 000000000010000000000b ; Blocked on semaphore
  365. VMStat_Blocked_Bit EQU 0Ah
  366. VMStat_Awakening EQU 000000000100000000000b ; Woke up after blocked
  367. VMStat_Awakening_Bit EQU 0Bh
  368. VMStat_PageableV86 EQU 000000001000000000000b ; part of V86 is pageable (PM app)
  369. VMStat_PageableV86Bit EQU 0Ch
  370. VMStat_V86IntsLocked EQU 000000010000000000000b ; Rest of V86 is locked
  371. VMStat_V86IntsLockedBit EQU 0Dh ;  regardless of pager type
  372. VMStat_TS_Sched  EQU 000000100000000000000b ; Scheduled by time-slicer
  373. VMStat_TS_Sched_Bit EQU 0Eh
  374. VMStat_Idle EQU 000001000000000000000b ; VM has released time
  375. VMStat_Idle_Bit  EQU 0Fh ; slice
  376. VMStat_Use32_Mask EQU VMStat_PM_Use32 OR VMStat_VxD_Exec
  377. ;*******
  378. ; Add this value to a V86 linear address to get address of VM's memory in
  379. ; the VMM linear address space
  380. CB_High_Linear EQU DWORD PTR 04h
  381. ;*******
  382. CB_Client_Pointer EQU DWORD PTR 08h
  383. CB_VMID  EQU DWORD PTR 0Ch
  384. ;
  385. ;   Equates for protected mode application control blocks
  386. ;
  387. PMCB_Flags EQU DWORD PTR 00h
  388. PMCB_Parent EQU DWORD PTR 04h
  389. EndDoc
  390. ;******************************************************************************
  391. ;     V M M   S E R V I C E S
  392. ;******************************************************************************
  393. Begin_Service_Table VMM, VMM
  394. VMM_Service Get_VMM_Version, LOCAL ; MUST REMAIN SERVICE 0!
  395. VMM_Service Get_Cur_VM_Handle
  396. VMM_Service Test_Cur_VM_Handle
  397. VMM_Service Get_Sys_VM_Handle
  398. VMM_Service Test_Sys_VM_Handle
  399. VMM_Service Validate_VM_Handle
  400. VMM_Service Get_VMM_Reenter_Count, LOCAL
  401. VMM_Service Begin_Reentrant_Execution, LOCAL
  402. VMM_Service End_Reentrant_Execution, LOCAL
  403. VMM_Service Install_V86_Break_Point
  404. VMM_Service Remove_V86_Break_Point
  405. VMM_Service Allocate_V86_Call_Back
  406. VMM_Service Allocate_PM_Call_Back
  407. VMM_Service Call_When_VM_Returns
  408. VMM_Service Schedule_Global_Event
  409. VMM_Service Schedule_VM_Event
  410. VMM_Service Call_Global_Event
  411. VMM_Service Call_VM_Event
  412. VMM_Service Cancel_Global_Event
  413. VMM_Service Cancel_VM_Event
  414. VMM_Service Call_Priority_VM_Event
  415. VMM_Service Cancel_Priority_VM_Event
  416. VMM_Service Get_NMI_Handler_Addr, LOCAL
  417. VMM_Service Set_NMI_Handler_Addr, LOCAL
  418. VMM_Service Hook_NMI_Event
  419. VMM_Service Call_When_VM_Ints_Enabled
  420. VMM_Service Enable_VM_Ints
  421. VMM_Service Disable_VM_Ints
  422. VMM_Service Map_Flat
  423. VMM_Service Map_Lin_To_VM_Addr
  424. ;
  425. ;   Scheduler services
  426. ;
  427. VMM_Service Adjust_Exec_Priority
  428. VMM_Service Begin_Critical_Section
  429. VMM_Service End_Critical_Section
  430. VMM_Service End_Crit_And_Suspend
  431. VMM_Service Claim_Critical_Section
  432. VMM_Service Release_Critical_Section
  433. VMM_Service Call_When_Not_Critical
  434. VMM_Service Create_Semaphore
  435. VMM_Service Destroy_Semaphore
  436. VMM_Service Wait_Semaphore
  437. VMM_Service Signal_Semaphore
  438. VMM_Service Get_Crit_Section_Status
  439. VMM_Service Call_When_Task_Switched
  440. VMM_Service Suspend_VM
  441. VMM_Service Resume_VM
  442. VMM_Service No_Fail_Resume_VM
  443. VMM_Service Nuke_VM
  444. VMM_Service Crash_Cur_VM
  445. VMM_Service Get_Execution_Focus
  446. VMM_Service Set_Execution_Focus
  447. VMM_Service Get_Time_Slice_Priority
  448. VMM_Service Set_Time_Slice_Priority
  449. VMM_Service Get_Time_Slice_Granularity
  450. VMM_Service Set_Time_Slice_Granularity
  451. VMM_Service Get_Time_Slice_Info
  452. VMM_Service Adjust_Execution_Time
  453. VMM_Service Release_Time_Slice
  454. VMM_Service Wake_Up_VM
  455. VMM_Service Call_When_Idle
  456. VMM_Service Get_Next_VM_Handle
  457. ;
  458. ;   Time-out and system timer services
  459. ;
  460. VMM_Service Set_Global_Time_Out
  461. VMM_Service Set_VM_Time_Out
  462. VMM_Service Cancel_Time_Out
  463. VMM_Service Get_System_Time
  464. VMM_Service Get_VM_Exec_Time
  465. VMM_Service Hook_V86_Int_Chain
  466. VMM_Service Get_V86_Int_Vector
  467. VMM_Service Set_V86_Int_Vector
  468. VMM_Service Get_PM_Int_Vector
  469. VMM_Service Set_PM_Int_Vector
  470. VMM_Service Simulate_Int
  471. VMM_Service Simulate_Iret
  472. VMM_Service Simulate_Far_Call
  473. VMM_Service Simulate_Far_Jmp
  474. VMM_Service Simulate_Far_Ret
  475. VMM_Service Simulate_Far_Ret_N
  476. VMM_Service Build_Int_Stack_Frame
  477. VMM_Service Simulate_Push
  478. VMM_Service Simulate_Pop
  479. ;
  480. ; Heap Manager
  481. ;
  482. VMM_Service _HeapAllocate
  483. VMM_Service _HeapReAllocate
  484. VMM_Service _HeapFree
  485. VMM_Service _HeapGetSize
  486. ; ---------------------------------------------------
  487. ;
  488. ;  Flags for heap allocator calls
  489. ;
  490. ; ---------------------------------------------------
  491. HeapZeroInit equ 00000000000000000000000000000001B
  492. HeapZeroReInit equ 00000000000000000000000000000010B
  493. HeapNoCopy equ 00000000000000000000000000000100B
  494. ; NOTE: HIGH 8 BITS (bits 24-31) are reserved
  495. ;
  496. ; Page Manager
  497. ;
  498. VMM_Service _PageAllocate
  499. VMM_Service _PageReAllocate
  500. VMM_Service _PageFree
  501. VMM_Service _PageLock
  502. VMM_Service _PageUnLock
  503. VMM_Service _PageGetSizeAddr
  504. VMM_Service _PageGetAllocInfo
  505. VMM_Service _GetFreePageCount
  506. VMM_Service _GetSysPageCount
  507. VMM_Service _GetVMPgCount
  508. VMM_Service _MapIntoV86
  509. VMM_Service _PhysIntoV86
  510. VMM_Service _TestGlobalV86Mem
  511. VMM_Service _ModifyPageBits
  512. VMM_Service _CopyPageTable
  513. VMM_Service _LinMapIntoV86
  514. VMM_Service _LinPageLock
  515. VMM_Service _LinPageUnLock
  516. VMM_Service _SetResetV86Pageable
  517. VMM_Service _GetV86PageableArray
  518. VMM_Service _PageCheckLinRange
  519. VMM_Service _PageOutDirtyPages
  520. VMM_Service _PageDiscardPages
  521. ; ---------------------------------------------------
  522. ;
  523. ;  Flags for other page allocator calls
  524. ;
  525. ; ---------------------------------------------------
  526. PageZeroInit equ 00000000000000000000000000000001B
  527. PageUseAlign equ 00000000000000000000000000000010B
  528. PageContig equ 00000000000000000000000000000100B
  529. PageFixed equ 00000000000000000000000000001000B
  530. PageDEBUGNulFault equ 00000000000000000000000000010000B
  531. PageZeroReInit equ 00000000000000000000000000100000B
  532. PageNoCopy equ 00000000000000000000000001000000B
  533. PageLocked equ 00000000000000000000000010000000B
  534. PageLockedIfDP equ 00000000000000000000000100000000B
  535. PageSetV86Pageable equ 00000000000000000000001000000000B
  536. PageClearV86Pageable equ 00000000000000000000010000000000B
  537. PageSetV86IntsLocked equ 00000000000000000000100000000000B
  538. PageClearV86IntsLocked equ 00000000000000000001000000000000B
  539. PageMarkPageOut  equ 00000000000000000010000000000000B
  540. PagePDPSetBase equ 00000000000000000100000000000000B
  541. PagePDPClearBase equ 00000000000000001000000000000000B
  542. PageDiscard equ 00000000000000010000000000000000B
  543. PagePDPQueryDirty equ 00000000000000100000000000000000B
  544. ; NOTE: HIGH 8 BITS (bits 24-31) are reserved
  545. ;
  546. ; Informational services
  547. ;
  548. VMM_Service _GetNulPageHandle
  549. VMM_Service _GetFirstV86Page
  550. VMM_Service _MapPhysToLinear
  551. VMM_Service _GetAppFlatDSAlias
  552. VMM_Service _SelectorMapFlat
  553. VMM_Service _GetDemandPageInfo
  554. ;
  555. ; Data structure for _GetDemandPageInfo
  556. ;
  557. DemandInfoStruc struc
  558. DILin_Total_Count     dd       ?       ; # pages in linear address space
  559. DIPhys_Count       dd       ?       ; Count of phys pages
  560. DIFree_Count       dd       ?       ; Count of free phys pages
  561. DIUnlock_Count       dd       ?       ; Count of unlocked Phys Pages
  562. DILinear_Base_Addr    dd       ?       ; Base of pageable address space
  563. DILin_Total_Free      dd       ?       ; Total Count of free linear pages
  564. DIReserved       dd      10 dup (?)      ; Resvd for expansion
  565. DemandInfoStruc ends
  566. VMM_Service _GetSetPageOutCount
  567. ;
  568. ; Flags bits for _GetSetPageOutCount
  569. ;
  570. GSPOC_F_Get equ 00000000000000000000000000000001B
  571. ;
  572. ; Device VM page manager
  573. ;
  574. VMM_Service Hook_V86_Page
  575. VMM_Service _Assign_Device_V86_Pages
  576. VMM_Service _DeAssign_Device_V86_Pages
  577. VMM_Service _Get_Device_V86_Pages_Array
  578. VMM_Service MMGR_SetNULPageAddr
  579. ;
  580. ; GDT/LDT management
  581. ;
  582. VMM_Service _Allocate_GDT_Selector
  583. VMM_Service _Free_GDT_Selector
  584. VMM_Service _Allocate_LDT_Selector
  585. VMM_Service _Free_LDT_Selector
  586. VMM_Service _BuildDescriptorDWORDs
  587. ;
  588. ; Flag equates for _BuildDescriptorDWORDs
  589. ;
  590. BDDExplicitDPL EQU 00000000000000000000000000000001B
  591. ;
  592. ; Flag equates for _Allocate_LDT_Selector
  593. ;
  594. ALDTSpecSel EQU 00000000000000000000000000000001B
  595. VMM_Service _GetDescriptor
  596. VMM_Service _SetDescriptor
  597. VMM_Service _MMGR_Toggle_HMA
  598. ;
  599. ; Flag equates for _MMGR_Toggle_HMA
  600. ;
  601. MMGRHMAPhysical EQU 00000000000000000000000000000001B
  602. MMGRHMAEnable EQU 00000000000000000000000000000010B
  603. MMGRHMADisable EQU 00000000000000000000000000000100B
  604. MMGRHMAQuery EQU 00000000000000000000000000001000B
  605. VMM_Service Get_Fault_Hook_Addrs, LOCAL
  606. VMM_Service Hook_V86_Fault, LOCAL
  607. VMM_Service Hook_PM_Fault, LOCAL
  608. VMM_Service Hook_VMM_Fault, LOCAL
  609. VMM_Service Begin_Nest_V86_Exec
  610. VMM_Service Begin_Nest_Exec
  611. VMM_Service Exec_Int
  612. VMM_Service Resume_Exec
  613. VMM_Service End_Nest_Exec
  614. VMM_Service Allocate_PM_App_CB_Area, VMM_ICODE
  615. VMM_Service Get_Cur_PM_App_CB
  616. VMM_Service Set_V86_Exec_Mode
  617. VMM_Service Set_PM_Exec_Mode
  618. VMM_Service Begin_Use_Locked_PM_Stack
  619. VMM_Service End_Use_Locked_PM_Stack
  620. VMM_Service Save_Client_State
  621. VMM_Service Restore_Client_State
  622. VMM_Service Exec_VxD_Int
  623. VMM_Service Hook_Device_Service, LOCAL
  624. VMM_Service Hook_Device_V86_API
  625. VMM_Service Hook_Device_PM_API
  626. VMM_Service System_Control
  627. ;
  628. ;   I/O and software interrupt hooks
  629. ;
  630. VMM_Service Simulate_IO
  631. VMM_Service Install_Mult_IO_Handlers
  632. VMM_Service Install_IO_Handler
  633. VMM_Service Enable_Global_Trapping
  634. VMM_Service Enable_Local_Trapping
  635. VMM_Service Disable_Global_Trapping
  636. VMM_Service Disable_Local_Trapping
  637. ;
  638. ;   Linked List Abstract Data Type Services
  639. ;
  640. VMM_Service List_Create
  641. VMM_Service List_Destroy
  642. VMM_Service List_Allocate
  643. VMM_Service List_Attach
  644. VMM_Service List_Attach_Tail
  645. VMM_Service List_Insert
  646. VMM_Service List_Remove
  647. VMM_Service List_Deallocate
  648. VMM_Service List_Get_First
  649. VMM_Service List_Get_Next
  650. VMM_Service List_Remove_First
  651. ;
  652. ;   Flags used by List_Create
  653. ;
  654. LF_Async EQU 00000001b
  655. LF_Async_Bit EQU 0
  656. LF_Use_Heap EQU 00000010b
  657. LF_Use_Heap_Bit  EQU 1
  658. LF_Alloc_Error EQU 00000100b
  659. LF_Alloc_Error_Bit EQU 2
  660. ;==============================================================================
  661. ; I N I T I A L I Z A T I O N   P R O C E D U R E S
  662. ;------------------------------------------------------------------------------
  663. ;
  664. ; Instance data manager
  665. ;
  666. VMM_Service _AddInstanceItem
  667. ;
  668. ; Data structure for _AddInstanceItem
  669. ;
  670. InstDataStruc struc
  671. InstLinkF       dd       0       ; RESERVED SET TO 0
  672. InstLinkB       dd       0       ; RESERVED SET TO 0
  673. InstLinAddr       dd       ?       ; Linear address of start of block
  674. InstSize       dd       ?       ; Size of block in bytes
  675. InstType       dd       ?       ; Type of block
  676. InstDataStruc ends
  677. ;
  678. ; Values for InstType
  679. ;
  680. INDOS_Field equ 100h ; Bit indicating INDOS switch requirements
  681. ALWAYS_Field equ 200h ; Bit indicating ALWAYS switch requirements
  682. ;
  683. ; System structure data manager
  684. ;
  685. VMM_Service _Allocate_Device_CB_Area, VMM_ICODE
  686. VMM_Service _Allocate_Global_V86_Data_Area, VMM_ICODE
  687. VMM_Service _Allocate_Temp_V86_Data_Area, VMM_ICODE
  688. VMM_Service _Free_Temp_V86_Data_Area, VMM_ICODE
  689. ;
  690. ; Flag bits for _Allocate_Global_VM_Data_Area
  691. ;
  692. GVDAWordAlign EQU 00000000000000000000000000000001B
  693. GVDADWordAlign EQU 00000000000000000000000000000010B
  694. GVDAParaAlign EQU 00000000000000000000000000000100B
  695. GVDAPageAlign EQU 00000000000000000000000000001000B
  696. GVDAInstance EQU 00000000000000000000000100000000B
  697. GVDAZeroInit EQU 00000000000000000000001000000000B
  698. GVDAReclaim EQU 00000000000000000000010000000000B
  699. ;
  700. ; Initialization information calls (win.ini and environment parameters)
  701. ;
  702. VMM_Service Get_Profile_Decimal_Int, VMM_ICODE
  703. VMM_Service Convert_Decimal_String, VMM_ICODE
  704. VMM_Service Get_Profile_Fixed_Point, VMM_ICODE
  705. VMM_Service Convert_Fixed_Point_String, VMM_ICODE
  706. VMM_Service Get_Profile_Hex_Int, VMM_ICODE
  707. VMM_Service Convert_Hex_String, VMM_ICODE
  708. VMM_Service Get_Profile_Boolean, VMM_ICODE
  709. VMM_Service Convert_Boolean_String, VMM_ICODE
  710. VMM_Service Get_Profile_String, VMM_ICODE
  711. VMM_Service Get_Next_Profile_String, VMM_ICODE
  712. VMM_Service Get_Environment_String, VMM_ICODE
  713. VMM_Service Get_Exec_Path, VMM_ICODE
  714. VMM_Service Get_Config_Directory, VMM_ICODE
  715. VMM_Service OpenFile, VMM_ICODE
  716. VMM_Service Get_PSP_Segment, VMM_ICODE
  717. VMM_Service GetDOSVectors, VMM_ICODE
  718. VMM_Service Get_Machine_Info
  719. GMIF_80486 EQU 00010000h
  720. GMIF_80486_Bit EQU 10h
  721. GMIF_PCXT EQU 00020000h
  722. GMIF_PCXT_Bit EQU 11h
  723. GMIF_MCA EQU 00040000h
  724. GMIF_MCA_Bit EQU 12h
  725. GMIF_EISA EQU 00080000h
  726. GMIF_EISA_Bit EQU 13h
  727. ;
  728. ; Following service is not restricted to initialization
  729. ;
  730. VMM_Service GetSet_HMA_Info
  731. VMM_Service Set_System_Exit_Code
  732. VMM_Service Fatal_Error_Handler
  733. VMM_Service Fatal_Memory_Error
  734. ;
  735. ;   Called by VTD only
  736. ;
  737. VMM_Service Update_System_Clock
  738. ;==============================================================================
  739. ;     D E B U G G I N G E X T E R N S
  740. ;==============================================================================
  741. VMM_Service Test_Debug_Installed ; Valid call in retail also
  742. VMM_Service Out_Debug_String ; Valid in DEBLEVEL=1
  743. VMM_Service Out_Debug_Chr
  744. VMM_Service In_Debug_Chr
  745. VMM_Service Debug_Convert_Hex_Binary
  746. VMM_Service Debug_Convert_Hex_Decimal
  747. VMM_Service Debug_Test_Valid_Handle
  748. VMM_Service Validate_Client_Ptr
  749. VMM_Service Test_Reenter
  750. VMM_Service Queue_Debug_String
  751. VMM_Service Log_Proc_Call
  752. VMM_Service Debug_Test_Cur_VM
  753. .errnz Debug_Test_Cur_VM - 100CCh   ; VMM service table changed above this service
  754. VMM_Service Get_PM_Int_Type
  755. VMM_Service Set_PM_Int_Type
  756. VMM_Service Get_Last_Updated_System_Time
  757. VMM_Service Get_Last_Updated_VM_Exec_Time
  758. End_Service_Table VMM, VMM
  759. ;******************************************************************************
  760. IFDEF DEBUG
  761. DebFar EQU NEAR PTR
  762. ELSE
  763. DebFar EQU SHORT
  764. ENDIF
  765. BeginDoc
  766. ;******************************************************************************
  767. ;
  768. ;      EQUATES FOR SYSTEM_CONTROL CALLS
  769. ;
  770. ;==============================================================================
  771. ;
  772. ; Sys_Critical_Init is a device init call. Devices that have a critical
  773. ;   function that needs initializing before interrupts are enabled should
  774. ;   do it at Sys_Critical_Init. Devices which REQUIRE a certain range of
  775. ;   V86 pages to operate (such as the VDD video memory) should claim them
  776. ;   at Sys_Critical_Init. SYS VM Simulate_Int, Exec_Int ACTIVITY IS NOT
  777. ;   ALLOWED. Returning carry aborts device load only.
  778. ;
  779. Sys_Critical_Init EQU 0000h ; Devices required for virt mode
  780. ;
  781. ; Device init is where most devices do the bulk of their initialization.
  782. ;   SYS VM Simulate_Int, Exec_Int activity is allowed. Returning carry
  783. ;   aborts device load only.
  784. ;
  785. Device_Init EQU 0001h ; All other devices init
  786. ;
  787. ; Init_Complete is the final phase of device init called just before the
  788. ;   WIN386 INIT pages are released and the Instance snapshot is taken.
  789. ;   Devices which wish to search for a region of V86 pages >= A0h to use
  790. ;   should do it at Init_Complete.
  791. ;   SYS VM Simulate_Int, Exec_Int activity is allowed. Returning carry
  792. ;   aborts device load only.
  793. ;
  794. Init_Complete EQU 0002h ; All devices have initialized
  795. ;----------------- INITIALIZATION CODE AND DATA DISCARDED ---------------------
  796. ;
  797. ; Same as VM_Init, except for SYS VM.
  798. ;
  799. Sys_VM_Init EQU 0003h ; Execute the system VM (Win86)
  800. ;
  801. ; Same as VM_Terminate, except for SYS VM (Normal WIN386 exit ONLY, on a crash
  802. ;   exit this call is not made). SYS VM Simulate_Int, Exec_Int activity is
  803. ;   allowed.
  804. ;
  805. Sys_VM_Terminate EQU 0004h ; System VM terminted (exiting)
  806. ;------------------------------------------------------------------------------
  807. ;
  808. ; System_Exit call is made when WIN386 is exiting either normally or via
  809. ;   a crash. INTERRUPS ARE ENABLED. Instance snapshot has been restored.
  810. ;   SYS VM Simulate_Int, Exec_Int ACTIVITY IS NOT ALLOWED.
  811. ;
  812. System_Exit EQU 0005h ; Devices prepare to exit
  813. ;
  814. ; System_Exit call is made when WIN386 is exiting either normally or via
  815. ;   a crash. INTERRUPS ARE DISABLED. SYS VM Simulate_Int, Exec_Int ACTIVITY
  816. ;   IS NOT ALLOWED.
  817. ;
  818. Sys_Critical_Exit EQU 0006h ; System critical devices reset
  819. ;
  820. ; Create_VM creates a new VM. EBX = VM handle of new VM. Returning Carry will
  821. ;   fail the Create_VM.
  822. ;
  823. Create_VM EQU 0007h
  824. ;
  825. ; Second phase of Create_VM. EBX = VM handle of new VM. Returning Carry will
  826. ;   cause the VM to go Not_Executeable, then be destroyed. VM Simulate_Int,
  827. ;   Exec_Int activity is NOT allowed.
  828. ;
  829. VM_Critical_Init EQU 0008h
  830. ;
  831. ; Third phase of Create_VM. EBX = VM handle of new VM. Returning Carry will
  832. ;   cause the VM to go Not_Executeable, then be destroyed. VM Simulate_Int,
  833. ;   Exec_Int activity is allowed.
  834. ;
  835. VM_Init  EQU 0009h
  836. ;
  837. ; NORMAL (First phase) of Destroy_VM. EBX = VM Hanlde. This occurs on normal
  838. ;   termination of the VM. Call cannot be failed. VM Simulate_Int, Exec_Int
  839. ;   activity is allowed.
  840. ;
  841. VM_Terminate EQU 000Ah ; Still in VM -- About to die
  842. ;
  843. ; Second phase of Destroy_VM. EBX = VM Handle, EDX = Flags (see below). Note
  844. ;   that in the case of destroying a running VM, this is the first call made
  845. ;   (VM_Terminate call does not occur). Call cannot be failed. VM Simulate_Int,
  846. ;   Exec_Int activity is NOT allowed.
  847. ;
  848. VM_Not_Executeable EQU 000Bh ; Most devices die (except VDD)
  849. ;
  850. ; Final phase of Destroy_VM. EBX = VM Handle. Note that considerable time
  851. ;   can elaps between the VM_Not_Executeable call and this call. Call cannot
  852. ;   be failed. VM Simulate_Int, Exec_Int activity is NOT allowed.
  853. ;
  854. Destroy_VM EQU 000Ch ; VM's control block about to go
  855. ;
  856. ;   Flags for VM_Not_Executeable control call (passed in EDX)
  857. ;
  858. VNE_Crashed EQU 0000000000000000000000001b
  859. VNE_Crashed_Bit  EQU 0 ; VM was crashed
  860. VNE_Nuked EQU 0000000000000000000000010b
  861. VNE_Nuked_Bit EQU 1 ; VM was destroyed while active
  862. VNE_CreateFail EQU 0000000000000000000000100b
  863. VNE_CreateFail_Bit EQU 2 ; Some device failed Create_VM
  864. VNE_CrInitFail EQU 0000000000000000000001000b
  865. VNE_CrInitFail_Bit EQU 3 ; Some device failed VM_Critical_Init
  866. VNE_InitFail EQU 0000000000000000000010000b
  867. VNE_InitFail_Bit EQU 4 ; Some device failed VM_Init
  868. ;------------------------------------------------------------------------------
  869. ;
  870. ; EBX = VM Handle. Call cannot be failed.
  871. ;
  872. VM_Suspend EQU 000Dh ; VM not runnable until resume
  873. ;
  874. ; EBX = VM Handle. Returning carry fails and backs out the resume.
  875. ;
  876. VM_Resume EQU 000Eh ; VM is leaving suspended state
  877. ;------------------------------------------------------------------------------
  878. ;
  879. ; EBX = VM Handle to set device focus to. EDX = Device ID if device specific
  880. ;   setfocus. == 0 if device critical setfocus (all devices). THIS CALL CANNOT
  881. ;   BE FAILED.
  882. ;
  883. ;   NOTE: In case where EDX == 0, ESI is a FLAG word that indicates special
  884. ;   functions. Currently Bit 0 being set indicates that this Device
  885. ;   critical set focus is also "VM critical". It means that we do not
  886. ;   want some other VM to take the focus from this app now. This is
  887. ;   primarily used when doing a device critical set focus to Windows
  888. ;   (the SYS VM) it is interpreted by the SHELL to mean "if an old app
  889. ;   currently has the Windows activation, set the activation to the
  890. ;   Windows Shell, not back to the old app". ALSO in the case where
  891. ;   Bit 0 is set, EDI = The VM handle of the VM that is "having trouble".
  892. ;   Set this to 0 if there is no specific VM associated with the problem.
  893. ;
  894. Set_Device_Focus EQU 000Fh
  895. ;------------------------------------------------------------------------------
  896. ;
  897. ; EBX = VM Handle going into message mode. THIS CALL CANNOT BE FAILED.
  898. ;
  899. Begin_Message_Mode EQU 0010h
  900. ;
  901. ; EBX = VM Handle leaving message mode. THIS CALL CANNOT BE FAILED.
  902. ;
  903. End_Message_Mode EQU 0011h
  904. ;------------------------- SPECIAL CONTROL CALLS ------------------------------
  905. ;
  906. ; Request for reboot. Call cannot be failed.
  907. ;
  908. Reboot_Processor EQU 0012h ; Request a machine reboot
  909. ;
  910. ; Query_Destroy is an information call made by the SHELL device before an
  911. ;   attempt is made to initiate a destroy VM sequence on a running VM which
  912. ;   has not exited normally. EBX = VM Handle. Returning carry indicates that
  913. ;   a device "has a problem" with allowing this. THE DESTROY SEQUENCE CANNOT
  914. ;   BE ABORTED HOWEVER, this decision is up to the user. All this does is
  915. ;   indicate that there is a "problem" with allowing the destroy. The device
  916. ;   which returns carry should call the SHELL_Message service to post an
  917. ;   informational dialog about the reason for the problem.
  918. ;
  919. Query_Destroy EQU 0013h ; OK to destroy running VM?
  920. ;------------------------- DEBUGGING CONTROL CALL -----------------------------
  921. ;
  922. ; Special call for device specific DEBUG information display and activity.
  923. ;
  924. Debug_Query EQU 0014h
  925. ;---------- CALLS FOR BEGIN/END OF PROTECTED MODE VM EXECUTION ----------------
  926. ;
  927. ;   About to run a protected mode application.
  928. ;   EBX = Current VM handle.
  929. ;   EDX = Flags
  930. ;   EDI -> Application Control Block
  931. ;   Returning with carry set fails the call.
  932. ;
  933. Begin_PM_App EQU 0015h
  934. ;
  935. ;   Flags for Begin_PM_App (passed in EDX)
  936. ;
  937. BPA_32_Bit EQU 00000001b
  938. BPA_32_Bit_Flag  EQU 1
  939. ;
  940. ;   Protected mode application is terminating.
  941. ;   EBX = Current VM handle.  THIS CALL CAN NOT FAIL.
  942. ;   EDI -> Application Control Block
  943. ;
  944. End_PM_App EQU 0016h
  945. EndDoc
  946. BeginDoc
  947. ;******************************************************************************
  948. ; BeginProc is a macro for defining entry points to routines in VMM and in the
  949. ;   VxDs. It correctly defines the procedure name for VxD services(it prepends
  950. ;   a "@" to the procedure name), DWORD aligns the procedure, takes care of
  951. ;   public declaration and does some calling verification for debug versions
  952. ;   of the software. EndProc is a macro which defines the end of the procedure.
  953. ;
  954. ; Valid parameters to the BeginProc macro are:
  955. ; PUBLIC ; Routine used outside this module
  956. ; HIGH_FREQ ; DWORD align procedure
  957. ; SERVICE  ; Routine is called via VxDCall
  958. ; ASYNC_SERVICE ; Same as "SERVICE" plus routine can
  959. ; ; be called under interrupt.
  960. ; After the routine header in which the routine entry conditions, exit
  961. ;   conditions, side affects and functionality are specified, the BeginProc
  962. ;   macro should be used to define the routine's entry point. It has up to
  963. ;   four parameters as specified below. For example:
  964. ;
  965. ;BeginProc  <Function_Name>,PUBLIC, HIGH_FREQ, ASYNC_SERVICE
  966. ;
  967. ; <code>
  968. ;
  969. ;EndProc    <Function_Name>
  970. ;==============================================================================
  971. EndDoc
  972. BeginProc MACRO Name, P1, P2, P3, P4
  973. LOCAL Profile_Data, Skip_Data
  974. IF ?_RCODE
  975. Process_Param MACRO P
  976. IFNB <P>
  977. IFIDNI <P>, <HIGH_FREQ>
  978. Dword_Align
  979. ELSE
  980. IFIDNI <P>, <SERVICE>
  981. ??_SERVICE = 1
  982. ELSE
  983. IFIDNI <P>, <ASYNC_SERVICE>
  984. ??_ASYNC_SERVICE = 1
  985. IF ?_LCODE
  986. %OUT ERROR:  ASYNC_SERVICE's must be in LOCKED code
  987. ;;.err
  988. ENDIF
  989. ELSE
  990. IFIDNI <P>, <NO_LOG>
  991. ??_NO_LOG = 1
  992. ELSE
  993. IFDIFI <P>, <PUBLIC>
  994. %OUT ERROR:  Bad para "&P" to BeginProc
  995. .ERR
  996. ENDIF
  997. ENDIF
  998. ENDIF
  999. ENDIF
  1000. ENDIF
  1001. ENDIF
  1002. ENDM
  1003. ??_SERVICE = 0
  1004. ??_ASYNC_SERVICE = 0
  1005. ??_NO_LOG = 0
  1006. Process_Param P1
  1007. Process_Param P2
  1008. Process_Param P3
  1009. Process_Param P4
  1010. IFE ??_SERVICE + ??_ASYNC_SERVICE
  1011. PUBLIC Name
  1012. Name PROC NEAR
  1013. IFDEF DEBUG
  1014. IFE ??_NO_LOG
  1015. IFNDEF VMMSYS
  1016. VMMcall Log_Proc_Call
  1017. ENDIF
  1018. ENDIF
  1019. ENDIF
  1020. ELSE
  1021. IFDEF DEBUG
  1022. jmp SHORT Skip_Data
  1023. Profile_Data LABEL DWORD
  1024. dd 0
  1025. Skip_Data:
  1026. ENDIF
  1027. PUBLIC @&Name
  1028. @&Name PROC NEAR
  1029. IFDEF DEBUG
  1030. IFE ??_NO_LOG
  1031. ;;;;IFNDEF VMMSYS
  1032. VMMcall Log_Proc_Call
  1033. ;;;;ENDIF
  1034. ENDIF
  1035. pushfd
  1036. inc [Profile_Data]
  1037. IFE ??_ASYNC_SERVICE
  1038. VMMcall Test_Reenter
  1039. ENDIF
  1040. popfd
  1041. ENDIF
  1042. ENDIF
  1043. ELSE
  1044. IFIDNI <P1>, <PUBLIC>
  1045. PUBLIC Name
  1046. ENDIF
  1047. Name PROC NEAR
  1048. ENDIF
  1049. ENDM
  1050. EndProc MACRO Name
  1051. IFDEF @&Name
  1052. @&Name ENDP
  1053. ELSE
  1054. IFDEF Name
  1055. Name ENDP
  1056. ELSE
  1057. .ERR
  1058. %OUT EndProc for &Name does not match BeginProc
  1059. ENDIF
  1060. ENDIF
  1061. ENDM
  1062. ;******************************************************************************
  1063. ;        S C H E D U L E R   B O O S T   V A L U E S
  1064. ;==============================================================================
  1065. Reserved_Low_Boost EQU 00000000000000000000000000000001b
  1066. Cur_Run_VM_Boost EQU 00000000000000000000000000000100b
  1067. Low_Pri_Device_Boost EQU 00000000000000000000000000010000b
  1068. High_Pri_Device_Boost EQU 00000000000000000001000000000000b
  1069. Critical_Section_Boost EQU 00000000000100000000000000000000b
  1070. Time_Critical_Boost EQU 00000000010000000000000000000000b
  1071. Reserved_High_Boost EQU 01000000000000000000000000000000b
  1072. ;******************************************************************************
  1073. ;  F L A G S   F O R   C A L L _ P R I O R I T Y _ V M _ E V E N T
  1074. ;==============================================================================
  1075. PEF_Wait_For_STI EQU 0000001b
  1076. PEF_Wait_For_STI_Bit EQU 0
  1077. PEF_Wait_Not_Crit EQU 0000010b
  1078. PEF_Wait_Not_Crit_Bit EQU 1
  1079. PEF_Dont_Unboost EQU 0000100b
  1080. PEF_Dont_Unboost_Bit EQU 2
  1081. PEF_Always_Sched EQU 0001000b
  1082. PEF_Always_Sched_Bit EQU 3
  1083. ;******************************************************************************
  1084. ;  F L A G S   F O R   B E G I N _ C R I T I C A L _ S E C T I O N
  1085. ;        A N D   W A I T _ S E M A P H O R E
  1086. ;==============================================================================
  1087. Block_Svc_Ints EQU 0000001b
  1088. Block_Svc_Ints_Bit EQU 0
  1089. Block_Svc_If_Ints_Locked EQU 0000010b
  1090. Block_Svc_If_Ints_Locked_Bit EQU 1
  1091. Block_Enable_Ints EQU 0000100b
  1092. Block_Enable_Ints_Bit EQU 2
  1093. BeginDoc
  1094. ;******************************************************************************
  1095. ; The following structures are pointed to by EBP when VxD routines are entered,
  1096. ;   both for VxD control calls and traps(I/O traps, software INT traps, etc.).
  1097. ;   The first structure as DWORD values, the second WORD values and the last
  1098. ;   has BYTE values.
  1099. ;
  1100. Client_Reg_Struc   struc
  1101. Client_EDI dd ? ; Client's EDI
  1102. Client_ESI dd ? ; Client's ESI
  1103. Client_EBP dd ? ; Client's EBP
  1104. dd ? ; ESP at pushall
  1105. Client_EBX dd ? ; Client's EBX
  1106. Client_EDX dd ? ; Client's EDX
  1107. Client_ECX dd ? ; Client's ECX
  1108. Client_EAX dd ? ; Client's EAX
  1109. Client_Error dd ? ; Dword error code
  1110. Client_EIP dd ? ; EIP
  1111. Client_CS dw ? ; CS
  1112. dw ? ;   (padding)
  1113. Client_EFlags dd ? ; EFLAGS
  1114. Client_ESP dd ? ; ESP
  1115. Client_SS dw ? ; SS
  1116. dw ? ;   (padding)
  1117. Client_ES dw ? ; ES
  1118. dw ? ;   (padding)
  1119. Client_DS dw ? ; DS
  1120. dw ? ;   (padding)
  1121. Client_FS dw ? ; FS
  1122. dw ? ;   (padding)
  1123. Client_GS dw ? ; GS
  1124. dw ? ;   (padding)
  1125. Client_Alt_EIP dd ?
  1126. Client_Alt_CS dw ?
  1127. dw ?
  1128. Client_Alt_EFlags  dd ?
  1129. Client_Alt_ESP dd ?
  1130. Client_Alt_SS dw ?
  1131. dw ?
  1132. Client_Alt_ES dw ?
  1133. dw ?
  1134. Client_Alt_DS dw ?
  1135. dw ?
  1136. Client_Alt_FS dw ?
  1137. dw ?
  1138. Client_Alt_GS dw ?
  1139. dw ?
  1140. Client_Reg_Struc   ends
  1141. Client_Word_Reg_Struc struc
  1142. Client_DI dw ? ; Client's DI
  1143. dw ? ;   (padding)
  1144. Client_SI dw ? ; Client's SI
  1145. dw ? ;   (padding)
  1146. Client_BP dw ? ; Client's BP
  1147. dw ? ;   (padding)
  1148. dd ? ; ESP at pushall
  1149. Client_BX dw ? ; Client's BX
  1150. dw ? ;   (padding)
  1151. Client_DX dw ? ; Client's DX
  1152. dw ? ;   (padding)
  1153. Client_CX dw ? ; Client's CX
  1154. dw ? ;   (padding)
  1155. Client_AX dw ? ; Client's AX
  1156. dw ? ;   (padding)
  1157. dd ? ; Dword error code
  1158. Client_IP dw ? ; Client's IP
  1159. dw ? ;   (padding)
  1160. dd ? ; CS
  1161. Client_Flags dw ? ; Client's flags (low)
  1162. dw ? ;   (padding)
  1163. Client_SP dw ? ; SP
  1164. dw ?
  1165. dd 5 dup (?)
  1166. Client_Alt_IP dw ?
  1167. dw ?
  1168. dd ?
  1169. Client_Alt_Flags    dw ?
  1170. dw ?
  1171. Client_Alt_SP dw ?
  1172. Client_Word_Reg_Struc ends
  1173. Client_Byte_Reg_Struc struc
  1174. dd 4 dup (?) ; EDI, ESI, EBP, ESP at pushall
  1175. Client_BL db ? ; Client's BL
  1176. Client_BH db ? ; Client's BH
  1177. dw ? ;   (padding)
  1178. Client_DL db ? ; Client's DL
  1179. Client_DH db ? ; Client's DH
  1180. dw ? ;   (padding)
  1181. Client_CL db ? ; Client's CL
  1182. Client_CH db ? ; Client's CH
  1183. dw ? ;   (padding)
  1184. Client_AL db ? ; Client's AL
  1185. Client_AH db ? ; Client's AH
  1186. Client_Byte_Reg_Struc ends
  1187. ;==============================================================================
  1188. EndDoc
  1189. .ERRNZ Client_SP - Client_ESP
  1190. .ERRNZ Client_AL - Client_EAX
  1191. PushCParams MACRO P1, P2, P3, P4, P5, P6, P7, P8, P9, P10
  1192. IRP Param, <P10, P9, P8, P7, P6, P5, P4, P3, P2, P1>
  1193. IFNB <Param>
  1194. push Param
  1195. ENDIF
  1196. ENDM
  1197. ENDM
  1198. ClearCParams MACRO Count, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10
  1199. IFNB <P1>
  1200. ClearCParams %(Count+1), <P2>, <P3>, <P4>, <P5>, <P6>, <P7>, <P8>, <P9>, <P10>
  1201. ELSE
  1202. IF Count
  1203. add esp, Count*4
  1204. ENDIF
  1205. ENDIF
  1206. ENDM
  1207. Dyna_Link_Int EQU 20h
  1208. ;
  1209. ;
  1210. BeginDoc
  1211. ;******************************************************************************
  1212. ; The VMMCall and VxDCall macros provide a dynamic link to the VMM and VxD
  1213. ;   service routines. For example:
  1214. ;
  1215. ;   VMMCall Enable_VM_Ints ; Equivalent to STI in VM code
  1216. ;
  1217. ;   mov     eax,[My_IRQ_Handle]
  1218. ;   VxDCall VPICD_Set_Int_Request ; Set IRQ for my device's interrupt
  1219. ;
  1220. ; Note that Enable_VM_Ints is defined in VMM.INC and VPICD_Set_Int_Request is
  1221. ; defined in VPICD.INC
  1222. ;
  1223. ;==============================================================================
  1224. EndDoc
  1225. BeginDoc
  1226. ;******************************************************************************
  1227. ; VxDCall
  1228. ;==============================================================================
  1229. EndDoc
  1230. VxDcall MACRO P, Param
  1231. PushCParams Param
  1232. int Dyna_Link_Int
  1233. dd P
  1234. ClearCParams 0, Param
  1235. ENDM
  1236. VxDjmp MACRO P, Param
  1237. IFNB <Param>
  1238. %OUT ERROR:  Parameters may not be passed to VxDjmp or VMMjmp macros
  1239. .ERR
  1240. ENDIF
  1241. int Dyna_Link_Int
  1242. IFDEF DEBUG
  1243. dd P
  1244. ret
  1245. ELSE
  1246. dd P OR DL_Jmp_Mask
  1247. ENDIF
  1248. ENDM
  1249. DL_Jmp_Mask EQU 8000h
  1250. DL_Jmp_Bit EQU 0Fh
  1251. VMMcall MACRO P, Param
  1252. .ERRNZ (P SHR 16) - VMM_Device_ID
  1253. VxDcall <P>, <Param>
  1254. ENDM
  1255. VMMjmp MACRO P, Param
  1256. .ERRNZ (P SHR 16) - VMM_Device_ID
  1257. VxDjmp <P>, <Param>
  1258. ENDM
  1259. cCall MACRO P, Param
  1260. PushCParams Param
  1261. call P
  1262. ClearCParams 0, Param
  1263. ENDM
  1264. BeginDoc
  1265. ;******************************************************************************
  1266. ; Segment definition macros
  1267. ;
  1268. ; The segment definition macros are a convenience used in defining the
  1269. ; segments used by the device driver. They are:
  1270. ;VxD_ICODE_SEG  defines start of initialization code segment
  1271. ;VxD_ICODE_ENDS  defines end of initialization code segment
  1272. ;VxD_IDATA_SEG  defines start of initialization data segment
  1273. ;VxD_IDATA_ENDS  defines end of initialization data segment
  1274. ;VxD_CODE_SEG  defines start of always present code segment
  1275. ;VxD_CODE_ENDS  defines end of always present code segment
  1276. ;VxD_DATA_SEG  defines start of always present data segment
  1277. ;VxD_DATA_ENDS  defines end of always present data segment
  1278. ;==============================================================================
  1279. EndDoc
  1280. ;   Protected mode code
  1281. VxD_CODE_SEG EQU <VxD_LOCKED_CODE_SEG>
  1282. VxD_CODE_ENDS EQU <VxD_LOCKED_CODE_ENDS>
  1283. VxD_LOCKED_CODE_SEG MACRO
  1284. _LTEXT  SEGMENT
  1285. ??_CUR_CODE_SEG = ??_CUR_CODE_SEG SHL 3 + ??_LCODE
  1286. ASSUME cs:FLAT, ds:FLAT, es:FLAT, ss:FLAT
  1287. ENDM
  1288. VxD_LOCKED_CODE_ENDS MACRO
  1289. ??_CUR_CODE_SEG = ??_CUR_CODE_SEG SHR 3
  1290. _LTEXT  ENDS
  1291. ENDM
  1292. ;   Protected mode initialization code
  1293. VxD_ICODE_SEG MACRO
  1294. _ITEXT SEGMENT
  1295. ??_CUR_CODE_SEG = ??_CUR_CODE_SEG SHL 3 + ??_ICODE
  1296. ASSUME cs:FLAT, ds:FLAT, es:FLAT, ss:FLAT
  1297. ENDM
  1298. VxD_ICODE_ENDS MACRO
  1299. ??_CUR_CODE_SEG = ??_CUR_CODE_SEG SHR 3
  1300. _ITEXT ENDS
  1301. ENDM
  1302. ;   Protected mode data
  1303. VxD_DATA_SEG EQU <VxD_LOCKED_DATA_SEG>
  1304. VxD_DATA_ENDS EQU <VxD_LOCKED_DATA_ENDS>
  1305. VxD_LOCKED_DATA_SEG MACRO NO_ALIGN
  1306. _LDATA  SEGMENT
  1307. IFB <NO_ALIGN>
  1308. ALIGN 4
  1309. ENDIF
  1310. ENDM
  1311. VxD_LOCKED_DATA_ENDS MACRO
  1312. _LDATA  ENDS
  1313. ENDM
  1314. ;   Protected mode initialization data
  1315. VxD_IDATA_SEG MACRO
  1316. _IDATA SEGMENT
  1317. ENDM
  1318. VxD_IDATA_ENDS MACRO
  1319. _IDATA ENDS
  1320. ENDM
  1321. VxD_REAL_INIT_SEG  MACRO
  1322. _RCODE SEGMENT
  1323. ASSUME CS:_RCODE, DS:_RCODE, ES:_RCODE, SS:_RCODE
  1324. ??_CUR_CODE_SEG = ??_CUR_CODE_SEG SHL 3 + ??_RCODE
  1325.   ENDM
  1326. VxD_REAL_INIT_ENDS MACRO
  1327. ??_CUR_CODE_SEG = ??_CUR_CODE_SEG SHR 3
  1328. _RCODE ENDS
  1329.    ENDM
  1330. ENDIF
  1331. DDK_Version equ 300h
  1332. VxD_Desc_Block STRUC
  1333. DDB_Next dd  ? ; VMM RESERVED FIELD
  1334. DDB_SDK_Version  dw  DDK_Version  ; VMM RESERVED FIELD
  1335. DDB_Req_Device_Number dw  Undefined_Device_ID ; Required device number
  1336. DDB_Dev_Major_Version db  0 ; Major device number
  1337. DDB_Dev_Minor_Version db  0 ; Minor device number
  1338. DDB_Flags dw  0 ; Flags for init calls complete
  1339. DDB_Name db  "        " ; Device name
  1340. DDB_Init_Order dd  Undefined_Init_Order; Initialization Order
  1341. DDB_Control_Proc dd  ? ; Offset of control procedure
  1342. DDB_V86_API_Proc dd  0 ; Offset of API procedure (or 0)
  1343. DDB_PM_API_Proc  dd  0 ; Offset of API procedure (or 0)
  1344. DDB_V86_API_CSIP dd  0 ; CS:IP of API entry point
  1345. DDB_PM_API_CSIP  dd  0 ; CS:IP of API entry point
  1346. DDB_Reference_Data dd  ? ; Reference data from real mode
  1347. DDB_Service_Table_Ptr dd  0 ; Pointer to service table
  1348. DDB_Service_Table_Size dd  0 ; Number of services
  1349. VxD_Desc_Block ENDS
  1350. IFNDEF Not_VxD
  1351. ; flag values for DDB_Flags
  1352. DDB_Sys_Crit_Init_Done     EQU 00000001b
  1353. DDB_Sys_Crit_Init_Done_Bit  EQU        0
  1354. DDB_Device_Init_Done     EQU 00000010b
  1355. DDB_Device_Init_Done_Bit    EQU       1
  1356. BeginDoc
  1357. ;******************************************************************************
  1358. ;
  1359. ;   Declare_Virtual_Device macro
  1360. ;
  1361. ; ???? Write something here ????
  1362. ;
  1363. ;==============================================================================
  1364. EndDoc
  1365. Declare_Virtual_Device MACRO Name, Major_Ver, Minor_Ver, Ctrl_Proc, Device_Num, Init_Order, V86_Proc, PM_Proc
  1366. LOCAL V86_API_Offset, PM_API_Offset, Serv_Tab_Offset, Serv_Tab_Len
  1367. dev_id_err MACRO
  1368. %OUT Device ID required when providing services
  1369. .ERR
  1370. ENDM
  1371. IFB <V86_Proc>
  1372. V86_API_Offset EQU 0
  1373. ELSE
  1374. IFB <Device_Num>
  1375. dev_id_err
  1376. ENDIF
  1377. V86_API_Offset EQU <OFFSET32 V86_Proc>
  1378. ENDIF
  1379. IFB <PM_Proc>
  1380. PM_API_Offset EQU 0
  1381. ELSE
  1382. IFB <Device_Num>
  1383. dev_id_err
  1384. ENDIF
  1385. PM_API_Offset EQU <OFFSET32 PM_Proc>
  1386. ENDIF
  1387. IFDEF Name&_Service_Table
  1388. IFB <Device_Num>
  1389. dev_id_err
  1390. ELSE
  1391. IFE Device_Num - Undefined_Device_ID
  1392. dev_id_err
  1393. ENDIF
  1394. ENDIF
  1395. Serv_Tab_Offset EQU <OFFSET32 Name&_Service_Table>
  1396. Serv_Tab_Len EQU Num_&Name&_Services
  1397. ELSE
  1398. Serv_Tab_Offset EQU 0
  1399. Serv_Tab_Len EQU 0
  1400. ENDIF
  1401. VxD_LOCKED_DATA_SEG
  1402. PUBLIC Name&_DDB
  1403. Name&_DDB VxD_Desc_Block <,,Device_Num,Major_Ver,Minor_Ver,,"&Name",Init_Order,
  1404.  OFFSET32 Ctrl_Proc, V86_API_Offset, PM_API_Offset, 
  1405.  ,,,Serv_Tab_Offset, Serv_Tab_Len>
  1406. VxD_LOCKED_DATA_ENDS
  1407. ENDM
  1408. BeginDoc
  1409. ;******************************************************************************
  1410. ; The Begin_Control_Dispatch macro is used for building a table for dispatching
  1411. ; messages passed to the VxD_Control procedure.  It is used with
  1412. ; Control_Dispatch and End_Control_Dispatch.  The only parameter is used to
  1413. ; contruct the procedure label by adding "_Control" to the end (normally the
  1414. ; device name is used i.e. VKD results in creating the procedure VKD_Control,
  1415. ; this created procedure label must be included in Declare_Virtual_Device)
  1416. ;
  1417. ; An example of building a complete dispatch table:
  1418. ;
  1419. ; Begin_Control_Dispatch MyDevice
  1420. ; Control_Dispatch  Device_Init, MyDeviceInitProcedure
  1421. ; Control_Dispatch  Sys_VM_Init, MyDeviceSysInitProcedure
  1422. ; Control_Dispatch  Create_VM,  MyDeviceCreateVMProcedure
  1423. ; End_Control_Dispatch MyDevice
  1424. ;
  1425. ; (NOTE: Control_Dispatch can be used without Begin_Control_Dispatch, but
  1426. ;  then it is the programmer's responsibility for declaring a procedure
  1427. ;  in locked code (VxD_LOCKED_CODE_SEG) and returning Carry clear for
  1428. ;  any messages not processed.  The advantage in using
  1429. ;  Begin_Control_Dispatch is when a large # of messages are processed by
  1430. ;  a device, because a jump table is built which will usually require
  1431. ;  less code space then the compares and jumps that are done when
  1432. ;  Control_Dispatch is used alone.
  1433. ;
  1434. ;==============================================================================
  1435. EndDoc
  1436. Begin_Control_Dispatch MACRO VxD_Name
  1437. ??_cd_low = 0FFFFFFFFh
  1438. ??_cd_high = 0
  1439. BeginProc VxD_Name&_Control
  1440. ENDM
  1441. End_Control_Dispatch   MACRO VxD_Name
  1442. LOCAL ignore, table
  1443. jmpproc MACRO num
  1444. jmp ??_cd_&&num
  1445. ENDM
  1446. procoff MACRO num
  1447. IFDEF ??_cd_&&num
  1448. dd OFFSET32 ??_cd_&&num
  1449. ELSE
  1450. dd OFFSET32 ignore
  1451. ENDIF
  1452. ENDM
  1453. IF ??_cd_low EQ ??_cd_high
  1454. cmp eax, ??_cd_low
  1455. jne short ignore
  1456. jmpproc %(??_cd_low)
  1457. ignore:
  1458. clc
  1459. ret
  1460. ELSE
  1461. cmp eax, ??_cd_high
  1462. ja short ignore
  1463. sub eax, ??_cd_low
  1464. jb short ignore
  1465. jmp cs:[eax*4+table]
  1466. ignore:
  1467. clc
  1468. ret
  1469. table label dword
  1470. REPT   ??_cd_high - ??_cd_low + 1
  1471. procoff %(??_cd_low)
  1472. ??_cd_low = ??_cd_low + 1
  1473. ENDM
  1474. ENDIF
  1475. EndProc VxD_Name&_Control
  1476. PURGE jmpproc
  1477. PURGE procoff
  1478. PURGE Begin_Control_Dispatch
  1479. PURGE Control_Dispatch
  1480. PURGE End_Control_Dispatch
  1481. ENDM
  1482. BeginDoc
  1483. ;******************************************************************************
  1484. ; The Control_Dispatch macro is used for dispatching based on message
  1485. ; passed to the VxD_Control procedure. E.G.:
  1486. ;
  1487. ; Control_Dispatch  Device_Init, MyDeviceInitProcedure
  1488. ;
  1489. ; (NOTE: Control_Dispatch can be used with Begin_Control_Dispatch and
  1490. ;  End_Control_Dispatch to create a jump table for dispatching messages,
  1491. ;  when a large # of messages are processed.)
  1492. ;
  1493. ;==============================================================================
  1494. EndDoc
  1495. Control_Dispatch MACRO Service, Procedure
  1496. LOCAL Skip_Interseg_Jump
  1497. IFE ?_lcode
  1498. IFDEF ??_cd_low
  1499. Equate_Service MACRO Serv
  1500. ??_cd_&&Serv equ Procedure
  1501. ENDM
  1502. Equate_Service %(Service)
  1503. IF Service LT ??_cd_low
  1504. ??_cd_low = Service
  1505. ENDIF
  1506. IF Service GT ??_cd_high
  1507. ??_cd_high = Service
  1508. ENDIF
  1509. PURGE Equate_Service
  1510. ELSE
  1511. cmp eax, Service
  1512. jne SHORT Skip_Interseg_Jump
  1513. jmp Procedure
  1514. Skip_Interseg_Jump:
  1515. ENDIF
  1516. ELSE
  1517. %OUT ERROR:  The Control proc should be in LOCKED code.
  1518. %OUT      Control_Dispatch can only be used inside of VxD_LOCKED_CODE_SEG.
  1519. .err
  1520. ENDIF
  1521. ENDM
  1522. BeginDoc
  1523. ;******************************************************************************
  1524. ; The following are the definitions for the "type of I/O" parameter passed
  1525. ;   to a I/O trap routine
  1526. Byte_Input EQU 000h
  1527. Byte_Output EQU 004h
  1528. Word_Input EQU 008h
  1529. Word_Output EQU 00Ch
  1530. Dword_Input EQU 010h
  1531. Dword_Output EQU 014h
  1532. Output EQU 0000000000000100b
  1533. Output_Bit EQU 2
  1534. Word_IO  EQU 0000000000001000b
  1535. Word_IO_Bit EQU 3
  1536. Dword_IO EQU 0000000000010000b
  1537. Dword_IO_Bit EQU 4
  1538. String_IO EQU 00000020h
  1539. String_IO_Bit EQU 5
  1540. Rep_IO EQU 00000040h
  1541. Rep_IO_Bit EQU 6
  1542. Addr_32_IO EQU 00000080h
  1543. Addr_32_IO_Bit EQU 7
  1544. Reverse_IO EQU 00000100h
  1545. Reverse_IO_Bit EQU 8
  1546. IO_Seg_Mask EQU 0FFFF0000h ; Use these bits to get segment
  1547. IO_Seg_Shift EQU 10h ; Must shift right this many
  1548. ;==============================================================================
  1549. EndDoc
  1550. BeginDoc
  1551. ;******************************************************************************
  1552. ;
  1553. ;   Dispatch_Byte_IO macro
  1554. ;
  1555. ; Dispatch_Byte_IO Byte_In_Proc, Byte_Out_Proc
  1556. ;==============================================================================
  1557. EndDoc
  1558. Dispatch_Byte_IO MACRO In_Proc, Out_Proc
  1559. LOCAL Byte_IO
  1560. cmp ecx, Byte_Output
  1561. jbe SHORT Byte_IO
  1562. VMMjmp Simulate_IO
  1563. Byte_IO:
  1564. IFIDNI <In_Proc>, <Fall_Through>
  1565. je Out_Proc
  1566. ELSE
  1567. IFIDNI <Out_Proc>, <Fall_Through>
  1568. jb In_Proc
  1569. ELSE
  1570. je Out_Proc
  1571. jmp In_Proc
  1572. ENDIF
  1573. ENDIF
  1574. ENDM
  1575. BeginDoc
  1576. ;******************************************************************************
  1577. ;
  1578. ;   Emulate_Non_Byte_IO
  1579. ;
  1580. ; Emulate_Non_Byte_IO
  1581. ;
  1582. ;==============================================================================
  1583. EndDoc
  1584. Emulate_Non_Byte_IO MACRO
  1585. LOCAL Byte_IO
  1586. cmp ecx, Byte_Output
  1587. jbe SHORT Byte_IO
  1588. VMMjmp Simulate_IO
  1589. Byte_IO:
  1590. ENDM
  1591. VxD_IOT_Hdr STRUC
  1592. VxD_IO_Ports dw  ?
  1593. VxD_IOT_Hdr ENDS
  1594. VxD_IO_Struc STRUC
  1595. VxD_IO_Port dw  ?
  1596. VxD_IO_Proc dd  ?
  1597. VxD_IO_Struc ENDS
  1598. BeginDoc
  1599. ;******************************************************************************
  1600. ;
  1601. ; Begin_VxD_IO_Table
  1602. ;
  1603. ;   Example:
  1604. ; Begin_VxD_IO_Table MyTableName
  1605. ;
  1606. ;==============================================================================
  1607. EndDoc
  1608. .ERRNZ SIZE VxD_IOT_Hdr - 2 ; Begin_VxD_IO_Table creates a 1 word count hdr
  1609. Begin_VxD_IO_Table MACRO Table_Name
  1610. PUBLIC Table_Name
  1611. Table_Name LABEL WORD
  1612. IF2
  1613. IFNDEF Table_Name&_Entries
  1614. %OUT ERROR:  No End_VxD_IO_Table for &Table_Name
  1615. .ERR
  1616. ENDIF
  1617. dw Table_Name&_Entries
  1618. ELSE
  1619. dw ?
  1620. ENDIF
  1621. ENDM
  1622. .ERRNZ SIZE VxD_IO_Struc - 6 ; VxD_IO creates 6 byte I/O port entries
  1623. VxD_IO MACRO Port, Proc_Name
  1624. dw Port
  1625. dd OFFSET32 Proc_Name
  1626. ENDM
  1627. End_VxD_IO_Table MACRO Table_Name
  1628. IFNDEF Table_Name
  1629. %OUT ERROR:  No Begin_VxD_IO_Table for &Table_Name
  1630. .ERR
  1631. ELSE
  1632. Table_Name&_Entries EQU (($-Table_Name)-2) / (SIZE VxD_IO_Struc)
  1633. IF Table_Name&_Entries LE 0
  1634. %OUT ERROR:  Invalid number of port traps in &Table_Name
  1635. .ERR
  1636. ENDIF
  1637. ENDIF
  1638.     ENDM
  1639. ;******************************************************************************
  1640. ;******************************************************************************
  1641. Push_Client_State MACRO
  1642. sub esp, SIZE Client_Reg_Struc
  1643. push edi
  1644. lea edi, [esp+4]
  1645. VMMcall Save_Client_State
  1646. pop edi
  1647. ENDM
  1648. Pop_Client_State MACRO
  1649. push esi
  1650. lea esi, [esp+4]
  1651. VMMcall Restore_Client_State
  1652. pop esi
  1653. add esp, SIZE Client_Reg_Struc
  1654. ENDM
  1655. BeginDoc
  1656. ;******************************************************************************
  1657. ;
  1658. ;   CallRet -- Call procedure and return.  For debugging purposes only.
  1659. ;        If compiled with debugging then this will generate a call
  1660. ;        followed by a return.  If non-debugging version then the
  1661. ;        specified label will be jumped to.
  1662. ;
  1663. ;   PARAMETERS:
  1664. ; Label_Name = Procedure to be called
  1665. ;
  1666. ;   EXIT:
  1667. ; Return from current procedure
  1668. ;
  1669. ;------------------------------------------------------------------------------
  1670. EndDoc
  1671. CallRet MACRO P1, P2
  1672. IFDEF DEBUG
  1673. IFIDNI <P1>, <SHORT>
  1674. call P2
  1675. ELSE
  1676. call P1
  1677. ENDIF
  1678. ret
  1679. ELSE
  1680. jmp P1 P2
  1681. ENDIF
  1682. ENDM
  1683. ; ebp offsets to segments pushed by PMode_Fault in Fault_Dispatch
  1684. PClient_DS equ WORD PTR -4
  1685. PClient_ES equ WORD PTR -8
  1686. PClient_FS equ WORD PTR -12
  1687. PClient_GS equ WORD PTR -16
  1688. Client_Ptr_Flat MACRO Reg_32, Cli_Seg, Cli_Off
  1689. IFDIFI <Reg_32>, <EAX>
  1690. push eax
  1691. ENDIF
  1692. IFB <Cli_Off>
  1693. mov ax, (Client_&Cli_Seg * 100h) + 0FFh
  1694. ELSE
  1695. mov ax, (Client_&Cli_Seg * 100h) + Client_&Cli_Off
  1696. ENDIF
  1697. VMMcall Map_Flat
  1698. IFDIFI <Reg_32>, <EAX>
  1699. mov Reg_32, eax
  1700. pop eax
  1701. ENDIF
  1702. ENDM
  1703. ;------------------------------------------------------------------------------
  1704. VxDint MACRO Int_Number
  1705. push DWORD PTR Int_Number
  1706. VMMcall Exec_VxD_Int
  1707. ENDM
  1708. ENDIF ; Not_VxD
  1709. BeginDoc
  1710. ;******************************************************************************
  1711. ;
  1712. ;   The following equates are for flags sent to the real mode
  1713. ;   initialization portion of a device driver:
  1714. ;
  1715. Duplicate_Device_ID     equ 0000000000000001b   ; duplicate device ID already
  1716. Duplicate_Device_ID_Bit     equ         0    ; loaded
  1717. Duplicate_From_INT2F     equ 0000000000000010b   ; duplicate device ID already
  1718. Duplicate_From_INT2F_Bit    equ        1     ; loaded as part of INT 2F
  1719.     ; device list
  1720. Loading_From_INT2F     equ 0000000000000100b   ; this device was specified
  1721. Loading_From_INT2F_Bit     equ       2     ; in the INT 2F device list
  1722. EndDoc
  1723. BeginDoc
  1724. ;******************************************************************************
  1725. ;
  1726. ;   The following equates are used to indicate the result of the real mode
  1727. ;   initialization portion of a device driver:
  1728. ;
  1729. Device_Load_Ok     equ 0 ; protected mode portion of device
  1730. ; should be loaded
  1731. Abort_Device_Load   equ 1 ; don't load any protected mode portion
  1732. ; of this device, but continue loading
  1733. ; the rest of the devices
  1734. Abort_Win386_Load   equ 2 ; fatal-error: abort the load of Win386
  1735. No_Fail_Message     equ 8000h ; The high bit is set in the return
  1736. No_Fail_Message_Bit equ 15 ; code, if the loader should not print
  1737. ; any message for results
  1738. ; Abort_Device_Load or Abort_Win386_Load
  1739. ;==============================================================================
  1740. EndDoc
  1741. ;==============================================================================
  1742. ; CR0 bit assignments
  1743. PE_Mask  EQU 0001h ; 1 = Protected Mode
  1744. PE_Bit EQU 0
  1745. MP_Mask  EQU 0002h ; 1 = Monitor Coprocessor
  1746. MP_Bit EQU 1
  1747. EM_Mask  EQU 0004h ; 1 = Emulate Math Coprocessor
  1748. EM_Bit EQU 2
  1749. TS_Mask  EQU 0008h ; 1 = Task Switch occured
  1750. TS_Bit EQU 3
  1751. ET_Mask  EQU 0010h ; 1 = 387 present, 0 = 287 present
  1752. ET_Bit EQU 4
  1753. PG_Mask  EQU 80000000h ; 1 = paging enabled, 0 = paging disabled
  1754. PG_Bit EQU 31
  1755. ; EFLAGs bit assignments
  1756. CF_Mask  EQU 000000000000000001b ; Carry flag
  1757. CF_Bit EQU 0
  1758. PF_Mask  EQU 000000000000000100b ; Parity flag
  1759. PF_Bit EQU 2
  1760. AF_Mask  EQU 000000000000010000b ; Aux flag
  1761. AF_Bit EQU 4
  1762. ZF_Mask  EQU 000000000001000000b ; Zero flag
  1763. ZF_Bit EQU 6
  1764. SF_Mask  EQU 000000000010000000b ; Sign flag
  1765. SF_Bit EQU 7
  1766. TF_Mask  EQU 000000000100000000b ; Trace flag
  1767. TF_Bit EQU 8
  1768. IF_Mask  EQU 000000001000000000b ; Int flag
  1769. IF_Bit EQU 9
  1770. DF_Mask  EQU 000000010000000000b ; Direction flag
  1771. DB_Bit EQU 10
  1772. OF_Mask  EQU 000000100000000000b ; Overflow flag
  1773. OF_Bit EQU 11
  1774. IOPL_Mask EQU 000011000000000000b ; IOPL flags
  1775. IOPL_Bit0 EQU 12
  1776. IOPL_Bit1 EQU 13
  1777. NT_Mask  EQU 000100000000000000b ; Nested task flag
  1778. NT_Bit EQU 14
  1779. RF_Mask  EQU 010000000000000000b ; Resume flag
  1780. RF_Bit EQU 16
  1781. VM_Mask  EQU 100000000000000000b ; Virtual Mode flag
  1782. VM_Bit EQU 17
  1783. ;------------------------------------------------------------------------------
  1784. ;
  1785. ;   Temporary MASM macros (to be removed when supported by MASM)
  1786. ;
  1787. ;------------------------------------------------------------------------------
  1788. loopd EQU <loop>
  1789. loopde EQU <loope>
  1790. loopdne EQU <loopne>
  1791. loopdz EQU <loopz>
  1792. loopdnz EQU <loopnz>
  1793. ;******************************************************************************
  1794. ; PAGE TABLE EQUATES
  1795. ;******************************************************************************
  1796. P_SIZE equ 1000h ; page size
  1797. ; ---------------------------------------------------
  1798. ;
  1799. ; Page table entry bits
  1800. ;
  1801. ; ---------------------------------------------------
  1802. P_PRES equ 01h ; page present bit
  1803. P_WRITE  equ 02h ; write access bit
  1804. P_USER equ 04h ; access bit for User mode
  1805. P_ACC equ 20h ; page accessed bit
  1806. P_DIRTY  equ 40h ; page dirty bit
  1807. P_AVAIL  equ (P_PRES+P_WRITE+P_USER) ; avail to everyone & present
  1808. ; ---------------------------------------------------
  1809. ;
  1810. ;  Page types - definition of the OS reserved bits in the page table
  1811. ; entry.
  1812. ; ---------------------------------------------------
  1813. PG_TYPE  equ 0E00h ; TYPE bits in PTE
  1814. ; ---------------------------------------------------
  1815. ;
  1816. ;  Page types for page allocator calls
  1817. ;
  1818. ; ---------------------------------------------------
  1819. PG_VM equ 0
  1820. PG_SYS equ 1
  1821. PG_RESERVED1 equ 2
  1822. PG_PRIVATE equ 3
  1823. PG_RESERVED2 equ 4
  1824. PG_RELOCK equ 5 ; PRIVATE to MMGR
  1825. PG_INSTANCE equ 6
  1826. PG_HOOKED equ 7
  1827. PG_IGNORE equ 0FFFFFFFFh
  1828. ; ---------------------------------------------------
  1829. ;
  1830. ;  Types for page table entries
  1831. ;
  1832. ; ---------------------------------------------------
  1833. PgT_VM equ PG_VM SHL 9
  1834. PgT_SYS  equ PG_SYS SHL 9
  1835. PgT_RESERVED1 equ PG_RESERVED1 SHL 9
  1836. PgT_PRIVATE equ PG_PRIVATE SHL 9
  1837. PgT_RESERVED2 equ PG_RESERVED2 SHL 9
  1838. PgT_RELOCK equ PG_RELOCK SHL 9
  1839. PgT_INSTANCE equ PG_INSTANCE SHL 9
  1840. PgT_HOOKED equ PG_HOOKED SHL 9
  1841. ;******************************************************************************
  1842. ; ---------------------------------------------------
  1843. ;
  1844. ; Definitions for the access byte in a descriptor
  1845. ;
  1846. ; ---------------------------------------------------
  1847. ; Following fields are common to segment and control descriptors
  1848. D_PRES equ 080h ; present in memory
  1849. D_NOTPRES equ 0 ; not present in memory
  1850. D_DPL0 equ 0 ; Ring 0
  1851. D_DPL1 equ 020h ; Ring 1
  1852. D_DPL2 equ 040h ; Ring 2
  1853. D_DPL3 equ 060h ; Ring 3
  1854. D_SEG equ 010h ; Segment descriptor
  1855. D_CTRL equ 0 ; Control descriptor
  1856. D_GRAN_BYTE equ 000h ; Segment length is byte granular
  1857. D_GRAN_PAGE equ 080h ; Segment length is page granular
  1858. D_DEF16  equ 000h ; Default operation size is 16 bits
  1859. D_DEF32  equ 040h ; Default operation size is 32 bits
  1860. ; Following fields are specific to segment descriptors
  1861. D_CODE equ 08h ; code
  1862. D_DATA equ 0 ; data
  1863. D_RX equ 02h ; if code, readable
  1864. D_X equ 0 ; if code, exec only
  1865. D_W equ 02h ; if data, writable
  1866. D_R equ 0 ; if data, read only
  1867. D_ACCESSED equ 1 ; segment accessed bit
  1868. ; Useful combination access rights bytes
  1869. RW_Data_Type equ (D_PRES+D_SEG+D_DATA+D_W)
  1870. R_Data_Type  equ (D_PRES+D_SEG+D_DATA+D_R)
  1871. Code_Type    equ (D_PRES+D_SEG+D_CODE+D_RX)
  1872. D_PAGE32 equ (D_GRAN_PAGE+D_DEF32)   ; 32 bit Page granular
  1873. ; Masks for selector fields
  1874. SELECTOR_MASK equ 0fff8h ; selector index
  1875. SEL_LOW_MASK equ 0f8h ; mask for low byte of sel indx
  1876. TABLE_MASK equ 04h ; table bit
  1877. RPL_MASK equ 03h ; privilige bits
  1878. RPL_CLR  equ not 03h  ; clear ring bits