📄 vmm.inc
字号:
VMM_Service Test_Debug_Installed ; Valid call in retail also
VMM_Service Out_Debug_String ; Valid in DEBLEVEL=1
VMM_Service Out_Debug_Chr
VMM_Service In_Debug_Chr
VMM_Service Debug_Convert_Hex_Binary
VMM_Service Debug_Convert_Hex_Decimal
VMM_Service Debug_Test_Valid_Handle
VMM_Service Validate_Client_Ptr
VMM_Service Test_Reenter
VMM_Service Queue_Debug_String
VMM_Service Log_Proc_Call
VMM_Service Debug_Test_Cur_VM
VMM_Service Get_PM_Int_Type
VMM_Service Set_PM_Int_Type
VMM_Service Get_Last_Updated_System_Time
VMM_Service Get_Last_Updated_VM_Exec_Time
; for DBCS Enabling
VMM_Service Test_DBCS_Lead_Byte
.errnz Test_DBCS_Lead_Byte - 100D1h ; VMM service table changed above this service
;*************************************************************************
;*************************************************************************
;*************************************************************************
;
; END OF 3.00 SERVICE TABLE MUST NOT SHUFFLE SERVICES BEFORE THIS POINT
; FOR COMPATIBILITY.
;
VMM_Service _AddFreePhysPage, VMM_ICODE
VMM_Service _PageResetHandlePAddr
VMM_Service _SetLastV86Page, VMM_ICODE
VMM_Service _GetLastV86Page
VMM_Service _MapFreePhysReg
VMM_Service _UnmapFreePhysReg
VMM_Service _XchgFreePhysReg
VMM_Service _SetFreePhysRegCalBk, VMM_ICODE
VMM_Service Get_Next_Arena, VMM_ICODE
VMM_Service Get_Name_Of_Ugly_TSR, VMM_ICODE
VMM_Service Get_Debug_Options, VMM_ICODE
;
; Bits for the ECX return of Get_Next_Arena
;
GNA_HiDOSLinked equ 0000000000000010B ; High DOS arenas were linked in
; when WIN386 was started
GNA_IsHighDOS equ 0000000000000100B ; High DOS arenas do exist
VMM_Service Set_Physical_HMA_Alias, VMM_ICODE
VMM_Service _GetGlblRng0V86IntBase, VMM_ICODE
VMM_Service _Add_Global_V86_Data_Area, VMM_ICODE
VMM_Service GetSetDetailedVMError
;
; Error code values for the GetSetDetailedVMError service. PLEASE NOTE
; that all of these error code values need to have bits set in the high
; word. This is to prevent collisions with other VMDOSAPP standard errors.
; Also, the low word must be non-zero.
;
; First set of errors (high word = 0001) are intended to be used
; when a VM is CRASHED (VNE_Crashed or VNE_Nuked bit set on
; VM_Not_Executeable).
;
; PLEASE NOTE that each of these errors (high word == 0001) actually
; has two forms:
;
; 0001xxxxh
; 8001xxxxh
;
; The device which sets the error initially always sets the error with
; the high bit CLEAR. The system will then optionally set the high bit
; depending on the result of the attempt to "nicely" crash the VM. This
; bit allows the system to tell the user whether the crash is likely or
; unlikely to destabalize the system.
;
GSDVME_PrivInst equ 00010001h ; Privledged instruction
GSDVME_InvalInst equ 00010002h ; Invalid instruction
GSDVME_InvalPgFlt equ 00010003h ; Invalid page fault
GSDVME_InvalGpFlt equ 00010004h ; Invalid GP fault
GSDVME_InvalFlt equ 00010005h ; Invalid fault, not any of abv
GSDVME_UserNuke equ 00010006h ; User requested NUKE of running
; VM
GSDVME_DevNuke equ 00010007h ; Device specific problem
GSDVME_DevNukeHdwr equ 00010008h ; Device specific problem,
; invalid hardware fiddling
; by VM (invalid I/O)
GSDVME_NukeNoMsg equ 00010009h ; Supress standard messgs,
; SHELL_Message used for
; custom msg.
GSDVME_OkNukeMask equ 80000000h ; "Nice nuke" bit
;
; Second set of errors (high word = 0002) are intended to be used
; when a VM start up is failed (VNE_CreateFail, VNE_CrInitFail, or
; VNE_InitFail bit set on VM_Not_Executeable).
;
GSDVME_InsMemV86 equ 00020001h ; base V86 mem - V86MMGR
GSDVME_InsV86Space equ 00020002h ; Kb Req too large - V86MMGR
GSDVME_InsMemXMS equ 00020003h ; XMS Kb Req - V86MMGR
GSDVME_InsMemEMS equ 00020004h ; EMS Kb Req - V86MMGR
GSDVME_InsMemV86Hi equ 00020005h ; Hi DOS V86 mem - DOSMGR
; V86MMGR
GSDVME_InsMemVid equ 00020006h ; Base Video mem - VDD
GSDVME_InsMemVM equ 00020007h ; Base VM mem - VMM
; CB, Inst Buffer
GSDVME_InsMemDev equ 00020008h ; Couldn't alloc base VM
; memory for device.
GSDVME_CrtNoMsg equ 00020009h ; Supress standard messgs,
; SHELL_Message used for
; custom msg.
VMM_Service Is_Debug_Chr
;
; Mono_Out services
;
VMM_Service Clear_Mono_Screen
VMM_Service Out_Mono_Chr
VMM_Service Out_Mono_String
VMM_Service Set_Mono_Cur_Pos
VMM_Service Get_Mono_Cur_Pos
VMM_Service Get_Mono_Chr
;
; Service locates a byte in ROM
;
VMM_Service Locate_Byte_In_ROM, VMM_ICODE
VMM_Service Hook_Invalid_Page_Fault
VMM_Service Unhook_Invalid_Page_Fault
;
; This is the structure of the "invalid page fault information"
; which is pointed to by EDI when Invalid page fault hookers
; are called.
;
; page faults can occur on a VM which is not current by touching the VM at
; its high linear address. In this case, IPF_FaultingVM may not = the
; current VM, it will be set to the VM whos high linear address was touched.
;
IPF_Data struc
IPF_LinAddr dd ? ; CR2 address of fault
IPF_MapPageNum dd ? ; Possible converted page # of fault
IPF_PTEEntry dd ? ; Contents of PTE that faulted
IPF_FaultingVM dd ? ; May not = Current VM (IPF_V86PgH set)
IPF_Flags dd ? ; Flags
IPF_Data ends
;
; Flag bits of IPF_Flags
;
; Page directory entry not-present (not pres page table)
IPF_PgDir equ 000000000000000000000000000000001b
; Unexpected not present Page in V86
IPF_V86Pg equ 000000000000000000000000000000010b
; Unexpected not present Page in V86 at high linear
IPF_V86PgH equ 000000000000000000000000000000100b
; page has invalid not present type
IPF_InvTyp equ 000000000000000000000000000001000b
; pageswap device couldn't page for some reason
IPF_PgErr equ 000000000000000000000000000010000b
; re-entrant page fault
IPF_ReFlt equ 000000000000000000000000000100000b
; Page fault caused by a VxD
IPF_VMM equ 000000000000000000000000001000000b
; Page fault caused by VM running in Prot Mode
IPF_PM equ 000000000000000000000000010000000b
; Page fault caused by VM running in V86 Mode
IPF_V86 equ 000000000000000000000000100000000b
VMM_Service Set_Delete_On_Exit_File
VMM_Service Close_VM
;
; Flags for Close_VM service
;
CVF_Continue_Exec equ 00000001b
CVF_Continue_Exec_Bit equ 0
VMM_Service Enable_Touch_1st_Meg ; Debugging only
VMM_Service Disable_Touch_1st_Meg ; Debugging only
VMM_Service Install_Exception_Handler
VMM_Service Remove_Exception_Handler
Exception_Handler_Struc STRUC
EH_Reserved dd ?
EH_Start_EIP dd ?
EH_End_EIP dd ?
EH_Handler dd ?
Exception_Handler_Struc ENDS
VMM_Service Get_Crit_Status_No_Block
.errnz Get_Crit_Status_No_Block - 100F1h ; VMM service table changed above this service
;*************************************************************************
;*************************************************************************
;*************************************************************************
;
; END OF 3.10 SERVICE TABLE MUST NOT SHUFFLE SERVICES BEFORE THIS POINT
; FOR COMPATIBILITY.
;
End_Service_Table VMM, VMM
;******************************************************************************
IFDEF DEBUG
DebFar EQU NEAR PTR
ELSE
DebFar EQU SHORT
ENDIF
BeginDoc
;******************************************************************************
;
; EQUATES FOR SYSTEM_CONTROL CALLS
;
;==============================================================================
;
; Sys_Critical_Init is a device init call. Devices that have a critical
; function that needs initializing before interrupts are enabled should
; do it at Sys_Critical_Init. Devices which REQUIRE a certain range of
; V86 pages to operate (such as the VDD video memory) should claim them
; at Sys_Critical_Init. SYS VM Simulate_Int, Exec_Int ACTIVITY IS NOT
; ALLOWED. Returning carry aborts device load only.
;
Sys_Critical_Init EQU 0000h ; Devices required for virt mode
;
; Device init is where most devices do the bulk of their initialization.
; SYS VM Simulate_Int, Exec_Int activity is allowed. Returning carry
; aborts device load only.
;
Device_Init EQU 0001h ; All other devices init
;
; Init_Complete is the final phase of device init called just before the
; WIN386 INIT pages are released and the Instance snapshot is taken.
; Devices which wish to search for a region of V86 pages >= A0h to use
; should do it at Init_Complete.
; SYS VM Simulate_Int, Exec_Int activity is allowed. Returning carry
; aborts device load only.
;
Init_Complete EQU 0002h ; All devices have initialized
;----------------- INITIALIZATION CODE AND DATA DISCARDED ---------------------
;
; Same as VM_Init, except for SYS VM.
;
Sys_VM_Init EQU 0003h ; Execute the system VM (Win86)
;
; Same as VM_Terminate, except for SYS VM (Normal WIN386 exit ONLY, on a crash
; exit this call is not made). SYS VM Simulate_Int, Exec_Int activity is
; allowed.
;
Sys_VM_Terminate EQU 0004h ; System VM terminted (exiting)
;------------------------------------------------------------------------------
;
; System_Exit call is made when WIN386 is exiting either normally or via
; a crash. INTERRUPS ARE ENABLED. Instance snapshot has been restored.
; SYS VM Simulate_Int, Exec_Int ACTIVITY IS NOT ALLOWED.
;
System_Exit EQU 0005h ; Devices prepare to exit
;
; System_Exit call is made when WIN386 is exiting either normally or via
; a crash. INTERRUPS ARE DISABLED. SYS VM Simulate_Int, Exec_Int ACTIVITY
; IS NOT ALLOWED.
;
Sys_Critical_Exit EQU 0006h ; System critical devices reset
;
; Create_VM creates a new VM. EBX = VM handle of new VM. Returning Carry will
; fail the Create_VM.
;
Create_VM EQU 0007h
;
; Second phase of Create_VM. EBX = VM handle of new VM. Returning Carry will
; cause the VM to go Not_Executeable, then be destroyed. VM Simulate_Int,
; Exec_Int activity is NOT allowed.
;
VM_Critical_Init EQU 0008h
;
; Third phase of Create_VM. EBX = VM handle of new VM. Returning Carry will
; cause the VM to go Not_Executeable, then be destroyed. VM Simulate_Int,
; Exec_Int activity is allowed.
;
VM_Init EQU 0009h
;
; NORMAL (First phase) of Destroy_VM. EBX = VM Hanlde. This occurs on normal
; termination of the VM. Call cannot be failed. VM Simulate_Int, Exec_Int
; activity is allowed.
;
VM_Terminate EQU 000Ah ; Still in VM -- About to die
;
; Second phase of Destroy_VM. EBX = VM Handle, EDX = Flags (see below). Note
; that in the case of destroying a running VM, this is the first call made
; (VM_Terminate call does not occur). Call cannot be failed. VM Simulate_Int,
; Exec_Int activity is NOT allowed.
;
VM_Not_Executeable EQU 000Bh ; Most devices die (except VDD)
;
; Final phase of Destroy_VM. EBX = VM Handle. Note that considerable time
; can elaps between the VM_Not_Executeable call and this call. Call cannot
; be failed. VM Simulate_Int, Exec_Int activity is NOT allowed.
;
Destroy_VM EQU 000Ch ; VM's control block about to go
;
; Flags for VM_Not_Executeable control call (passed in EDX)
;
VNE_Crashed EQU 0000000000000000000000001b
VNE_Crashed_Bit EQU 0 ; VM was crashed
VNE_Nuked EQU 0000000000000000000000010b
VNE_Nuked_Bit EQU 1 ; VM was destroyed while active
VNE_CreateFail EQU 0000000000000000000000100b
VNE_CreateFail_Bit EQU 2 ; Some device failed Create_VM
VNE_CrInitFail EQU 0000000000000000000001000b
VNE_CrInitFail_Bit EQU 3 ; Some device failed VM_Critical_Init
VNE_InitFail EQU 0000000000000000000010000b
VNE_InitFail_Bit EQU 4 ; Some device failed VM_Init
VNE_Closed EQU 0000000000000000000100000b
VNE_Closed_Bit EQU 5
;------------------------------------------------------------------------------
;
; EBX = VM Handle. Call cannot be failed.
;
VM_Suspend EQU 000Dh ; VM not runnable until resume
;
; EBX = VM Handle. Returning carry fails and backs out the resume.
;
VM_Resume EQU 000Eh ; VM is leaving suspended state
;------------------------------------------------------------------------------
;
; EBX = VM Handle to set device focus to. EDX = Device ID if device specific
; setfocus. == 0 if device critical setfocus (all devices). THIS CALL CANNOT
; BE FAILED.
;
; NOTE: In case where EDX == 0, ESI is a FLAG word that indicates special
; functions. Currently Bit 0 being set indicates that this Device
; critical set focus is also "VM critical". It means that we do not
; want some other VM to take the focus from this app now. This is
; primarily used when doing a device critical set focus to Windows
; (the SYS VM) it is interpreted by the SHELL to mean "if an old app
; currently has the Windows activation, set the activation to the
; Windows Shell, not back to the old app". ALSO in the case where
; Bit 0 is set, EDI = The VM handle of the VM that is "having trouble".
; Set this to 0 if there is no specific VM associated with the problem.
;
Set_Device_Focus EQU 000Fh
;------------------------------------------------------------------------------
;
; EBX = VM Handle going into message mode. THIS CALL CANNOT BE FAILED.
;
Begin_Message_Mode EQU 0010h
;
; EBX = VM Handle leaving message mode. THIS CALL CANNOT BE FAILED.
;
End_Message_Mode EQU 0011h
;------------------------- SPECIAL CONTROL CALLS ------------------------------
;
; Request for reboot. Call cannot be failed.
;
Reboot_Processor EQU 0012h ; Request a machine reboot
;
; Query_Destroy is an information call made by the SHELL device before an
; attempt is made to initiate a destroy VM sequence on a running VM which
; has not exited normally. EBX = VM Handle. Returning carry indicates that
; a device "has a problem" with allowing this. THE DESTROY SEQUENCE CANNOT
; BE ABORTED HOWEVER, this decision is up to the user. All this does is
; indicate that there is a "problem" with allowing the destroy. The device
; which returns carry should call the SHELL_Message service to post an
; informational dialog about the reason for the problem.
;
Query_Destroy EQU 0013h ; OK to destroy running VM?
;------------------------- DEBUGGING CONTROL CALL -----------------------------
;
; Special call for device specific DEBUG information display and activity.
;
Debug_Query EQU 0014h
;---------- CALLS FOR BEGIN/END OF PROTECTED MODE VM EXECUTION ----------------
;
; About to run a protected mode application.
; EBX = Current VM handle.
; EDX = Flags
; EDI -> Application Control Block
; Returning with carry set fails the call.
;
Begin_PM_App EQU 0015h
;
; Flags for Begin_PM_App (passed in EDX)
;
BPA_32_Bit EQU 00000001b
BPA_32_Bit_Flag EQU 1
;
; Protected mode application is terminating.
; EBX = Current VM handle. THIS CALL CAN NOT FAIL.
; EDI -> Application Control Block
;
End_PM_App EQU 0016h
;
; Called whenever system is about to be rebooted. Allows VxDs to clean
; up in preperation for reboot.
;
Device_Reboot_Notify EQU 0017h
Crit_Reboot_Notify EQU 0018h
;
; Called when VM is about to be termintate using the Close_VM service
; EBX = Current VM handle (Handle of VM to close)
; EDX = Flags
; CVNF_Crit_Close = 1 if VM is in critical section while closing
;
Close_VM_Notify EQU 0019h
CVNF_Crit_Close EQU 00000001b
CVNF_Crit_Close_Bit EQU 0
;
; Power management event notification.
; EBX = 0
; ESI = event notification message
; EDI -> DWORD return value; VxD's modify the DWORD to return info, not EDI
; EDX is reserved
;
Power_Event EQU 001Ah
EndDoc
BeginDoc
;******************************************************************************
; BeginProc is a macro for defining entry points to routines in VMM and in the
; VxDs. It correctly defines the procedure name for VxD services(it prepends
; a "@" to the procedure name), DWORD aligns the procedure, takes care of
; public declaration and does some calling verification for debug versions
; of the software. EndProc is a macro which defines the end of the procedure.
;
; Valid parameters to the BeginProc macro are:
; PUBLIC ; Routine used outside this module
; HIGH_FREQ ; DWORD align procedure
; SERVICE ; Routine is called via VxDCall
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -