mirror of
https://github.com/ApfelTeeSaft/Perfectium.git
synced 2026-08-26 19:33:36 +00:00
211 lines
4.6 KiB
PHP
211 lines
4.6 KiB
PHP
SHADOW_SPACE EQU 32 ; 4 * 8 bytes
|
|
|
|
STACK_ALIGN_SIZE EQU 16
|
|
|
|
PROC_ENTER MACRO local_bytes:=<0>
|
|
push rbp
|
|
mov rbp, rsp
|
|
; Compute sub rsp amount: round_up(local_bytes + SHADOW_SPACE, 16)
|
|
; If (local_bytes + SHADOW_SPACE) mod 16 == 0, already aligned
|
|
; (push rbp above biased by 8; a further sub rsp of a multiple of 16
|
|
; keeps alignment correct because entry RSP was already 8-mod-16).
|
|
LOCAL _lsz
|
|
_lsz = local_bytes + SHADOW_SPACE
|
|
IF (_lsz MOD 16) NE 0
|
|
_lsz = _lsz + (16 - (_lsz MOD 16))
|
|
ENDIF
|
|
sub rsp, _lsz
|
|
ENDM
|
|
|
|
; Restores RSP from RBP, pops RBP, returns.
|
|
; Caller must pop any callee-saved registers BEFORE invoking this.
|
|
PROC_LEAVE MACRO
|
|
mov rsp, rbp
|
|
pop rbp
|
|
ret
|
|
ENDM
|
|
|
|
PROC_ENTER_REGS MACRO regs:VARARG
|
|
FOR reg, <regs>
|
|
push reg
|
|
ENDM
|
|
ENDM
|
|
|
|
PROC_LEAVE_REGS MACRO regs:VARARG
|
|
FOR reg, <regs>
|
|
pop reg
|
|
ENDM
|
|
ENDM
|
|
|
|
CALL_SETUP MACRO extra_stack_qwords:=<0>
|
|
LOCAL _extra
|
|
_extra = extra_stack_qwords * 8
|
|
IF (_extra MOD 16) NE 0
|
|
_extra = _extra + 8 ; pad to 16-byte alignment
|
|
ENDIF
|
|
sub rsp, SHADOW_SPACE + _extra
|
|
ENDM
|
|
|
|
; Restore RSP after a call that used CALL_SETUP.
|
|
CALL_TEARDOWN MACRO extra_stack_qwords:=<0>
|
|
LOCAL _extra
|
|
_extra = extra_stack_qwords * 8
|
|
IF (_extra MOD 16) NE 0
|
|
_extra = _extra + 8
|
|
ENDIF
|
|
add rsp, SHADOW_SPACE + _extra
|
|
ENDM
|
|
|
|
NULL_CHECK MACRO reg, label
|
|
test reg, reg
|
|
jz label
|
|
ENDM
|
|
|
|
CheckNullFatal_M MACRO reg, msg_reg, fatal_label
|
|
test reg, reg
|
|
jnz @F
|
|
lea msg_reg, [fatal_label&_str] ; caller defines label&_str in .const
|
|
jmp fatal_label
|
|
@@:
|
|
ENDM
|
|
|
|
CheckNullFatalStr_M MACRO reg, str_sym, fatal_label
|
|
test reg, reg
|
|
jnz @F
|
|
lea rcx, str_sym
|
|
jmp fatal_label
|
|
@@:
|
|
ENDM
|
|
|
|
DETOUR_START_M MACRO
|
|
sub rsp, SHADOW_SPACE
|
|
call DetourTransactionBegin
|
|
; ignore return value (always S_OK in normal use)
|
|
mov rcx, DETOUR_ALL_THREADS ; -1 = all threads
|
|
call DetourUpdateThread
|
|
add rsp, SHADOW_SPACE
|
|
ENDM
|
|
|
|
; sentinel for "all threads" passed to DetourUpdateThread
|
|
DETOUR_ALL_THREADS EQU -1
|
|
|
|
DETOUR_END_M MACRO
|
|
sub rsp, SHADOW_SPACE
|
|
call DetourTransactionCommit
|
|
add rsp, SHADOW_SPACE
|
|
ENDM
|
|
|
|
DetourAttachM MACRO ppOriginal, pHook
|
|
sub rsp, SHADOW_SPACE
|
|
lea rcx, ppOriginal
|
|
lea rdx, pHook
|
|
call DetourAttach
|
|
add rsp, SHADOW_SPACE
|
|
ENDM
|
|
|
|
DetourDetachM MACRO ppOriginal, pHook
|
|
sub rsp, SHADOW_SPACE
|
|
lea rcx, ppOriginal
|
|
lea rdx, pHook
|
|
call DetourDetach
|
|
add rsp, SHADOW_SPACE
|
|
ENDM
|
|
|
|
AddressToFunction_M MACRO result_reg, base_reg, offset
|
|
mov result_reg, base_reg
|
|
add result_reg, offset
|
|
ENDM
|
|
|
|
VtableCall_M MACRO obj_reg, slot, scratch_reg
|
|
mov scratch_reg, [obj_reg] ; vtable ptr
|
|
call QWORD PTR [scratch_reg + (slot)*8]
|
|
ENDM
|
|
|
|
LOG_INFO_M MACRO fmt_sym
|
|
sub rsp, SHADOW_SPACE
|
|
lea rcx, fmt_sym
|
|
call Logger_LogInfo
|
|
add rsp, SHADOW_SPACE
|
|
ENDM
|
|
|
|
LOG_WARN_M MACRO fmt_sym
|
|
sub rsp, SHADOW_SPACE
|
|
lea rcx, fmt_sym
|
|
call Logger_LogWarn
|
|
add rsp, SHADOW_SPACE
|
|
ENDM
|
|
|
|
LOG_ERROR_M MACRO fmt_sym
|
|
sub rsp, SHADOW_SPACE
|
|
lea rcx, fmt_sym
|
|
call Logger_LogError
|
|
add rsp, SHADOW_SPACE
|
|
ENDM
|
|
|
|
FIND_PATTERN_M MACRO result_reg, pattern_sym, bRelative, offset_val
|
|
lea rcx, pattern_sym
|
|
mov edx, bRelative
|
|
mov r8d, offset_val
|
|
call Utils_FindPattern
|
|
mov result_reg, rax
|
|
ENDM
|
|
|
|
RESOLVE_RIP_M MACRO result_reg, addr_reg
|
|
movsxd result_reg, DWORD PTR [addr_reg + 1] ; sign-extend rel32
|
|
add result_reg, addr_reg
|
|
add result_reg, 5 ; + size of call instruction
|
|
ENDM
|
|
|
|
SAVE_NONVOL_4 MACRO r0, r1, r2, r3
|
|
push r0
|
|
push r1
|
|
push r2
|
|
push r3
|
|
ENDM
|
|
|
|
RESTORE_NONVOL_4 MACRO r3, r2, r1, r0
|
|
pop r3
|
|
pop r2
|
|
pop r1
|
|
pop r0
|
|
ENDM
|
|
|
|
STORE_ARG_RCX MACRO
|
|
mov [rsp + 8], rcx
|
|
ENDM
|
|
STORE_ARG_RDX MACRO
|
|
mov [rsp + 16], rdx
|
|
ENDM
|
|
STORE_ARG_R8 MACRO
|
|
mov [rsp + 24], r8
|
|
ENDM
|
|
STORE_ARG_R9 MACRO
|
|
mov [rsp + 32], r9
|
|
ENDM
|
|
|
|
BOOL_TRUE MACRO
|
|
mov eax, 1
|
|
ENDM
|
|
BOOL_FALSE MACRO
|
|
xor eax, eax
|
|
ENDM
|
|
|
|
ZERO_REG MACRO reg
|
|
xor reg, reg
|
|
ENDM
|
|
|
|
LOAD_QWORD_PTR MACRO dst, sym
|
|
mov dst, QWORD PTR [sym]
|
|
ENDM
|
|
|
|
STORE_QWORD_PTR MACRO sym, src
|
|
mov QWORD PTR [sym], src
|
|
ENDM
|
|
|
|
DEFINE_PEHOOK_M MACRO hook_name, ufunction_sym
|
|
hook_name LABEL NEAR
|
|
; RCX = UObject* (caller object)
|
|
; RDX = UFunction*
|
|
; R8 = void* (params struct)
|
|
ENDM
|