From f8de8636987052f8f2d455183b8e8a4c0d74ddcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Wed, 4 Feb 2015 16:58:41 +0000 Subject: [PATCH] [NTDLL] - use the edx register to store the function pointer to the syscall trampoline. This is how google Chrome checks if an exported function is a system call or not. See https://chromium.googlesource.com/chromium/src.git/+/master/sandbox/win/src/service_resolver_32.cc and https://bugs.winehq.org/show_bug.cgi?id=21232 for details svn path=/trunk/; revision=66161 --- reactos/include/asm/syscalls.inc | 218 +++++++++++++++---------------- 1 file changed, 109 insertions(+), 109 deletions(-) diff --git a/reactos/include/asm/syscalls.inc b/reactos/include/asm/syscalls.inc index c1d58ac9bfd..8c980f2ae64 100644 --- a/reactos/include/asm/syscalls.inc +++ b/reactos/include/asm/syscalls.inc @@ -1,109 +1,109 @@ - -#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 ecx, KUSER_SHARED_SYSCALL - call dword ptr [ecx] - 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_ARM) -MACRO(STUBCODE_U, Name, SyscallId, ArgCount) - swi #SyscallId - bx lr -ENDM -MACRO(STUBCODE_K, Name, SyscallId, ArgCount) - mov ip, lr - swi #SyscallId - bx ip -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 + +#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_ARM) +MACRO(STUBCODE_U, Name, SyscallId, ArgCount) + swi #SyscallId + bx lr +ENDM +MACRO(STUBCODE_K, Name, SyscallId, ArgCount) + mov ip, lr + swi #SyscallId + bx ip +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