- 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
This commit is contained in:
Jérôme Gardou 2015-02-04 16:58:41 +00:00
parent 667174effd
commit f8de863698

View file

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