📄 vmm.h
字号:
IFB <Def_Segment>
VxD_LOCKED_DATA_ENDS
ELSE
Def_Segment&_LOCKED_DATA_ENDS
ENDIF
ENDIF
ENDM
GetVxDServiceOrdinal macro reg,service
mov reg,@@&service
endm
GetVxDServiceAddress macro reg,service
mov reg,OFFSET32 service
endm
;*** Begin_Win32_Services - begin defining Win32 Service Table
;
; This macro is used to begin the definition of the Win32
; Service table. It is modelled after, but not identical
; to, the Begin_Service_Table macro. If the the special
; symbol Create_Win32_Services is defined to be true, then
; the actual table is emitted. Otherwise, only the service
; numbers are defined.
;
; ENTRY VxDName - the name of the VxD; it is assumed
; that a corresponding Device_ID is
; also defined.
; EXIT The macro VxDName&_Win32_Sevice is defined; it
; accepts a service name as its only parameter.
; This macro is then used to define each service.
Begin_Win32_Services MACRO VxDName
ifndef Create_Win32_Services
Create_Win32_Services = 0
endif
.errb <VxDName>, <VxD name missing>
??w32svcno = 0
if Create_Win32_Services
VxDName&_Win32_Services label dword
dd csvc&VxDName, 0
endif
??inw32svc = 1
VxDName&_Win32_Service MACRO Name
.erre ??inw32svc, <Missing Begin_Win32_Services>
if Create_Win32_Services
dd OFFSET32 Name,cparm&&Name
endif
@32&&Name equ ((VxDName&_Device_ID SHL 16) + ??w32svcno)
??w32svcno = ??w32svcno + 1
ENDM
ENDM
;*** End_Win32_Services - mark end of Win32 Service Table
;
; This macro completes initialization of the Win32
; Service table.
;
; ENTRY VxDName - the same name passed to
; Begin_Win32_services
End_Win32_Services MACRO VxDName
.errb <VxDName>, <VxD name misssing>
if Create_Win32_Services
csvc&VxDName equ ($ - VxDName&_Win32_Services)/8 - 1
endif
??inw32svc = 0
PURGE VxDName&_Win32_Service
ENDM
;*** Declare_Win32_Service - declare an external Win32 Service
;
; This macro is used to declare a Win32 service that
; is defined elsewhere, perhaps in a C module.
;
; ENTRY Name - the service name
; cParms - the number of DWORD parameters
; EXIT The name is defined as external
Declare_Win32_Service MACRO Name, cParms
ifndef Create_Win32_Services
Create_Win32_Services = 0
endif
if Create_Win32_Services
?merge <Name>,,,,<EQU>,<_>,<Name>,<@>,%(cParms*4 + 8)
?merge <cparm>,<Name>,,,<EQU>,<cParms>
VxD_CODE_SEG
?merge <EXTRN>,,,,,<_>,<Name>,<@>,%(cParms*4 + 8),<:NEAR>
VxD_CODE_ENDS
endif
ENDM
;*** Win32call - call a Win32 service from a ring 3 thunk
;
; This macro is used to call a Win32 service from
; a ring 3 thunk. Note that control will not return
; to the instruction following the call, but to the
; instruction following the call to the thunk.
;
; ENTRY Service - the name of the service
; CallBack - the fword containing the callback
Win32call MACRO Service, CallBack
ifndef Create_Win32_Services
Create_Win32_Services = 0
endif
ife Create_Win32_Services
mov eax,@32&Service
ifdef IS_16
movzx esp,sp
endif
call fword ptr [CallBack]
ifdef DEBUG
int 3
endif
endif
ENDM
*/
/*XLATOFF*/
#define GetVxDServiceAddress(service) service
#define VxDCall(service) \
_asm _emit 0xcd \
_asm _emit 0x20 \
_asm _emit (GetVxDServiceOrdinal(service) & 0xff) \
_asm _emit (GetVxDServiceOrdinal(service) >> 8) & 0xff \
_asm _emit (GetVxDServiceOrdinal(service) >> 16) & 0xff \
_asm _emit (GetVxDServiceOrdinal(service) >> 24) & 0xff \
#define VMMCall VxDCall
#define VxDJmp(service) \
_asm _emit 0xcd \
_asm _emit 0x20 \
_asm _emit (GetVxDServiceOrdinal(service) & 0xff) \
_asm _emit ((GetVxDServiceOrdinal(service) >> 8) & 0xff) | 0x80 \
_asm _emit (GetVxDServiceOrdinal(service) >> 16) & 0xff \
_asm _emit (GetVxDServiceOrdinal(service) >> 24) & 0xff \
#define VMMJmp VxDJmp
#define SERVICE __cdecl
#define ASYNC_SERVICE __cdecl
#define WIN32_SERVICE void __stdcall
/*XLATON*/
/* ASM
;******************************************************************************
;
; Dword_Align -- Aligns code to dword boundry by inserting nops
;
;------------------------------------------------------------------------------
Dword_Align MACRO Seg_Name
LOCAL segn
IFDEF MASM6
align 4
ELSE
IFNB <Seg_Name>
segn equ Seg_Name
ELSE
IFE ?_LCODE
segn equ <_LTEXT>
ELSE
IFE ?_ICODE
segn equ <_ITEXT>
ELSE
IFE ?_PCODE
segn equ <_PTEXT>
ELSE
IFE ?_SCODE
segn equ <_STEXT>
ELSE
.err <Dword_Align not supported>
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF (($-OFFSET segn:0) MOD 4)
db 4 - (($-OFFSET segn:0) MOD 4) DUP (90h)
ENDIF
ENDIF
ENDM
BeginDoc
;******************************************************************************
;
; Fatal_Error
;
; DESCRIPTION:
; This macro is used to crash Windows/386 when an unrecoverable error
; is detected. If Msg_Ptr is ommitted then no error message will be
; displayed, otherwise Msg_Ptr is the address
; when the
;
; PARAMETERS:
; Msg_Ptr (OPTIONAL) - Points to an ASCIIZ string to display.
;
; EXIT:
; To DOS (hopefully). This macro never returns.
;
;==============================================================================
EndDoc
Fatal_Error MACRO Msg_Ptr, Exit_Flags
pushad
IFB <Msg_Ptr>
xor esi, esi
ELSE
mov esi, Msg_Ptr
IFB <Exit_Flags>
xor eax, eax
ELSE
mov eax, Exit_Flags
ENDIF
ENDIF
VMMCall Fatal_Error_Handler
ENDM
EF_Hang_On_Exit EQU 1h
*/
/******************************************************************************
*
* The following are control block headers and flags of interest to VxDs.
*
*****************************************************************************/
struct cb_s {
ULONG CB_VM_Status; /* VM status flags */
ULONG CB_High_Linear; /* Address of VM mapped high */
ULONG CB_Client_Pointer;
ULONG CB_VMID;
ULONG CB_Signature;
};
#define VMCB_ID 0x62634D56 /* VMcb */
/*
* VM status indicates globally interesting VM states
*/
#define VMSTAT_EXCLUSIVE_BIT 0x00 /* VM is exclusive mode */
#define VMSTAT_EXCLUSIVE (1L << VMSTAT_EXCLUSIVE_BIT)
#define VMSTAT_BACKGROUND_BIT 0x01 /* VM runs in background */
#define VMSTAT_BACKGROUND (1L << VMSTAT_BACKGROUND_BIT)
#define VMSTAT_CREATING_BIT 0x02 /* In process of creating */
#define VMSTAT_CREATING (1L << VMSTAT_CREATING_BIT)
#define VMSTAT_SUSPENDED_BIT 0x03 /* VM not scheduled */
#define VMSTAT_SUSPENDED (1L << VMSTAT_SUSPENDED_BIT)
#define VMSTAT_NOT_EXECUTEABLE_BIT 0x04 /* VM partially destroyed */
#define VMSTAT_NOT_EXECUTEABLE (1L << VMSTAT_NOT_EXECUTEABLE_BIT)
#define VMSTAT_PM_EXEC_BIT 0x05 /* Currently in PM app */
#define VMSTAT_PM_EXEC (1L << VMSTAT_PM_EXEC_BIT)
#define VMSTAT_PM_APP_BIT 0x06 /* PM app present in VM */
#define VMSTAT_PM_APP (1L << VMSTAT_PM_APP_BIT)
#define VMSTAT_PM_USE32_BIT 0x07 /* PM app is 32-bit */
#define VMSTAT_PM_USE32 (1L << VMSTAT_PM_USE32_BIT)
#define VMSTAT_VXD_EXEC_BIT 0x08 /* Call from VxD */
#define VMSTAT_VXD_EXEC (1L << VMSTAT_VXD_EXEC_BIT)
#define VMSTAT_HIGH_PRI_BACK_BIT 0x09 /* High pri background */
#define VMSTAT_HIGH_PRI_BACK (1L << VMSTAT_HIGH_PRI_BACK_BIT)
#define VMSTAT_BLOCKED_BIT 0x0A /* Blocked on semaphore */
#define VMSTAT_BLOCKED (1L << VMSTAT_BLOCKED_BIT)
#define VMSTAT_AWAKENING_BIT 0x0B /* Woke up after blocked */
#define VMSTAT_AWAKENING (1L << VMSTAT_AWAKENING_BIT)
#define VMSTAT_PAGEABLEV86BIT 0x0C /* part of V86 is pageable (PM app) */
#define VMSTAT_PAGEABLEV86_BIT VMSTAT_PAGEABLEV86BIT
#define VMSTAT_PAGEABLEV86 (1L << VMSTAT_PAGEABLEV86BIT)
#define VMSTAT_V86INTSLOCKEDBIT 0x0D /* Locked regardless of pager type */
#define VMSTAT_V86INTSLOCKED_BIT VMSTAT_V86INTSLOCKEDBIT
#define VMSTAT_V86INTSLOCKED (1L << VMSTAT_V86INTSLOCKEDBIT)
#define VMSTAT_IDLE_TIMEOUT_BIT 0x0E /* Scheduled by time-slicer */
#define VMSTAT_IDLE_TIMEOUT (1L << VMSTAT_IDLE_TIMEOUT_BIT)
#define VMSTAT_IDLE_BIT 0x0F /* VM has released time slice */
#define VMSTAT_IDLE (1L << VMSTAT_IDLE_BIT)
#define VMSTAT_CLOSING_BIT 0x10 /* Close_VM called for VM */
#define VMSTAT_CLOSING (1L << VMSTAT_CLOSING_BIT)
#define VMSTAT_TS_SUSPENDED_BIT 0x11 /* VM suspended by */
#define VMSTAT_TS_SUSPENDED (1L << VMSTAT_TS_SUSPENDED_BIT)
#define VMSTAT_TS_MAXPRI_BIT 0x12 /* this is fgd_pri 10,000 internally*/
#define VMSTAT_TS_MAXPRI (1L << VMSTAT_TS_MAXPRI_BIT)
#define VMSTAT_USE32_MASK (VMSTAT_PM_USE32 | VMSTAT_VXD_EXEC)
struct tcb_s {
ULONG TCB_Flags; /* Thread status flags */
ULONG TCB_Reserved1; /* Used internally by VMM */
ULONG TCB_Reserved2; /* Used internally by VMM */
ULONG TCB_Signature;
ULONG TCB_ClientPtr; /* Client registers of thread */
ULONG TCB_VMHandle; /* VM that thread is part of */
USHORT TCB_ThreadId; /* Unique Thread ID */
USHORT TCB_PMLockOrigSS; /* Original SS:ESP before lock stack */
ULONG TCB_PMLockOrigESP;
ULONG TCB_PMLockOrigEIP; /* Original CS:EIP before lock stack */
ULONG TCB_PMLockStackCount;
USHORT TCB_PMLockOrigCS;
USHORT TCB_PMPSPSelector;
ULONG TCB_ThreadType; /* dword passed to VMMCreateThread */
USHORT TCB_pad1; /* reusable; for dword align */
UCHAR TCB_pad2; /* reusable; for dword align */
UCHAR TCB_extErrLocus; /* extended error Locus */
USHORT TCB_extErr; /* extended error Code */
UCHAR TCB_extErrAction; /* " " Action */
UCHAR TCB_extErrClass; /* " " Class */
ULONG TCB_extErrPtr; /* " pointer */
};
typedef struct tcb_s TCB;
typedef TCB *PTCB;
#define SCHED_OBJ_ID_THREAD 0x42434854 // THCB in ASCII
/*
* Thread status indicates globally interesting thread states.
* Flags are for information only and must not be modified.
*/
#define THFLAG_SUSPENDED_BIT 0x03 // Thread not scheduled
#define THFLAG_SUSPENDED (1L << THFLAG_SUSPENDED_BIT)
#define THFLAG_NOT_EXECUTEABLE_BIT 0x04 // Thread partially destroyed
#define THFLAG_NOT_EXECUTEABLE (1L << THFLAG_NOT_EXECUTEABLE_BIT)
#define THFLAG_THREAD_CREATION_BIT 0x08 // Thread in status nascendi
#define THFLAG_THREAD_CREATION (1L << THFLAG_THREAD_CREATION_BIT)
#define THFLAG_THREAD_BLOCKED_BIT 0x0A // Blocked on semaphore
#define THFLAG_THREAD_BLOCKED (1L << THFLAG_THREAD_BLOCKED_BIT)
#define THFLAG_RING0_THREAD_BIT 0x1C // thread runs only at ring 0
#define THFLAG_RING0_THREAD (1L << THFLAG_RING0_THREAD_BIT)
#define THFLAG_CHARSET_BITS 0x10 // Default character set
#define THFLAG_CHARSET_MASK (3L << THFLAG_CHARSET_BITS)
#define THFLAG_ANSI (0L << THFLAG_CHARSET_BITS)
#define THFLAG_OEM (1L << THFLAG_CHARSET_BITS)
#define THFLAG_UNICODE (2L << THFLAG_CHARSET_BITS)
#define THFLAG_RESERVED (3L << THFLAG_CHARSET_BITS)
#define THFLAG_EXTENDED_HANDLES_BIT 0x12 // Thread uses extended file handles
#define THFLAG_EXTENDED_HANDLES (1L << THFLAG_EXTENDED_HANDLES_BIT)
/* the win32 loader opens win32 exes with this bit set to notify IFS
* so a defragger won't move these files
* the bit is turned off once the open completes.
* file open flags are overloaded which is why this is here
*/
#define THFLAG_OPEN_AS_IMMOVABLE_FILE_BIT 0x13 // File thus opened not moved
#define THFLAG_OPEN_AS_IMMOVABLE_FILE (1L << THFLAG_OPEN_AS_IMMOVABLE_FILE_BIT)
/*
* Protected mode application control blocks
*/
struct pmcb_s {
ULONG PMCB_Flags;
ULONG PMCB_Parent;
};
/*
* The reference data for fault error codes 1-5 (GSDVME_PRIVINST through
* GSDVME_INVALFLT) is a pointer to the following fault information structure.
*/
struct VMFaultInfo {
ULONG VMFI_EIP; // faulting EIP
WORD VMFI_CS; // faulting CS
WORD VMFI_Ints; // interrupts in service, if any
};
typedef struct VMFaultInfo *PVMFaultInfo;
/******************************************************************************
* V M M S E R V I C E S
******************************************************************************/
/*XLATOFF*/
#define VMM_Service Declare_Service
#pragma warning (disable:4003) // turn off not enough params warning
/*XLATON*/
/*MACROS*/
Begin_Service_Table(VMM, VMM)
VMM_Service (Get_VMM_Version, LOCAL) // MUST REMAIN SERVICE 0!
VMM_Service (Get_Cur_VM_Handle)
VMM_Service (Test_Cur_VM_Handle)
VMM_Service (Get_Sys_VM_Handle)
VMM_Service (Test_Sys_VM_Handle)
VMM_Service (Validate_VM_Handle)
VMM_Service (Get_VMM_Reenter_Count)
VMM_Service (Begin_Reentrant_Execution)
VMM_Service (End_Reentrant_Execution)
VMM_Service (Install_V86_Break_Point)
VMM_Service (Remove_V86_Break_Point)
VMM_Service (Allocate_V86_Call_Back)
VMM_Service (Allocate_PM_Call_Back)
VMM_Service (Call_When_VM_Returns)
VMM_Service (Schedule_Global_Event)
VMM_Service (Schedule_VM_Event)
VMM_Service (Call_Global_Event)
VMM_Service (Call_VM_Event)
VMM_Service (Cancel_Global_Event)
VMM_Service (Cancel_VM_Event)
VMM_Service (Call_Priority_VM_Event)
VMM_Service (Cancel_Priority_VM_Event)
VMM_Service (Get_NMI_Handler_Addr)
VMM_Service (Set_NMI_Handler_Addr)
VMM_Service (Hook_NMI_Event)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -