vmm.inc
来自「用于查询PC机上的USB端口是否有设备挂接上」· INC 代码 · 共 2,876 行 · 第 1/5 页
INC
2,876 行
endif
endif
endif
endif
endif
if ??_esp
??_basereg equ <esp+??_pushed>
??_initaframe = 4
else
??_basereg equ <ebp>
??_initaframe = 8
endif
@Caller equ <dword ptr [??_basereg+??_initaframe-4]>
??_cleanoff = ??_pcall or ??_scall or ??_fastcall
??_dfs = ??_never_reenter + ??_test_reenter + ??_not_swapping + \
??_log + ??_profile + ??_test_cld + ??_might_block
if ??_prolog_disabled
??_dfs = 0
endif
ifndef Not_VxD
if ??_hook
if ??_align
Dword_Align
endif
prelabeldata:
ifndef ??_hookvar
.err <HOOK_PROC requires next arg to be name of dword location>
endif
jmp short Name
jmp [??_hookvar]
ifdef DEBUG
Profile_Data dd 0
endif
if ??_align
.errnz ($ - prelabeldata) mod 4
endif
endif
ifdef DEBUG
?prolog_&Name label near
if (??_service OR ??_profile) AND (??_hook EQ 0)
jmp short Name
if ??_align
Dword_Align
endif
IF ?_ICODE
ifdef profileall
?ProfileHeader_BeginProc Profile_Data, %@filename
else
Profile_Data dd 0
endif
ELSE
Profile_Data dd 0
ENDIF
endif
endif
if ??_align
Dword_Align
endif
endif
Name proc near
ife ??_pcall or ??_ccall or ??_scall or ??_fastcall
if ??_public
public Name
else
ifdef DEBUG
% ?merge @FileName,$,Name,:
% ?merge public,,,,,@FileName,$,Name
endif
endif
endif
if ??_ccall
if ??_public
_&Name equ Name
ifdef Not_VxD
public C Name
else
public _&Name
endif
endif
endif
if ??_pcall
if ??_public
?toupper Name
?merge public,,,,%?upper
endif
endif
ife ??_scall or ??_fastcall or ??_inline
?_BeginProc_Debug_Prologue
endif
if ??_inline
??_inline_end textequ <__&Name&_END__>
dw INLINE_MAGIC_W
db INLINE_MAGIC_B
db ??_inline_end - ($ + 1)
endif
endm
?_BeginProc_Debug_Prologue MACRO
ifndef Not_VxD
ifdef DEBUG
if ??_dfs EQ DFS_LOG
VMMCall Log_Proc_Call
else
if ??_dfs EQ DFS_TEST_REENTER
VMMCall Test_Reenter
else
if ??_dfs or ?_LOCKABLECODE eq 0
ifdef WIN31COMPAT
if ??_dfs AND DFS_LOG
VMMCall Log_Proc_Call
endif
if ??_dfs AND DFS_TEST_REENTER
VMMCall Test_Reenter
endif
else
ife ?_LOCKABLECODE
ifdef ??_debug_flags
push ??_debug_flags
if ??_dfs
pushfd
or dword ptr [esp+4],??_dfs
popfd
endif
VMMCall _Debug_Flags_Service
elseif ??_dfs
push ??_dfs
VMMCall _Debug_Flags_Service
endif
else
push ??_dfs
VMMCall _Debug_Flags_Service
endif
endif
else
ifdef profileall
IncProfileCount
endif
endif
endif
endif
endif
endif
ENDM
?_BeginProc macro
endm
?PUBLIC_BeginProc macro
??_public = 1
endm
?LOCAL_BeginProc macro
??_public = 0
endm
?HIGH_FREQ_BeginProc macro
??_align = 1
endm
?HOOK_PROC_BeginProc macro
??_hook = 1
??_hookarg = 1
endm
?SERVICE_BeginProc macro
??_service = 1
.erre ?_16ICODE, <SERVICEs must be in 32 bit code>
.erre ?_RCODE, <SERVICEs must be in 32 bit code>
endm
?INLINE_BeginProc macro
??_inline = 1
endm
?ASYNC_SERVICE_BeginProc macro
??_service = 1
??_async_service = 1
.errnz ?_LCODE, <ASYNC_SERVICE's must be in LOCKED code>
endm
?NO_LOG_BeginProc macro
??_log = 0
endm
?NO_PROFILE_BeginProc macro
??_profile = 0
endm
?NO_TEST_CLD_BeginProc macro
??_test_cld = 0
endm
?TEST_BLOCK_BeginProc macro
??_might_block = DFS_TEST_BLOCK
endm
?TEST_REENTER_BeginProc macro
??_test_reenter = DFS_TEST_REENTER
endm
?NEVER_REENTER_BeginProc macro
??_never_reenter = DFS_NEVER_REENTER
endm
?NOT_SWAPPING_BeginProc macro
??_not_swapping = DFS_NOT_SWAPPING
endm
?NO_PROLOG_BeginProc macro
??_prolog_disabled = 1
endm
?ESP_BeginProc macro
??_esp = VMM_TRUE
ifndef Not_VxD
.erre ?_16ICODE, <Beginproc ESP attribute invalid in 16 bit seg.>
.erre ?_RCODE, <Beginproc ESP attribute invalid in real-mode seg.>
endif
endm
?CCALL_BeginProc macro
??_ccall = 1
endm
?PCALL_BeginProc macro
??_pcall = 1
endm
?SCALL_BeginProc macro
??_scall = 1
endm
?FASTCALL_BeginProc macro
??_fastcall = 1
endm
?ICALL_BeginProc macro
??_scall = 1
endm
?W32SVC_BeginProc macro
??_scall = 1
??_w32svc = 1
endm
ifdef DEBUG
ifdef profileall
?ProfileHeader_BeginProc macro PL, filename
ifndef _&filename&__proc_list
_&filename&__proc_list = 0
PUBLIC _&filename&__proc_list
endif
dd OFFSET32 _&filename&__proc_list
PL dd 0
_&filename&__proc_list = PL
endm
endif
IncProfileCount macro
if ??_service OR ??_profile
inc dword ptr [??_name-4]
else
ifndef profileall
.err <IncProfileCount can be used only in services.>
endif
endif
endm
else
IncProfileCount macro
endm
endif
ArgVar macro name,length,used
??_numargs = ??_numargs + 1
if ??_pcall
?mkarg <name>, <length>, <used>, %??_numargs
else
?arg <name>, <length>, <used>
endif
??_procflags = ??_procflags OR ??_pf_Check
endm
?mkarg macro name, length, used, num
.xcref ?MKA&num
?deflocal <name>
?MKA&num ¯o
?argvar <name>, <length>, <used>
&endm
??_aframe = ??_aframe + 4
endm
.xcref ?mkarg
?argvar macro name,length,used
local a
a = ??_taframe
??_aframe = ??_aframe + 4
??_taframe = ??_taframe + 4
ifidni <length>,<BYTE>
?setname <name>, <byte ptr [??_basereg+??_initaframe+a]>, <used>
elseifidni <length>,<WORD>
?setname <name>, <word ptr [??_basereg+??_initaframe+a]>, <used>
elseifidni <length>,<DWORD>
?setname <name>, <dword ptr [??_basereg+??_initaframe+a]>, <used>
?setname <name&l>,<word ptr [??_basereg+??_initaframe+a]>, <used>
?setname <name&ll>,<byte ptr [??_basereg+??_initaframe+a]>, <used>
?setname <name&lh>,<byte ptr [??_basereg+??_initaframe+a+1]>, <used>
?setname <name&h>,<word ptr [??_basereg+??_initaframe+a+2]>, <used>
?setname <name&hl>,<byte ptr [??_basereg+??_initaframe+a+2]>, <used>
?setname <name&hh>,<byte ptr [??_basereg+??_initaframe+a+3]>, <used>
else
??_aframe = ??_aframe - 4 + ((length + 3)/4)*4
??_taframe = ??_taframe - 4 + ((length + 3)/4)*4
?setname <name>, <[??_basereg+??_initaframe+a]>, <used>
endif
endm
?arg macro name,length,used
if ??_fastcall
if ??_numargs le 2
if length gt 4
.err <First 2 parameters are dwords (ecx,edx) for fastcall functions>
endif
??_aframe = ??_aframe + 4
if ??_numargs eq 1
?merge ecx_,name,,,equ,ecx
else
?merge edx_,name,,,equ,edx
endif
else
?argvar name, length, used
endif
else
?argvar name, length, used
endif
endm
?setname macro name, value, used
?deflocal <name>
ifidni <used>, <NOTUSED>
name equ _inaccessible_NOTUSED_
else
name equ value
??_procflags = ??_procflags OR ??_pf_ArgsUsed OR ??_pf_Check
endif
endm
LocalVar macro name,length,flag
local a
??_numlocals = ??_numlocals + 1
??_pad = 1
ifidni <flag>, <PACK>
??_pad = 0
endif
ifidni <length>,<BYTE>
??_frame = ??_frame + 1 + 3 * ??_pad
a = ??_frame
?deflocal <name>
name equ byte ptr [??_basereg-a]
elseifidni <length>,<WORD>
??_frame = ??_frame + 2 + 2 * ??_pad
a = ??_frame
?deflocal <name>
name equ word ptr [??_basereg-a]
elseifidni <length>,<DWORD>
??_frame = ??_frame + 4
a = ??_frame
?deflocal <name, name&l, name&ll, name&lh, name&h, name&hl, name&hh>
name equ dword ptr [??_basereg-a]
name&l equ word ptr [??_basereg-a]
name&ll equ byte ptr [??_basereg-a]
name&lh equ byte ptr [??_basereg-a+1]
name&h equ word ptr [??_basereg-a+2]
name&hl equ byte ptr [??_basereg-a+2]
name&hh equ byte ptr [??_basereg-a+3]
else
??_frame = ??_frame + ((length + 3)/4)*4
a = ??_frame
?deflocal <name>
name equ [??_basereg-a]
endif
??_procflags = ??_procflags OR ??_pf_Check
endm
?deflocal macro name
irp nm, <name>
??_numlocalsymbols = ??_numlocalsymbols + 1
?dodeflocal <nm>, %(??_numlocalsymbols)
endm
endm
.xcref ?deflocal
?dodeflocal macro name, num
.xcref ?LOC&num
?LOC&num ¯o
name equ <__inaccessible__NOTINSCOPE__>
&endm
endm
.xcref ?dodeflocal
EnterProc macro
.errnz ??_frame and 3, <Total size of local variables not a multiple of 4.>
if ??_scall
if ??_public
ifdef Not_VxD
?merge %??_name,@,%(??_aframe),,label,near
?merge public,,,,C,%??_name,@,%(??_aframe)
else
?merge _,%??_name,@,%(??_aframe),label,near
?merge public,,,,,_,%??_name,@,%(??_aframe)
endif
endif
?_BeginProc_Debug_Prologue
endif
if ??_fastcall
if ??_public
ifdef Not_VxD
?merge %??_name,@,%(??_aframe),,label,near
?merge public,,,,C,%??_name,@,%(??_aframe)
else
?merge @,%??_name,@,%(??_aframe),label,near
?merge public,,,,,@,%??_name,@,%(??_aframe)
endif
endif
?_BeginProc_Debug_Prologue
endif
if ??_pcall
??_aframe = 0
?count = ??_numargs
rept ??_numargs
?invprg <?MKA>,%?count
?count = ?count - 1
endm
endif
??_fleave = FALSE
if ??_esp
if ??_frame
sub esp, ??_frame
??_pushed = ??_pushed + ??_frame
??_fleave = VMM_TRUE
endif
else
if ??_frame eq 0
if (??_taframe eq 0) OR ((??_procflags AND ??_pf_ArgsUsed) EQ 0)
ifdef DEBUG
push ebp
mov ebp,esp
??_fleave = VMM_TRUE
endif
else
push ebp
mov ebp,esp
??_fleave = VMM_TRUE
endif
else
enter ??_frame, 0
??_fleave = VMM_TRUE
endif
endif
??_procflags = ??_procflags OR ??_pf_Entered
endm
LeaveProc macro flags
if ??_fleave
if ??_esp
ifidni <flags>,<PRESERVE_FLAGS>
lea esp,[esp + ??_frame]
else
add esp,??_frame
endif
else
leave
endif
endif
??_procflags = ??_procflags OR ??_pf_Left
endm
Return macro
if ??_cleanoff OR ??_w32svc
if ??_inline
.err <Service cannot be inlined!>
endif
if ??_w32svc AND
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?