mirror of
https://github.com/reactos/reactos.git
synced 2025-07-07 22:27:53 +00:00
[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
This commit is contained in:
parent
667174effd
commit
f8de863698
1 changed files with 109 additions and 109 deletions
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue