#ifdef _M_ARM #include GBLA SyscallId SyscallId SETA 0 MACRO STUB_K $Name LCLS ZwFuncName LCLS ZwFuncEndName ZwFuncName SETS "Zw$Name" ZwFuncEndName SETS "$ZwFuncName":CC:"_end" ALIGN 2 EXPORT $ZwFuncName [FUNC] $ZwFuncName ROUT mov r12, #SyscallId svc #1 bx lr $ZwFuncEndName MEND MACRO STUB_U $Name LCLS NtFuncName LCLS NtFuncEndName LCLS ZwFuncName LCLS ZwFuncEndName NtFuncName SETS "Nt$Name" NtFuncEndName SETS "$NtFuncName":CC:"_end" ZwFuncName SETS "Zw$Name" ZwFuncEndName SETS "$ZwFuncName":CC:"_end" ALIGN 2 EXPORT $NtFuncName [FUNC] $NtFuncName EXPORT $ZwFuncName [FUNC] $ZwFuncName ROUT mov r12, #SyscallId svc #1 bx lr $NtFuncEndName $ZwFuncEndName MEND #else #include SyscallId = 0 #ifdef _M_IX86 #define KUSER_SHARED_SYSCALL HEX(7ffe0300) #define KGDT_R0_CODE 8 MACRO(STUBCODE_U, Name, SyscallId, ArgCount) StackBytes = 4 * ArgCount FPO 0, 0, 0, 0, 0, FRAME_FPO mov eax, SyscallId mov edx, KUSER_SHARED_SYSCALL call dword ptr [edx] ret StackBytes ENDM MACRO(STUBCODE_K, Name, SyscallId, ArgCount) StackBytes = 4 * &ArgCount FPO 0, 0, 0, 0, 0, FRAME_FPO mov eax, SyscallId lea edx, [esp + 4] pushfd push KGDT_R0_CODE call _KiSystemService ret StackBytes ENDM #elif defined(_M_AMD64) MACRO(STUBCODE_U, Name, SyscallId, ArgCount) .ENDPROLOG mov eax, SyscallId mov r10, rcx syscall ret ENDM MACRO(STUBCODE_K, Name, SyscallId, ArgCount) .ENDPROLOG EXTERN Nt&Name:PROC lea rax, Nt&Name[rip] mov r10, ArgCount * 8 jmp KiZwSystemService ENDM #elif defined(_M_PPC) MACRO(STUBCODE_U, Name, SyscallId, ArgCount) stwu 1,-16(1) mflr 0 stw 0,0(1) li 0, SyscallId sc lwz 0,0(1) mtlr 0 addi 1,1,16 blr ENDM #define STUBCODE_K STUBCODE_U #elif defined(_M_MIPS) MACRO(STUBCODE_U, Name, SyscallId, ArgCount) li $8, KUSER_SHARED_SYSCALL lw $8,0($8) j $8 nop ENDM MACRO(STUBCODE_K, Name, SyscallId, ArgCount) j KiSystemService nop ENDM #else #error unsupported architecture #endif #ifdef _M_IX86 MACRO(MAKE_LABEL, Name, StackBytes) PUBLIC _&Name&@&StackBytes _&Name&@&StackBytes: ENDM MACRO(START_PROC, Name, StackBytes) PUBLIC _&Name&@&StackBytes .PROC _&Name&@&StackBytes ENDM #else MACRO(MAKE_LABEL, Name, StackBytes) PUBLIC &Name &Name: ENDM MACRO(START_PROC, Name, StackBytes) PUBLIC &Name .PROC &Name ENDM #endif MACRO(STUB_U, Name, ArgCount) MAKE_LABEL Zw&Name, %ArgCount * 4 START_PROC Nt&Name, %ArgCount * 4 STUBCODE_U Name, SyscallId, %ArgCount .ENDP SyscallId = SyscallId + 1 ENDM MACRO(STUB_K, Name, ArgCount) START_PROC Zw&Name, %ArgCount * 4 STUBCODE_K Name, SyscallId, %ArgCount .ENDP SyscallId = SyscallId + 1 ENDM #endif