📄 vmm.h
字号:
Local_Seg&&_SEG
ELSE
Def_Segment&_CODE_SEG
ENDIF
IFNB <Condition>
$$&&Procedure extern
ELSE
extrnproc
ENDIF
IFNB <Local_Seg>
Local_Seg&&_ENDS
ELSE
Def_Segment&_CODE_ENDS
ENDIF
ENDIF
IFNB <Condition>
$$&&Procedure
ELSE
tableproc
ENDIF
IFDEF Device_Name&_Name_Based
@@&&Procedure = (Device_Name&_Internal_ID SHL 16) + Num_&Device_Name&_Services
ELSE
@@&&Procedure = (Device_Name&_Device_ID SHL 16) + Num_&Device_Name&_Services
ENDIF
ELSE
dd 0
ENDIF
ELSE
dd 0
ENDIF
Num_&Device_Name&_Services = Num_&Device_Name&_Services + 1
IFNB <Condition>
Purge $$&&Procedure
ENDIF
Purge extrnproc
Purge tableproc
ENDM
Device_Name&_StdCall_Service MACRO Procedure, Args, Local_Seg, Condition
Device_Name&_Service Procedure, Local_Seg, Condition, %Args*4
??_standardccall&&_Procedure = Args
ENDM
Device_Name&_FastCall_Service MACRO Procedure, Args, Local_Seg, Condition
Device_Name&_Service Procedure, Local_Seg, Condition, %Args*4, TRUE
??_fastcall&&_Procedure = Args
ENDM
ELSE
; Local_Seg and Condition are placeholders only in this form
IFDEF Device_Name&_Name_Based
Device_Name&_Service MACRO Procedure, Local_Seg, Condition
IFDIFI <Procedure>, <RESERVED>
@@&&Procedure = (Device_Name&_Internal_ID SHL 16) + Num_&Device_Name&_Services
ENDIF
Num_&Device_Name&_Services = Num_&Device_Name&_Services + 1
ENDM
ELSE
Device_Name&_Service MACRO Procedure, Local_Seg, Condition
IFDIFI <Procedure>, <RESERVED>
@@&&Procedure = (Device_Name&_Device_ID SHL 16) + Num_&Device_Name&_Services
ENDIF
Num_&Device_Name&_Services = Num_&Device_Name&_Services + 1
ENDM
ENDIF
Device_Name&_StdCall_Service MACRO Procedure, Args, Local_Seg, Condition
Device_Name&_Service Procedure, Local_Seg, Condition
??_standardccall_&&Procedure = Args
ENDM
Device_Name&_FastCall_Service MACRO Procedure, Args, Local_Seg, Condition
Device_Name&_Service Procedure, Local_Seg, Condition
??_fastcall_&&Procedure = Args
ENDM
ENDIF
ENDM
;------------------------------------------------------------------------------
End_Service_Table MACRO Device_Name, Def_Segment
PURGE Device_Name&_Service
IFDEF Create_&Device_Name&_Service_Table
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
#ifndef FASTCALL
#define FASTCALL __fastcall
#endif
/*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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -