📄 vmm.inc
字号:
VMM_Service Simulate_Iret
VMM_Service Simulate_Far_Call
VMM_Service Simulate_Far_Jmp
VMM_Service Simulate_Far_Ret
VMM_Service Simulate_Far_Ret_N
VMM_Service Build_Int_Stack_Frame
VMM_Service Simulate_Push
VMM_Service Simulate_Pop
;
; Heap Manager
;
VMM_Service _HeapAllocate
VMM_Service _HeapReAllocate
VMM_Service _HeapFree
VMM_Service _HeapGetSize
; ---------------------------------------------------
;
; Flags for heap allocator calls
;
; ---------------------------------------------------
HeapZeroInit equ 00000000000000000000000000000001B
HeapZeroReInit equ 00000000000000000000000000000010B
HeapNoCopy equ 00000000000000000000000000000100B
; NOTE: HIGH 8 BITS (bits 24-31) are reserved
;
; Page Manager
;
VMM_Service _PageAllocate
VMM_Service _PageReAllocate
VMM_Service _PageFree
VMM_Service _PageLock
VMM_Service _PageUnLock
VMM_Service _PageGetSizeAddr
VMM_Service _PageGetAllocInfo
VMM_Service _GetFreePageCount
VMM_Service _GetSysPageCount
VMM_Service _GetVMPgCount
VMM_Service _MapIntoV86
VMM_Service _PhysIntoV86
VMM_Service _TestGlobalV86Mem
VMM_Service _ModifyPageBits
VMM_Service _CopyPageTable
VMM_Service _LinMapIntoV86
VMM_Service _LinPageLock
VMM_Service _LinPageUnLock
VMM_Service _SetResetV86Pageable
VMM_Service _GetV86PageableArray
VMM_Service _PageCheckLinRange
VMM_Service _PageOutDirtyPages
VMM_Service _PageDiscardPages
; ---------------------------------------------------
;
; Flags for other page allocator calls
;
; ---------------------------------------------------
PageZeroInit equ 00000000000000000000000000000001B
PageUseAlign equ 00000000000000000000000000000010B
PageContig equ 00000000000000000000000000000100B
PageFixed equ 00000000000000000000000000001000B
PageDEBUGNulFault equ 00000000000000000000000000010000B
PageZeroReInit equ 00000000000000000000000000100000B
PageNoCopy equ 00000000000000000000000001000000B
PageLocked equ 00000000000000000000000010000000B
PageLockedIfDP equ 00000000000000000000000100000000B
PageSetV86Pageable equ 00000000000000000000001000000000B
PageClearV86Pageable equ 00000000000000000000010000000000B
PageSetV86IntsLocked equ 00000000000000000000100000000000B
PageClearV86IntsLocked equ 00000000000000000001000000000000B
PageMarkPageOut equ 00000000000000000010000000000000B
PagePDPSetBase equ 00000000000000000100000000000000B
PagePDPClearBase equ 00000000000000001000000000000000B
PageDiscard equ 00000000000000010000000000000000B
PagePDPQueryDirty equ 00000000000000100000000000000000B
; NOTE: HIGH 8 BITS (bits 24-31) are reserved
;
; Informational services
;
VMM_Service _GetNulPageHandle
VMM_Service _GetFirstV86Page
VMM_Service _MapPhysToLinear
VMM_Service _GetAppFlatDSAlias
VMM_Service _SelectorMapFlat
VMM_Service _GetDemandPageInfo
;
; Data structure for _GetDemandPageInfo
;
DemandInfoStruc struc
DILin_Total_Count dd ? ; # pages in linear address space
DIPhys_Count dd ? ; Count of phys pages
DIFree_Count dd ? ; Count of free phys pages
DIUnlock_Count dd ? ; Count of unlocked Phys Pages
DILinear_Base_Addr dd ? ; Base of pageable address space
DILin_Total_Free dd ? ; Total Count of free linear pages
DIReserved dd 10 dup (?) ; Resvd for expansion
DemandInfoStruc ends
VMM_Service _GetSetPageOutCount
;
; Flags bits for _GetSetPageOutCount
;
GSPOC_F_Get equ 00000000000000000000000000000001B
;
; Device VM page manager
;
VMM_Service Hook_V86_Page
VMM_Service _Assign_Device_V86_Pages
VMM_Service _DeAssign_Device_V86_Pages
VMM_Service _Get_Device_V86_Pages_Array
VMM_Service MMGR_SetNULPageAddr
;
; GDT/LDT management
;
VMM_Service _Allocate_GDT_Selector
VMM_Service _Free_GDT_Selector
VMM_Service _Allocate_LDT_Selector
VMM_Service _Free_LDT_Selector
VMM_Service _BuildDescriptorDWORDs
;
; Flag equates for _BuildDescriptorDWORDs
;
BDDExplicitDPL EQU 00000000000000000000000000000001B
;
; Flag equates for _Allocate_LDT_Selector
;
ALDTSpecSel EQU 00000000000000000000000000000001B
VMM_Service _GetDescriptor
VMM_Service _SetDescriptor
VMM_Service _MMGR_Toggle_HMA
;
; Flag equates for _MMGR_Toggle_HMA
;
MMGRHMAPhysical EQU 00000000000000000000000000000001B
MMGRHMAEnable EQU 00000000000000000000000000000010B
MMGRHMADisable EQU 00000000000000000000000000000100B
MMGRHMAQuery EQU 00000000000000000000000000001000B
VMM_Service Get_Fault_Hook_Addrs, LOCAL
VMM_Service Hook_V86_Fault, LOCAL
VMM_Service Hook_PM_Fault, LOCAL
VMM_Service Hook_VMM_Fault, LOCAL
VMM_Service Begin_Nest_V86_Exec
VMM_Service Begin_Nest_Exec
VMM_Service Exec_Int
VMM_Service Resume_Exec
VMM_Service End_Nest_Exec
VMM_Service Allocate_PM_App_CB_Area, VMM_ICODE
VMM_Service Get_Cur_PM_App_CB
VMM_Service Set_V86_Exec_Mode
VMM_Service Set_PM_Exec_Mode
VMM_Service Begin_Use_Locked_PM_Stack
VMM_Service End_Use_Locked_PM_Stack
VMM_Service Save_Client_State
VMM_Service Restore_Client_State
VMM_Service Exec_VxD_Int
VMM_Service Hook_Device_Service, LOCAL
VMM_Service Hook_Device_V86_API
VMM_Service Hook_Device_PM_API
VMM_Service System_Control
;
; I/O and software interrupt hooks
;
VMM_Service Simulate_IO
VMM_Service Install_Mult_IO_Handlers
VMM_Service Install_IO_Handler
VMM_Service Enable_Global_Trapping
VMM_Service Enable_Local_Trapping
VMM_Service Disable_Global_Trapping
VMM_Service Disable_Local_Trapping
;
; Linked List Abstract Data Type Services
;
VMM_Service List_Create
VMM_Service List_Destroy
VMM_Service List_Allocate
VMM_Service List_Attach
VMM_Service List_Attach_Tail
VMM_Service List_Insert
VMM_Service List_Remove
VMM_Service List_Deallocate
VMM_Service List_Get_First
VMM_Service List_Get_Next
VMM_Service List_Remove_First
;
; Flags used by List_Create
;
LF_Async EQU 00000001b
LF_Async_Bit EQU 0
LF_Use_Heap EQU 00000010b
LF_Use_Heap_Bit EQU 1
LF_Alloc_Error EQU 00000100b
LF_Alloc_Error_Bit EQU 2
;==============================================================================
; I N I T I A L I Z A T I O N P R O C E D U R E S
;------------------------------------------------------------------------------
;
; Instance data manager
;
VMM_Service _AddInstanceItem
;
; Data structure for _AddInstanceItem
;
InstDataStruc struc
InstLinkF dd 0 ; RESERVED SET TO 0
InstLinkB dd 0 ; RESERVED SET TO 0
InstLinAddr dd ? ; Linear address of start of block
InstSize dd ? ; Size of block in bytes
InstType dd ? ; Type of block
InstDataStruc ends
;
; Values for InstType
;
INDOS_Field equ 100h ; Bit indicating INDOS switch requirements
ALWAYS_Field equ 200h ; Bit indicating ALWAYS switch requirements
;
; System structure data manager
;
VMM_Service _Allocate_Device_CB_Area, VMM_ICODE
VMM_Service _Allocate_Global_V86_Data_Area, VMM_ICODE
VMM_Service _Allocate_Temp_V86_Data_Area, VMM_ICODE
VMM_Service _Free_Temp_V86_Data_Area, VMM_ICODE
;
; Flag bits for _Allocate_Global_VM_Data_Area
;
GVDAWordAlign EQU 00000000000000000000000000000001B
GVDADWordAlign EQU 00000000000000000000000000000010B
GVDAParaAlign EQU 00000000000000000000000000000100B
GVDAPageAlign EQU 00000000000000000000000000001000B
GVDAInstance EQU 00000000000000000000000100000000B
GVDAZeroInit EQU 00000000000000000000001000000000B
GVDAReclaim EQU 00000000000000000000010000000000B
;
; Initialization information calls (win.ini and environment parameters)
;
VMM_Service Get_Profile_Decimal_Int, VMM_ICODE
VMM_Service Convert_Decimal_String, VMM_ICODE
VMM_Service Get_Profile_Fixed_Point, VMM_ICODE
VMM_Service Convert_Fixed_Point_String, VMM_ICODE
VMM_Service Get_Profile_Hex_Int, VMM_ICODE
VMM_Service Convert_Hex_String, VMM_ICODE
VMM_Service Get_Profile_Boolean, VMM_ICODE
VMM_Service Convert_Boolean_String, VMM_ICODE
VMM_Service Get_Profile_String, VMM_ICODE
VMM_Service Get_Next_Profile_String, VMM_ICODE
VMM_Service Get_Environment_String, VMM_ICODE
VMM_Service Get_Exec_Path, VMM_ICODE
VMM_Service Get_Config_Directory, VMM_ICODE
VMM_Service OpenFile, VMM_ICODE
VMM_Service Get_PSP_Segment, VMM_ICODE
VMM_Service GetDOSVectors, VMM_ICODE
VMM_Service Get_Machine_Info
GMIF_80486 EQU 00010000h
GMIF_80486_Bit EQU 10h
GMIF_PCXT EQU 00020000h
GMIF_PCXT_Bit EQU 11h
GMIF_MCA EQU 00040000h
GMIF_MCA_Bit EQU 12h
GMIF_EISA EQU 00080000h
GMIF_EISA_Bit EQU 13h
;
; Following service is not restricted to initialization
;
VMM_Service GetSet_HMA_Info
VMM_Service Set_System_Exit_Code
VMM_Service Fatal_Error_Handler
VMM_Service Fatal_Memory_Error
;
; Called by VTD only
;
VMM_Service Update_System_Clock
;==============================================================================
; D E B U G G I N G E X T E R N S
;==============================================================================
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
.errnz Debug_Test_Cur_VM - 100CCh ; VMM service table changed above this service
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
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
;------------------------------------------------------------------------------
;
; 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
EndDoc
BeginDoc
;******************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -