Wow, it almost sounds like... we have to copy the exact same assembly code from Microsoft... instead of being "more efficient" or "doing it our way" because "there's no point in copying such minute details". It..almost sounds like... something some developer was saying for almost a decade now? No, I must be imagining things...

Best regards,
Alex Ionescu

On Wed, Feb 4, 2015 at 8:58 AM, <jgardou@svn.reactos.org> wrote:
Author: jgardou
Date: Wed Feb  4 16:58:41 2015
New Revision: 66161

URL: http://svn.reactos.org/svn/reactos?rev=66161&view=rev
Log:
[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

Modified:
    trunk/reactos/include/asm/syscalls.inc

Modified: trunk/reactos/include/asm/syscalls.inc
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/asm/syscalls.inc?rev=66161&r1=66160&r2=66161&view=diff
==============================================================================
--- trunk/reactos/include/asm/syscalls.inc      [iso-8859-1] (original)
+++ trunk/reactos/include/asm/syscalls.inc      [iso-8859-1] Wed Feb  4 16:58:41 2015
@@ -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