steam web browsing on OS X

Jacek Caban jacek at codeweavers.com
Mon Nov 2 06:15:17 CST 2015


Hi Sebastian,

On 11/02/15 12:16, Sebastian Lackner wrote:
> On 02.11.2015 11:12, Jacek Caban wrote:
>> Sure. The idea is to pass relative addresses instead to
>> call_syscall_func and let it handle that. Calling call_syscall_func
>> itself may use a constant address if we let it live in user shared data.
>> Did you try that? That's one of those things that one has to try to see
>> if it works in practice.
> Yes, I also looked at this approach. The difficult part to get this correct
> is to initialize user shared data as early as possible, without any call to
> a wrapper function before that. Please note that its not sufficient to wrap
> calls from other dlls, even some ntdll-internal calls have to go through the
> wrappers (for example when loading a library). Those are implemented in
> ntdll usermode on Windows.
>
>> Also I believe that using winebuild for that is the right way.
> I already tried it out in practice and partially disagree. As mentioned above,
> its not sufficient to put autogenerated wrappers between the implementation
> and the ntdll exports. Exactly the same wrappers have to be used from inside
> of the ntdll loader code for example. This means, even if the thunks are
> generated somewhere else, we still have to add them to one of the wine header
> files. If we do not want to generate thunks for all architectures, we might
> even have to add them twice, one time as typedef, and the second time a #define
> as fallback for unsupported architectures.
>
> I'm not saying that its impossible to do it this way, but compared to thiscalls,
> which could easily be generated by winebuild, a macro is similar good here imho.
> If you want to look into the idea to autogenerate thunks, here is one of my
> work-in-progress patches (based on Erichs work): http://ix.io/lLz

See attached patches. On the quick look it seems similar to the one you
mentioned, except it avoids text relocations. The patch is definitely
not finished nor ready for proper review, but it's enough to get things
to build and run. I haven't even tested that with Chromium nor other
apps that need it (well, I haven't tested it at all, really).

Patch 1 is the interesting one. Patch 2 just marks needed functions as
syscalls.

Patch 3 is to show how to address your concerns about going through
thunks from inside ntdll. Those use macros from your patch except their
meaning is reverted. I chose two calls that I know will need to be fixed
for Office. I don't know how much more calls will need to be changed. In
general, we can't avoid such problems: we will either need to explicitly
mark calls that need to go through the thunk or those that don't. I
chose the first variant because it seems cleaner and more in line with
how winebuild works. I do believe that implementing things to work the
other way around is also possible in winebuild.

Cheers,
Jacek
-------------- next part --------------
>From c872a68cf0329f84ae39d6ac7f0cc64878698cc4 Mon Sep 17 00:00:00 2001
From: Jacek Caban <jacek at codeweavers.com>
Date: Mon, 2 Nov 2015 12:50:36 +0100
Subject: [PATCH 1/3] winebuild: Added support for syscall wrapper thunks.
To: wine-patches <wine-patches at winehq.org>

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
---
 dlls/ntdll/thread.c      | 25 ++++++++++++++++++++--
 tools/winebuild/build.h  |  1 +
 tools/winebuild/parser.c |  1 +
 tools/winebuild/spec32.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 79 insertions(+), 2 deletions(-)

diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index aaf7a71..88b5fbe 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -202,6 +202,25 @@ static ULONG64 get_dyld_image_info_addr(void)
 }
 #endif  /* __APPLE__ */
 
+extern char *__wine_spec_nt_header;
+
+#include "pshpack1.h"
+static struct {
+    BYTE add_esp[3];
+    BYTE add_eax;
+    DWORD module_base;
+    BYTE mov_eax_eax[2];
+    BYTE jmp_eax[2];
+    WORD ret;
+} thunk = {
+    {0x83,0xc4,0x04}, /* addl $4,%esp */
+    0x05, 0,          /* addl __wine_spec_nt_header,%eax */
+    {0x8b,0x00},      /* movl 0(%eax),%eax */
+    {0xff,0xe0},      /* jmp *%eax */
+    0xc3              /* ret */
+};
+#include "poppack.h"
+
 /***********************************************************************
  *           thread_init
  *
@@ -230,7 +249,7 @@ HANDLE thread_init(void)
     addr = (void *)0x7ffe0000;
     size = 0x10000;
     status = NtAllocateVirtualMemory( NtCurrentProcess(), &addr, 0, &size,
-                                      MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE );
+                                      MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE );
     if (status)
     {
         MESSAGE( "wine: failed to map the shared user data: %08x\n", status );
@@ -238,8 +257,10 @@ HANDLE thread_init(void)
     }
     user_shared_data = addr;
 
-    /* allocate and initialize the PEB */
+    thunk.module_base = (DWORD)&__wine_spec_nt_header;
+    memcpy(&user_shared_data->SystemCall, &thunk, sizeof(thunk));
 
+    /* allocate and initialize the PEB */
     addr = NULL;
     size = sizeof(*peb);
     NtAllocateVirtualMemory( NtCurrentProcess(), &addr, 1, &size,
diff --git a/tools/winebuild/build.h b/tools/winebuild/build.h
index 4a71eed..e67896c 100644
--- a/tools/winebuild/build.h
+++ b/tools/winebuild/build.h
@@ -171,6 +171,7 @@ struct strarray
 #define FLAG_REGISTER  0x10  /* use register calling convention */
 #define FLAG_PRIVATE   0x20  /* function is private (cannot be imported) */
 #define FLAG_ORDINAL   0x40  /* function should be imported by ordinal */
+#define FLAG_SYSCALL   0x80  /* function implements NT syscall */
 
 #define FLAG_FORWARD   0x100  /* function is a forwarded name */
 #define FLAG_EXT_LINK  0x200  /* function links to an external symbol */
diff --git a/tools/winebuild/parser.c b/tools/winebuild/parser.c
index 1d7b84e..021356f 100644
--- a/tools/winebuild/parser.c
+++ b/tools/winebuild/parser.c
@@ -69,6 +69,7 @@ static const char * const FlagNames[] =
     "register",    /* FLAG_REGISTER */
     "private",     /* FLAG_PRIVATE */
     "ordinal",     /* FLAG_ORDINAL */
+    "syscall",     /* FLAG_SYSCALL */
     NULL
 };
 
diff --git a/tools/winebuild/spec32.c b/tools/winebuild/spec32.c
index cb56abe..d375706 100644
--- a/tools/winebuild/spec32.c
+++ b/tools/winebuild/spec32.c
@@ -270,6 +270,55 @@ static void output_relay_debug( DLLSPEC *spec )
     }
 }
 
+static void output_syscall_wrappers( DLLSPEC *spec )
+{
+    int i, emited_syscalls = 0, syscall_cnt = 0;
+    char **syscall_entries, *sym_name;
+    ORDDEF *odp;
+
+    for (odp = spec->entry_points; odp < spec->entry_points + spec->nb_entry_points; odp++)
+        if(odp->flags & FLAG_SYSCALL)
+            syscall_cnt++;
+
+    if(!syscall_cnt)
+        return;
+
+    syscall_entries = xmalloc(syscall_cnt*sizeof(*syscall_entries));
+
+    output("\t.text\n");
+
+    for (odp = spec->entry_points; odp < spec->entry_points + spec->nb_entry_points; odp++) {
+        if(!(odp->flags & FLAG_SYSCALL))
+            continue;
+
+        for(i=0; i < emited_syscalls; i++) {
+            if(!strcmp(odp->link_name, syscall_entries[i]))
+                break;
+        }
+        if(i < emited_syscalls)
+            continue; /* already emited */
+
+        syscall_entries[emited_syscalls] = odp->link_name;
+
+        sym_name = strmake("__syscall_%s", odp->link_name);
+        output( "%s\n", asm_globl(sym_name) );
+        output( "\tmovl $.L__wine_spec_syscalls+%u-.L__wine_spec_rva_base,%%eax\n", emited_syscalls*4);
+        output( "\tmovl $0x7ffe0300,%%edx\n" );
+        output( "\tcall *%%edx\n" );
+        output( "\tret $%u\n", get_args_size(odp));
+        free(sym_name);
+        emited_syscalls++;
+    }
+
+    output( "\n\t.data\n" );
+    output( ".L__wine_spec_syscalls:\n" );
+
+    for (i=0; i < emited_syscalls; i++)
+        output( "\t%s %s\n", get_asm_ptr_keyword(), asm_name(syscall_entries[i]) );
+
+    free(syscall_entries);
+}
+
 /*******************************************************************
  *         output_exports
  *
@@ -332,6 +381,10 @@ void output_exports( DLLSPEC *spec )
                 output( "\t%s %s_%s\n",
                          get_asm_ptr_keyword(), asm_name("__wine_spec_ext_link"), odp->link_name );
             }
+            else if (odp->flags & FLAG_SYSCALL)
+            {
+                output( "\t%s %s_%s\n", get_asm_ptr_keyword(), asm_name("__syscall"), odp->link_name );
+            }
             else
             {
                 output( "\t%s %s\n", get_asm_ptr_keyword(), asm_name(odp->link_name) );
@@ -622,6 +675,7 @@ void BuildSpec32File( DLLSPEC *spec )
     output_stubs( spec );
     output_exports( spec );
     output_imports( spec );
+    output_syscall_wrappers( spec );
     if (is_undefined( "__wine_call_from_regs" )) output_asm_relays();
     output_resources( spec );
     output_gnu_stack_note();
-- 
2.4.9

-------------- next part --------------
>From a603f111dbd67e51c7afb7689a68196f7d748506 Mon Sep 17 00:00:00 2001
From: Jacek Caban <jacek at codeweavers.com>
Date: Mon, 2 Nov 2015 12:44:28 +0100
Subject: [PATCH 2/3] ntdll: Mark functions implementing syscalls in spec file.
To: wine-patches <wine-patches at winehq.org>

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
---
 dlls/ntdll/ntdll.spec | 750 +++++++++++++++++++++++++-------------------------
 1 file changed, 375 insertions(+), 375 deletions(-)

diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index 38422ae..b92e5d2 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -87,302 +87,302 @@
 @ extern NlsAnsiCodePage
 @ extern NlsMbCodePageTag
 @ extern NlsMbOemCodePageTag
-@ stdcall NtAcceptConnectPort(ptr long ptr long long ptr)
-@ stdcall NtAccessCheck(ptr long long ptr ptr ptr ptr ptr)
-@ stdcall NtAccessCheckAndAuditAlarm(ptr long ptr ptr ptr long ptr long ptr ptr ptr)
+@ stdcall -syscall NtAcceptConnectPort(ptr long ptr long long ptr)
+@ stdcall -syscall NtAccessCheck(ptr long long ptr ptr ptr ptr ptr)
+@ stdcall -syscall NtAccessCheckAndAuditAlarm(ptr long ptr ptr ptr long ptr long ptr ptr ptr)
 # @ stub NtAccessCheckByType
 # @ stub NtAccessCheckByTypeAndAuditAlarm
 # @ stub NtAccessCheckByTypeResultList
 # @ stub NtAccessCheckByTypeResultListAndAuditAlarm
 # @ stub NtAccessCheckByTypeResultListAndAuditAlarmByHandle
-@ stdcall NtAddAtom(ptr long ptr)
+@ stdcall -syscall NtAddAtom(ptr long ptr)
 # @ stub NtAddBootEntry
-@ stdcall NtAdjustGroupsToken(long long ptr long ptr ptr)
-@ stdcall NtAdjustPrivilegesToken(long long long long long long)
-@ stdcall NtAlertResumeThread(long ptr)
-@ stdcall NtAlertThread(long)
-@ stdcall NtAllocateLocallyUniqueId(ptr)
+@ stdcall -syscall NtAdjustGroupsToken(long long ptr long ptr ptr)
+@ stdcall -syscall NtAdjustPrivilegesToken(long long long long long long)
+@ stdcall -syscall NtAlertResumeThread(long ptr)
+@ stdcall -syscall NtAlertThread(long)
+@ stdcall -syscall NtAllocateLocallyUniqueId(ptr)
 # @ stub NtAllocateUserPhysicalPages
-@ stdcall NtAllocateUuids(ptr ptr ptr)
-@ stdcall NtAllocateVirtualMemory(long ptr ptr ptr long long)
-@ stdcall NtAreMappedFilesTheSame(ptr ptr)
-@ stdcall NtAssignProcessToJobObject(long long)
+@ stdcall -syscall NtAllocateUuids(ptr ptr ptr)
+@ stdcall -syscall NtAllocateVirtualMemory(long ptr ptr ptr long long)
+@ stdcall -syscall NtAreMappedFilesTheSame(ptr ptr)
+@ stdcall -syscall NtAssignProcessToJobObject(long long)
 @ stub NtCallbackReturn
 # @ stub NtCancelDeviceWakeupRequest
-@ stdcall NtCancelIoFile(long ptr)
-@ stdcall NtCancelIoFileEx(long ptr ptr)
-@ stdcall NtCancelTimer(long ptr)
-@ stdcall NtClearEvent(long)
-@ stdcall NtClose(long)
+@ stdcall -syscall NtCancelIoFile(long ptr)
+@ stdcall -syscall NtCancelIoFileEx(long ptr ptr)
+@ stdcall -syscall NtCancelTimer(long ptr)
+@ stdcall -syscall NtClearEvent(long)
+@ stdcall -syscall NtClose(long)
 @ stub NtCloseObjectAuditAlarm
 # @ stub NtCompactKeys
 # @ stub NtCompareTokens
-@ stdcall NtCompleteConnectPort(ptr)
+@ stdcall -syscall NtCompleteConnectPort(ptr)
 # @ stub NtCompressKey
-@ stdcall NtConnectPort(ptr ptr ptr ptr ptr ptr ptr ptr)
+@ stdcall -syscall NtConnectPort(ptr ptr ptr ptr ptr ptr ptr ptr)
 @ stub NtContinue
 # @ stub NtCreateDebugObject
-@ stdcall NtCreateDirectoryObject(long long long)
-@ stdcall NtCreateEvent(long long long long long)
+@ stdcall -syscall NtCreateDirectoryObject(long long long)
+@ stdcall -syscall NtCreateEvent(long long long long long)
 @ stub NtCreateEventPair
-@ stdcall NtCreateFile(ptr long ptr ptr long long long ptr long long ptr)
-@ stdcall NtCreateIoCompletion(ptr long ptr long)
-@ stdcall NtCreateJobObject(ptr long ptr)
+@ stdcall -syscall NtCreateFile(ptr long ptr ptr long long long ptr long long ptr)
+@ stdcall -syscall NtCreateIoCompletion(ptr long ptr long)
+@ stdcall -syscall NtCreateJobObject(ptr long ptr)
 # @ stub NtCreateJobSet
-@ stdcall NtCreateKey(ptr long ptr long ptr long long)
-@ stdcall NtCreateKeyedEvent(ptr long ptr long)
-@ stdcall NtCreateMailslotFile(long long long long long long long long)
-@ stdcall NtCreateMutant(ptr long ptr long)
-@ stdcall NtCreateNamedPipeFile(ptr long ptr ptr long long long long long long long long long ptr)
-@ stdcall NtCreatePagingFile(long long long long)
-@ stdcall NtCreatePort(ptr ptr long long ptr)
+@ stdcall -syscall NtCreateKey(ptr long ptr long ptr long long)
+@ stdcall -syscall NtCreateKeyedEvent(ptr long ptr long)
+@ stdcall -syscall NtCreateMailslotFile(long long long long long long long long)
+@ stdcall -syscall NtCreateMutant(ptr long ptr long)
+@ stdcall -syscall NtCreateNamedPipeFile(ptr long ptr ptr long long long long long long long long long ptr)
+@ stdcall -syscall NtCreatePagingFile(long long long long)
+@ stdcall -syscall NtCreatePort(ptr ptr long long ptr)
 @ stub NtCreateProcess
 # @ stub NtCreateProcessEx
 @ stub NtCreateProfile
-@ stdcall NtCreateSection(ptr long ptr ptr long long long)
-@ stdcall NtCreateSemaphore(ptr long ptr long long)
-@ stdcall NtCreateSymbolicLinkObject(ptr long ptr ptr)
+@ stdcall -syscall NtCreateSection(ptr long ptr ptr long long long)
+@ stdcall -syscall NtCreateSemaphore(ptr long ptr long long)
+@ stdcall -syscall NtCreateSymbolicLinkObject(ptr long ptr ptr)
 @ stub NtCreateThread
-@ stdcall NtCreateTimer(ptr long ptr long)
+@ stdcall -syscall NtCreateTimer(ptr long ptr long)
 @ stub NtCreateToken
 # @ stub NtCreateWaitablePort
-@ stdcall NtCurrentTeb()
+@ stdcall -syscall NtCurrentTeb()
 # @ stub NtDebugActiveProcess
 # @ stub NtDebugContinue
-@ stdcall NtDelayExecution(long ptr)
-@ stdcall NtDeleteAtom(long)
+@ stdcall -syscall NtDelayExecution(long ptr)
+@ stdcall -syscall NtDeleteAtom(long)
 # @ stub NtDeleteBootEntry
-@ stdcall NtDeleteFile(ptr)
-@ stdcall NtDeleteKey(long)
+@ stdcall -syscall NtDeleteFile(ptr)
+@ stdcall -syscall NtDeleteKey(long)
 # @ stub NtDeleteObjectAuditAlarm
-@ stdcall NtDeleteValueKey(long ptr)
-@ stdcall NtDeviceIoControlFile(long long long long long long long long long long)
-@ stdcall NtDisplayString(ptr)
-@ stdcall NtDuplicateObject(long long long ptr long long long)
-@ stdcall NtDuplicateToken(long long long long long long)
+@ stdcall -syscall NtDeleteValueKey(long ptr)
+@ stdcall -syscall NtDeviceIoControlFile(long long long long long long long long long long)
+@ stdcall -syscall NtDisplayString(ptr)
+@ stdcall -syscall NtDuplicateObject(long long long ptr long long long)
+@ stdcall -syscall NtDuplicateToken(long long long long long long)
 # @ stub NtEnumerateBootEntries
 @ stub NtEnumerateBus
-@ stdcall NtEnumerateKey(long long long ptr long ptr)
+@ stdcall -syscall NtEnumerateKey(long long long ptr long ptr)
 # @ stub NtEnumerateSystemEnvironmentValuesEx
-@ stdcall NtEnumerateValueKey(long long long ptr long ptr)
+@ stdcall -syscall NtEnumerateValueKey(long long long ptr long ptr)
 @ stub NtExtendSection
 # @ stub NtFilterToken
-@ stdcall NtFindAtom(ptr long ptr)
-@ stdcall NtFlushBuffersFile(long ptr)
-@ stdcall NtFlushInstructionCache(long ptr long)
-@ stdcall NtFlushKey(long)
-@ stdcall NtFlushVirtualMemory(long ptr ptr long)
+@ stdcall -syscall NtFindAtom(ptr long ptr)
+@ stdcall -syscall NtFlushBuffersFile(long ptr)
+@ stdcall -syscall NtFlushInstructionCache(long ptr long)
+@ stdcall -syscall NtFlushKey(long)
+@ stdcall -syscall NtFlushVirtualMemory(long ptr ptr long)
 @ stub NtFlushWriteBuffer
 # @ stub NtFreeUserPhysicalPages
-@ stdcall NtFreeVirtualMemory(long ptr ptr long)
-@ stdcall NtFsControlFile(long long long long long long long long long long)
-@ stdcall NtGetContextThread(long ptr)
-@ stdcall NtGetCurrentProcessorNumber()
+@ stdcall -syscall NtFreeVirtualMemory(long ptr ptr long)
+@ stdcall -syscall NtFsControlFile(long long long long long long long long long long)
+@ stdcall -syscall NtGetContextThread(long ptr)
+@ stdcall -syscall NtGetCurrentProcessorNumber()
 # @ stub NtGetDevicePowerState
 @ stub NtGetPlugPlayEvent
-@ stdcall NtGetTickCount()
-@ stdcall NtGetWriteWatch(long long ptr long ptr ptr ptr)
-@ stdcall NtImpersonateAnonymousToken(long)
+@ stdcall -syscall NtGetTickCount()
+@ stdcall -syscall NtGetWriteWatch(long long ptr long ptr ptr ptr)
+@ stdcall -syscall NtImpersonateAnonymousToken(long)
 @ stub NtImpersonateClientOfPort
 @ stub NtImpersonateThread
 @ stub NtInitializeRegistry
-@ stdcall NtInitiatePowerAction (long long long long)
-@ stdcall NtIsProcessInJob(long long)
+@ stdcall -syscall NtInitiatePowerAction (long long long long)
+@ stdcall -syscall NtIsProcessInJob(long long)
 # @ stub NtIsSystemResumeAutomatic
-@ stdcall NtListenPort(ptr ptr)
-@ stdcall NtLoadDriver(ptr)
+@ stdcall -syscall NtListenPort(ptr ptr)
+@ stdcall -syscall NtLoadDriver(ptr)
 # @ stub NtLoadKey2
-@ stdcall NtLoadKey(ptr ptr)
-@ stdcall NtLockFile(long long ptr ptr ptr ptr ptr ptr long long)
+@ stdcall -syscall NtLoadKey(ptr ptr)
+@ stdcall -syscall NtLockFile(long long ptr ptr ptr ptr ptr ptr long long)
 # @ stub NtLockProductActivationKeys
 # @ stub NtLockRegistryKey
-@ stdcall NtLockVirtualMemory(long ptr ptr long)
+@ stdcall -syscall NtLockVirtualMemory(long ptr ptr long)
 # @ stub NtMakePermanentObject
-@ stdcall NtMakeTemporaryObject(long)
+@ stdcall -syscall NtMakeTemporaryObject(long)
 # @ stub NtMapUserPhysicalPages
 # @ stub NtMapUserPhysicalPagesScatter
-@ stdcall NtMapViewOfSection(long long ptr long long ptr ptr long long long)
+@ stdcall -syscall NtMapViewOfSection(long long ptr long long ptr ptr long long long)
 # @ stub NtModifyBootEntry
-@ stdcall NtNotifyChangeDirectoryFile(long long ptr ptr ptr ptr long long long)
-@ stdcall NtNotifyChangeKey(long long ptr ptr ptr long long ptr long long)
+@ stdcall -syscall NtNotifyChangeDirectoryFile(long long ptr ptr ptr ptr long long long)
+@ stdcall -syscall NtNotifyChangeKey(long long ptr ptr ptr long long ptr long long)
 # @ stub NtNotifyChangeMultipleKeys
-@ stdcall NtOpenDirectoryObject(long long long)
-@ stdcall NtOpenEvent(long long long)
+@ stdcall -syscall NtOpenDirectoryObject(long long long)
+@ stdcall -syscall NtOpenEvent(long long long)
 @ stub NtOpenEventPair
-@ stdcall NtOpenFile(ptr long ptr ptr long long)
-@ stdcall NtOpenIoCompletion(ptr long ptr)
-@ stdcall NtOpenJobObject(ptr long ptr)
-@ stdcall NtOpenKey(ptr long ptr)
-@ stdcall NtOpenKeyedEvent(ptr long ptr)
-@ stdcall NtOpenMutant(ptr long ptr)
+@ stdcall -syscall NtOpenFile(ptr long ptr ptr long long)
+@ stdcall -syscall NtOpenIoCompletion(ptr long ptr)
+@ stdcall -syscall NtOpenJobObject(ptr long ptr)
+@ stdcall -syscall NtOpenKey(ptr long ptr)
+@ stdcall -syscall NtOpenKeyedEvent(ptr long ptr)
+@ stdcall -syscall NtOpenMutant(ptr long ptr)
 @ stub NtOpenObjectAuditAlarm
-@ stdcall NtOpenProcess(ptr long ptr ptr)
-@ stdcall NtOpenProcessToken(long long ptr)
-@ stdcall NtOpenProcessTokenEx(long long long ptr)
-@ stdcall NtOpenSection(ptr long ptr)
-@ stdcall NtOpenSemaphore(long long ptr)
-@ stdcall NtOpenSymbolicLinkObject (ptr long ptr)
-@ stdcall NtOpenThread(ptr long ptr ptr)
-@ stdcall NtOpenThreadToken(long long long ptr)
-@ stdcall NtOpenThreadTokenEx(long long long long ptr)
-@ stdcall NtOpenTimer(ptr long ptr)
+@ stdcall -syscall NtOpenProcess(ptr long ptr ptr)
+@ stdcall -syscall NtOpenProcessToken(long long ptr)
+@ stdcall -syscall NtOpenProcessTokenEx(long long long ptr)
+@ stdcall -syscall NtOpenSection(ptr long ptr)
+@ stdcall -syscall NtOpenSemaphore(long long ptr)
+@ stdcall -syscall NtOpenSymbolicLinkObject (ptr long ptr)
+@ stdcall -syscall NtOpenThread(ptr long ptr ptr)
+@ stdcall -syscall NtOpenThreadToken(long long long ptr)
+@ stdcall -syscall NtOpenThreadTokenEx(long long long long ptr)
+@ stdcall -syscall NtOpenTimer(ptr long ptr)
 @ stub NtPlugPlayControl
-@ stdcall NtPowerInformation(long ptr long ptr long)
-@ stdcall NtPrivilegeCheck(ptr ptr ptr)
+@ stdcall -syscall NtPowerInformation(long ptr long ptr long)
+@ stdcall -syscall NtPrivilegeCheck(ptr ptr ptr)
 @ stub NtPrivilegeObjectAuditAlarm
 @ stub NtPrivilegedServiceAuditAlarm
-@ stdcall NtProtectVirtualMemory(long ptr ptr long ptr)
-@ stdcall NtPulseEvent(long ptr)
-@ stdcall NtQueryAttributesFile(ptr ptr)
+@ stdcall -syscall NtProtectVirtualMemory(long ptr ptr long ptr)
+@ stdcall -syscall NtPulseEvent(long ptr)
+@ stdcall -syscall NtQueryAttributesFile(ptr ptr)
 # @ stub NtQueryBootEntryOrder
 # @ stub NtQueryBootOptions
 # @ stub NtQueryDebugFilterState
-@ stdcall NtQueryDefaultLocale(long ptr)
-@ stdcall NtQueryDefaultUILanguage(ptr)
-@ stdcall NtQueryDirectoryFile(long long ptr ptr ptr ptr long long long ptr long)
-@ stdcall NtQueryDirectoryObject(long ptr long long long ptr ptr)
-@ stdcall NtQueryEaFile(long ptr ptr long long ptr long ptr long)
-@ stdcall NtQueryEvent(long long ptr long ptr)
-@ stdcall NtQueryFullAttributesFile(ptr ptr)
-@ stdcall NtQueryInformationAtom(long long ptr long ptr)
-@ stdcall NtQueryInformationFile(long ptr ptr long long)
-@ stdcall NtQueryInformationJobObject(long long ptr long ptr)
+@ stdcall -syscall NtQueryDefaultLocale(long ptr)
+@ stdcall -syscall NtQueryDefaultUILanguage(ptr)
+@ stdcall -syscall NtQueryDirectoryFile(long long ptr ptr ptr ptr long long long ptr long)
+@ stdcall -syscall NtQueryDirectoryObject(long ptr long long long ptr ptr)
+@ stdcall -syscall NtQueryEaFile(long ptr ptr long long ptr long ptr long)
+@ stdcall -syscall NtQueryEvent(long long ptr long ptr)
+@ stdcall -syscall NtQueryFullAttributesFile(ptr ptr)
+@ stdcall -syscall NtQueryInformationAtom(long long ptr long ptr)
+@ stdcall -syscall NtQueryInformationFile(long ptr ptr long long)
+@ stdcall -syscall NtQueryInformationJobObject(long long ptr long ptr)
 @ stub NtQueryInformationPort
-@ stdcall NtQueryInformationProcess(long long ptr long ptr)
-@ stdcall NtQueryInformationThread(long long ptr long ptr)
-@ stdcall NtQueryInformationToken(long long ptr long ptr)
-@ stdcall NtQueryInstallUILanguage(ptr)
+@ stdcall -syscall NtQueryInformationProcess(long long ptr long ptr)
+@ stdcall -syscall NtQueryInformationThread(long long ptr long ptr)
+@ stdcall -syscall NtQueryInformationToken(long long ptr long ptr)
+@ stdcall -syscall NtQueryInstallUILanguage(ptr)
 @ stub NtQueryIntervalProfile
-@ stdcall NtQueryIoCompletion(long long ptr long ptr)
-@ stdcall NtQueryKey (long long ptr long ptr)
-@ stdcall NtQueryLicenseValue(ptr ptr ptr long ptr)
-@ stdcall NtQueryMultipleValueKey(long ptr long ptr long ptr)
-@ stdcall NtQueryMutant(long long ptr long ptr)
-@ stdcall NtQueryObject(long long long long long)
+@ stdcall -syscall NtQueryIoCompletion(long long ptr long ptr)
+@ stdcall -syscall NtQueryKey (long long ptr long ptr)
+@ stdcall -syscall NtQueryLicenseValue(ptr ptr ptr long ptr)
+@ stdcall -syscall NtQueryMultipleValueKey(long ptr long ptr long ptr)
+@ stdcall -syscall NtQueryMutant(long long ptr long ptr)
+@ stdcall -syscall NtQueryObject(long long long long long)
 @ stub NtQueryOpenSubKeys
-@ stdcall NtQueryPerformanceCounter(ptr ptr)
+@ stdcall -syscall NtQueryPerformanceCounter(ptr ptr)
 # @ stub NtQueryPortInformationProcess
 # @ stub NtQueryQuotaInformationFile
-@ stdcall NtQuerySection (long long long long long)
-@ stdcall NtQuerySecurityObject (long long long long long)
-@ stdcall NtQuerySemaphore (long long ptr long ptr)
-@ stdcall NtQuerySymbolicLinkObject(long ptr ptr)
-@ stdcall NtQuerySystemEnvironmentValue(ptr ptr long ptr)
-@ stdcall NtQuerySystemEnvironmentValueEx(ptr ptr ptr ptr ptr)
-@ stdcall NtQuerySystemInformation(long long long long)
-@ stdcall NtQuerySystemTime(ptr)
-@ stdcall NtQueryTimer(ptr long ptr long ptr)
-@ stdcall NtQueryTimerResolution(long long long)
-@ stdcall NtQueryValueKey(long ptr long ptr long ptr)
-@ stdcall NtQueryVirtualMemory(long ptr long ptr long ptr)
-@ stdcall NtQueryVolumeInformationFile(long ptr ptr long long)
-@ stdcall NtQueueApcThread(long ptr long long long)
-@ stdcall NtRaiseException(ptr ptr long)
-@ stdcall NtRaiseHardError(long long ptr ptr long long)
-@ stdcall NtReadFile(long long ptr ptr ptr ptr long ptr ptr)
-@ stdcall NtReadFileScatter(long long ptr ptr ptr ptr long ptr ptr)
+@ stdcall -syscall NtQuerySection (long long long long long)
+@ stdcall -syscall NtQuerySecurityObject (long long long long long)
+@ stdcall -syscall NtQuerySemaphore (long long ptr long ptr)
+@ stdcall -syscall NtQuerySymbolicLinkObject(long ptr ptr)
+@ stdcall -syscall NtQuerySystemEnvironmentValue(ptr ptr long ptr)
+@ stdcall -syscall NtQuerySystemEnvironmentValueEx(ptr ptr ptr ptr ptr)
+@ stdcall -syscall NtQuerySystemInformation(long long long long)
+@ stdcall -syscall NtQuerySystemTime(ptr)
+@ stdcall -syscall NtQueryTimer(ptr long ptr long ptr)
+@ stdcall -syscall NtQueryTimerResolution(long long long)
+@ stdcall -syscall NtQueryValueKey(long ptr long ptr long ptr)
+@ stdcall -syscall NtQueryVirtualMemory(long ptr long ptr long ptr)
+@ stdcall -syscall NtQueryVolumeInformationFile(long ptr ptr long long)
+@ stdcall -syscall NtQueueApcThread(long ptr long long long)
+@ stdcall -syscall NtRaiseException(ptr ptr long)
+@ stdcall -syscall NtRaiseHardError(long long ptr ptr long long)
+@ stdcall -syscall NtReadFile(long long ptr ptr ptr ptr long ptr ptr)
+@ stdcall -syscall NtReadFileScatter(long long ptr ptr ptr ptr long ptr ptr)
 @ stub NtReadRequestData
-@ stdcall NtReadVirtualMemory(long ptr ptr long ptr)
+@ stdcall -syscall NtReadVirtualMemory(long ptr ptr long ptr)
 @ stub NtRegisterNewDevice
-@ stdcall NtRegisterThreadTerminatePort(ptr)
-@ stdcall NtReleaseKeyedEvent(long ptr long ptr)
-@ stdcall NtReleaseMutant(long ptr)
+@ stdcall -syscall NtRegisterThreadTerminatePort(ptr)
+@ stdcall -syscall NtReleaseKeyedEvent(long ptr long ptr)
+@ stdcall -syscall NtReleaseMutant(long ptr)
 @ stub NtReleaseProcessMutant
-@ stdcall NtReleaseSemaphore(long long ptr)
-@ stdcall NtRemoveIoCompletion(ptr ptr ptr ptr ptr)
+@ stdcall -syscall NtReleaseSemaphore(long long ptr)
+@ stdcall -syscall NtRemoveIoCompletion(ptr ptr ptr ptr ptr)
 # @ stub NtRemoveProcessDebug
 # @ stub NtRenameKey
-@ stdcall NtReplaceKey(ptr long ptr)
+@ stdcall -syscall NtReplaceKey(ptr long ptr)
 @ stub NtReplyPort
-@ stdcall NtReplyWaitReceivePort(ptr ptr ptr ptr)
+@ stdcall -syscall NtReplyWaitReceivePort(ptr ptr ptr ptr)
 @ stub NtReplyWaitReceivePortEx
 @ stub NtReplyWaitReplyPort
 # @ stub NtRequestDeviceWakeup
 @ stub NtRequestPort
-@ stdcall NtRequestWaitReplyPort(ptr ptr ptr)
+@ stdcall -syscall NtRequestWaitReplyPort(ptr ptr ptr)
 # @ stub NtRequestWakeupLatency
-@ stdcall NtResetEvent(long ptr)
-@ stdcall NtResetWriteWatch(long ptr long)
-@ stdcall NtRestoreKey(long long long)
+@ stdcall -syscall NtResetEvent(long ptr)
+@ stdcall -syscall NtResetWriteWatch(long ptr long)
+@ stdcall -syscall NtRestoreKey(long long long)
 # @ stub NtResumeProcess
-@ stdcall NtResumeThread(long long)
-@ stdcall NtSaveKey(long long)
+@ stdcall -syscall NtResumeThread(long long)
+@ stdcall -syscall NtSaveKey(long long)
 # @ stub NtSaveKeyEx
 # @ stub NtSaveMergedKeys
-@ stdcall NtSecureConnectPort(ptr ptr ptr ptr ptr ptr ptr ptr ptr)
+@ stdcall -syscall NtSecureConnectPort(ptr ptr ptr ptr ptr ptr ptr ptr ptr)
 # @ stub NtSetBootEntryOrder
 # @ stub NtSetBootOptions
-@ stdcall NtSetContextThread(long ptr)
+@ stdcall -syscall NtSetContextThread(long ptr)
 @ stub NtSetDebugFilterState
 @ stub NtSetDefaultHardErrorPort
-@ stdcall NtSetDefaultLocale(long long)
-@ stdcall NtSetDefaultUILanguage(long)
-@ stdcall NtSetEaFile(long ptr ptr long)
-@ stdcall NtSetEvent(long long)
+@ stdcall -syscall NtSetDefaultLocale(long long)
+@ stdcall -syscall NtSetDefaultUILanguage(long)
+@ stdcall -syscall NtSetEaFile(long ptr ptr long)
+@ stdcall -syscall NtSetEvent(long long)
 # @ stub NtSetEventBoostPriority
 @ stub NtSetHighEventPair
 @ stub NtSetHighWaitLowEventPair
 @ stub NtSetHighWaitLowThread
 # @ stub NtSetInformationDebugObject
-@ stdcall NtSetInformationFile(long long long long long)
-@ stdcall NtSetInformationJobObject(long long ptr long)
-@ stdcall NtSetInformationKey(long long ptr long)
-@ stdcall NtSetInformationObject(long long ptr long)
-@ stdcall NtSetInformationProcess(long long long long)
-@ stdcall NtSetInformationThread(long long ptr long)
-@ stdcall NtSetInformationToken(long long ptr long)
-@ stdcall NtSetIntervalProfile(long long)
-@ stdcall NtSetIoCompletion(ptr long ptr long long)
+@ stdcall -syscall NtSetInformationFile(long long long long long)
+@ stdcall -syscall NtSetInformationJobObject(long long ptr long)
+@ stdcall -syscall NtSetInformationKey(long long ptr long)
+@ stdcall -syscall NtSetInformationObject(long long ptr long)
+@ stdcall -syscall NtSetInformationProcess(long long long long)
+@ stdcall -syscall NtSetInformationThread(long long ptr long)
+@ stdcall -syscall NtSetInformationToken(long long ptr long)
+@ stdcall -syscall NtSetIntervalProfile(long long)
+@ stdcall -syscall NtSetIoCompletion(ptr long ptr long long)
 @ stub NtSetLdtEntries
 @ stub NtSetLowEventPair
 @ stub NtSetLowWaitHighEventPair
 @ stub NtSetLowWaitHighThread
 # @ stub NtSetQuotaInformationFile
-@ stdcall NtSetSecurityObject(long long ptr)
+@ stdcall -syscall NtSetSecurityObject(long long ptr)
 @ stub NtSetSystemEnvironmentValue
 # @ stub NtSetSystemEnvironmentValueEx
-@ stdcall NtSetSystemInformation(long ptr long)
+@ stdcall -syscall NtSetSystemInformation(long ptr long)
 @ stub NtSetSystemPowerState
-@ stdcall NtSetSystemTime(ptr ptr)
+@ stdcall -syscall NtSetSystemTime(ptr ptr)
 # @ stub NtSetThreadExecutionState
-@ stdcall NtSetTimer(long ptr ptr ptr long long ptr)
-@ stdcall NtSetTimerResolution(long long ptr)
+@ stdcall -syscall NtSetTimer(long ptr ptr ptr long long ptr)
+@ stdcall -syscall NtSetTimerResolution(long long ptr)
 # @ stub NtSetUuidSeed
-@ stdcall NtSetValueKey(long long long long long long)
-@ stdcall NtSetVolumeInformationFile(long ptr ptr long long)
-@ stdcall NtShutdownSystem(long)
-@ stdcall NtSignalAndWaitForSingleObject(long long long ptr)
+@ stdcall -syscall NtSetValueKey(long long long long long long)
+@ stdcall -syscall NtSetVolumeInformationFile(long ptr ptr long long)
+@ stdcall -syscall NtShutdownSystem(long)
+@ stdcall -syscall NtSignalAndWaitForSingleObject(long long long ptr)
 @ stub NtStartProfile
 @ stub NtStopProfile
 # @ stub NtSuspendProcess
-@ stdcall NtSuspendThread(long ptr)
-@ stdcall NtSystemDebugControl(long ptr long ptr long ptr)
-@ stdcall NtTerminateJobObject(long long)
-@ stdcall NtTerminateProcess(long long)
-@ stdcall NtTerminateThread(long long)
+@ stdcall -syscall NtSuspendThread(long ptr)
+@ stdcall -syscall NtSystemDebugControl(long ptr long ptr long ptr)
+@ stdcall -syscall NtTerminateJobObject(long long)
+@ stdcall -syscall NtTerminateProcess(long long)
+@ stdcall -syscall NtTerminateThread(long long)
 @ stub NtTestAlert
 # @ stub NtTraceEvent
 # @ stub NtTranslateFilePath
-@ stdcall NtUnloadDriver(ptr)
-@ stdcall NtUnloadKey(long)
+@ stdcall -syscall NtUnloadDriver(ptr)
+@ stdcall -syscall NtUnloadKey(long)
 @ stub NtUnloadKeyEx
-@ stdcall NtUnlockFile(long ptr ptr ptr ptr)
-@ stdcall NtUnlockVirtualMemory(long ptr ptr long)
-@ stdcall NtUnmapViewOfSection(long ptr)
+@ stdcall -syscall NtUnlockFile(long ptr ptr ptr ptr)
+@ stdcall -syscall NtUnlockVirtualMemory(long ptr ptr long)
+@ stdcall -syscall NtUnmapViewOfSection(long ptr)
 @ stub NtVdmControl
 @ stub NtW32Call
 # @ stub NtWaitForDebugEvent
-@ stdcall NtWaitForKeyedEvent(long ptr long ptr)
-@ stdcall NtWaitForMultipleObjects(long ptr long long ptr)
+@ stdcall -syscall NtWaitForKeyedEvent(long ptr long ptr)
+@ stdcall -syscall NtWaitForMultipleObjects(long ptr long long ptr)
 @ stub NtWaitForProcessMutant
-@ stdcall NtWaitForSingleObject(long long long)
+@ stdcall -syscall NtWaitForSingleObject(long long long)
 @ stub NtWaitHighEventPair
 @ stub NtWaitLowEventPair
-@ stdcall NtWriteFile(long long ptr ptr ptr ptr long ptr ptr)
-@ stdcall NtWriteFileGather(long long ptr ptr ptr ptr long ptr ptr)
+@ stdcall -syscall NtWriteFile(long long ptr ptr ptr ptr long ptr ptr)
+@ stdcall -syscall NtWriteFileGather(long long ptr ptr ptr ptr long ptr ptr)
 @ stub NtWriteRequestData
-@ stdcall NtWriteVirtualMemory(long ptr ptr long ptr)
-@ stdcall NtYieldExecution()
+@ stdcall -syscall NtWriteVirtualMemory(long ptr ptr long ptr)
+@ stdcall -syscall NtYieldExecution()
 @ stub PfxFindPrefix
 @ stub PfxInitialize
 @ stub PfxInsertPrefix
@@ -1003,301 +1003,301 @@
 @ stdcall TpWaitForWork(ptr long)
 @ stdcall -ret64 VerSetConditionMask(int64 long long)
 @ stdcall WinSqmIsOptedIn()
-@ stdcall ZwAcceptConnectPort(ptr long ptr long long ptr) NtAcceptConnectPort
-@ stdcall ZwAccessCheck(ptr long long ptr ptr ptr ptr ptr) NtAccessCheck
-@ stdcall ZwAccessCheckAndAuditAlarm(ptr long ptr ptr ptr long ptr long ptr ptr ptr) NtAccessCheckAndAuditAlarm
+@ stdcall -syscall ZwAcceptConnectPort(ptr long ptr long long ptr) NtAcceptConnectPort
+@ stdcall -syscall ZwAccessCheck(ptr long long ptr ptr ptr ptr ptr) NtAccessCheck
+@ stdcall -syscall ZwAccessCheckAndAuditAlarm(ptr long ptr ptr ptr long ptr long ptr ptr ptr) NtAccessCheckAndAuditAlarm
 # @ stub ZwAccessCheckByType
 # @ stub ZwAccessCheckByTypeAndAuditAlarm
 # @ stub ZwAccessCheckByTypeResultList
 # @ stub ZwAccessCheckByTypeResultListAndAuditAlarm
 # @ stub ZwAccessCheckByTypeResultListAndAuditAlarmByHandle
-@ stdcall ZwAddAtom(ptr long ptr) NtAddAtom
+@ stdcall -syscall ZwAddAtom(ptr long ptr) NtAddAtom
 # @ stub ZwAddBootEntry
-@ stdcall ZwAdjustGroupsToken(long long ptr long ptr ptr) NtAdjustGroupsToken
-@ stdcall ZwAdjustPrivilegesToken(long long long long long long) NtAdjustPrivilegesToken
-@ stdcall ZwAlertResumeThread(long ptr) NtAlertResumeThread
-@ stdcall ZwAlertThread(long) NtAlertThread
-@ stdcall ZwAllocateLocallyUniqueId(ptr) NtAllocateLocallyUniqueId
+@ stdcall -syscall ZwAdjustGroupsToken(long long ptr long ptr ptr) NtAdjustGroupsToken
+@ stdcall -syscall ZwAdjustPrivilegesToken(long long long long long long) NtAdjustPrivilegesToken
+@ stdcall -syscall ZwAlertResumeThread(long ptr) NtAlertResumeThread
+@ stdcall -syscall ZwAlertThread(long) NtAlertThread
+@ stdcall -syscall ZwAllocateLocallyUniqueId(ptr) NtAllocateLocallyUniqueId
 # @ stub ZwAllocateUserPhysicalPages
-@ stdcall ZwAllocateUuids(ptr ptr ptr) NtAllocateUuids
-@ stdcall ZwAllocateVirtualMemory(long ptr ptr ptr long long) NtAllocateVirtualMemory
-@ stdcall ZwAreMappedFilesTheSame(ptr ptr) NtAreMappedFilesTheSame
-@ stdcall ZwAssignProcessToJobObject(long long) NtAssignProcessToJobObject
+@ stdcall -syscall ZwAllocateUuids(ptr ptr ptr) NtAllocateUuids
+@ stdcall -syscall ZwAllocateVirtualMemory(long ptr ptr ptr long long) NtAllocateVirtualMemory
+@ stdcall -syscall ZwAreMappedFilesTheSame(ptr ptr) NtAreMappedFilesTheSame
+@ stdcall -syscall ZwAssignProcessToJobObject(long long) NtAssignProcessToJobObject
 @ stub ZwCallbackReturn
 # @ stub ZwCancelDeviceWakeupRequest
-@ stdcall ZwCancelIoFile(long ptr) NtCancelIoFile
-@ stdcall ZwCancelIoFileEx(long ptr ptr) NtCancelIoFileEx
-@ stdcall ZwCancelTimer(long ptr) NtCancelTimer
-@ stdcall ZwClearEvent(long) NtClearEvent
-@ stdcall ZwClose(long) NtClose
+@ stdcall -syscall ZwCancelIoFile(long ptr) NtCancelIoFile
+@ stdcall -syscall ZwCancelIoFileEx(long ptr ptr) NtCancelIoFileEx
+@ stdcall -syscall ZwCancelTimer(long ptr) NtCancelTimer
+@ stdcall -syscall ZwClearEvent(long) NtClearEvent
+@ stdcall -syscall ZwClose(long) NtClose
 @ stub ZwCloseObjectAuditAlarm
 # @ stub ZwCompactKeys
 # @ stub ZwCompareTokens
-@ stdcall ZwCompleteConnectPort(ptr) NtCompleteConnectPort
+@ stdcall -syscall ZwCompleteConnectPort(ptr) NtCompleteConnectPort
 # @ stub ZwCompressKey
-@ stdcall ZwConnectPort(ptr ptr ptr ptr ptr ptr ptr ptr) NtConnectPort
+@ stdcall -syscall ZwConnectPort(ptr ptr ptr ptr ptr ptr ptr ptr) NtConnectPort
 @ stub ZwContinue
 # @ stub ZwCreateDebugObject
-@ stdcall ZwCreateDirectoryObject(long long long) NtCreateDirectoryObject
-@ stdcall ZwCreateEvent(long long long long long) NtCreateEvent
+@ stdcall -syscall ZwCreateDirectoryObject(long long long) NtCreateDirectoryObject
+@ stdcall -syscall ZwCreateEvent(long long long long long) NtCreateEvent
 @ stub ZwCreateEventPair
-@ stdcall ZwCreateFile(ptr long ptr ptr long long long ptr long long ptr) NtCreateFile
-@ stdcall ZwCreateIoCompletion(ptr long ptr long) NtCreateIoCompletion
-@ stdcall ZwCreateJobObject(ptr long ptr) NtCreateJobObject
+@ stdcall -syscall ZwCreateFile(ptr long ptr ptr long long long ptr long long ptr) NtCreateFile
+@ stdcall -syscall ZwCreateIoCompletion(ptr long ptr long) NtCreateIoCompletion
+@ stdcall -syscall ZwCreateJobObject(ptr long ptr) NtCreateJobObject
 # @ stub ZwCreateJobSet
-@ stdcall ZwCreateKey(ptr long ptr long ptr long long) NtCreateKey
-@ stdcall ZwCreateKeyedEvent(ptr long ptr long) NtCreateKeyedEvent
-@ stdcall ZwCreateMailslotFile(long long long long long long long long) NtCreateMailslotFile
-@ stdcall ZwCreateMutant(ptr long ptr long) NtCreateMutant
-@ stdcall ZwCreateNamedPipeFile(ptr long ptr ptr long long long long long long long long long ptr) NtCreateNamedPipeFile
-@ stdcall ZwCreatePagingFile(long long long long) NtCreatePagingFile
-@ stdcall ZwCreatePort(ptr ptr long long ptr) NtCreatePort
+@ stdcall -syscall ZwCreateKey(ptr long ptr long ptr long long) NtCreateKey
+@ stdcall -syscall ZwCreateKeyedEvent(ptr long ptr long) NtCreateKeyedEvent
+@ stdcall -syscall ZwCreateMailslotFile(long long long long long long long long) NtCreateMailslotFile
+@ stdcall -syscall ZwCreateMutant(ptr long ptr long) NtCreateMutant
+@ stdcall -syscall ZwCreateNamedPipeFile(ptr long ptr ptr long long long long long long long long long ptr) NtCreateNamedPipeFile
+@ stdcall -syscall ZwCreatePagingFile(long long long long) NtCreatePagingFile
+@ stdcall -syscall ZwCreatePort(ptr ptr long long ptr) NtCreatePort
 @ stub ZwCreateProcess
 # @ stub ZwCreateProcessEx
 @ stub ZwCreateProfile
-@ stdcall ZwCreateSection(ptr long ptr ptr long long long) NtCreateSection
-@ stdcall ZwCreateSemaphore(ptr long ptr long long) NtCreateSemaphore
-@ stdcall ZwCreateSymbolicLinkObject(ptr long ptr ptr) NtCreateSymbolicLinkObject
+@ stdcall -syscall ZwCreateSection(ptr long ptr ptr long long long) NtCreateSection
+@ stdcall -syscall ZwCreateSemaphore(ptr long ptr long long) NtCreateSemaphore
+@ stdcall -syscall ZwCreateSymbolicLinkObject(ptr long ptr ptr) NtCreateSymbolicLinkObject
 @ stub ZwCreateThread
-@ stdcall ZwCreateTimer(ptr long ptr long) NtCreateTimer
+@ stdcall -syscall ZwCreateTimer(ptr long ptr long) NtCreateTimer
 @ stub ZwCreateToken
 # @ stub ZwCreateWaitablePort
 # @ stub ZwDebugActiveProcess
 # @ stub ZwDebugContinue
-@ stdcall ZwDelayExecution(long ptr) NtDelayExecution
-@ stdcall ZwDeleteAtom(long) NtDeleteAtom
+@ stdcall -syscall ZwDelayExecution(long ptr) NtDelayExecution
+@ stdcall -syscall ZwDeleteAtom(long) NtDeleteAtom
 # @ stub ZwDeleteBootEntry
-@ stdcall ZwDeleteFile(ptr) NtDeleteFile
-@ stdcall ZwDeleteKey(long) NtDeleteKey
+@ stdcall -syscall ZwDeleteFile(ptr) NtDeleteFile
+@ stdcall -syscall ZwDeleteKey(long) NtDeleteKey
 # @ stub ZwDeleteObjectAuditAlarm
-@ stdcall ZwDeleteValueKey(long ptr) NtDeleteValueKey
-@ stdcall ZwDeviceIoControlFile(long long long long long long long long long long) NtDeviceIoControlFile
-@ stdcall ZwDisplayString(ptr) NtDisplayString
-@ stdcall ZwDuplicateObject(long long long ptr long long long) NtDuplicateObject
-@ stdcall ZwDuplicateToken(long long long long long long) NtDuplicateToken
+@ stdcall -syscall ZwDeleteValueKey(long ptr) NtDeleteValueKey
+@ stdcall -syscall ZwDeviceIoControlFile(long long long long long long long long long long) NtDeviceIoControlFile
+@ stdcall -syscall ZwDisplayString(ptr) NtDisplayString
+@ stdcall -syscall ZwDuplicateObject(long long long ptr long long long) NtDuplicateObject
+@ stdcall -syscall ZwDuplicateToken(long long long long long long) NtDuplicateToken
 # @ stub ZwEnumerateBootEntries
 @ stub ZwEnumerateBus
-@ stdcall ZwEnumerateKey(long long long ptr long ptr) NtEnumerateKey
+@ stdcall -syscall ZwEnumerateKey(long long long ptr long ptr) NtEnumerateKey
 # @ stub ZwEnumerateSystemEnvironmentValuesEx
-@ stdcall ZwEnumerateValueKey(long long long ptr long ptr) NtEnumerateValueKey
+@ stdcall -syscall ZwEnumerateValueKey(long long long ptr long ptr) NtEnumerateValueKey
 @ stub ZwExtendSection
 # @ stub ZwFilterToken
-@ stdcall ZwFindAtom(ptr long ptr) NtFindAtom
-@ stdcall ZwFlushBuffersFile(long ptr) NtFlushBuffersFile
-@ stdcall ZwFlushInstructionCache(long ptr long) NtFlushInstructionCache
-@ stdcall ZwFlushKey(long) NtFlushKey
-@ stdcall ZwFlushVirtualMemory(long ptr ptr long) NtFlushVirtualMemory
+@ stdcall -syscall ZwFindAtom(ptr long ptr) NtFindAtom
+@ stdcall -syscall ZwFlushBuffersFile(long ptr) NtFlushBuffersFile
+@ stdcall -syscall ZwFlushInstructionCache(long ptr long) NtFlushInstructionCache
+@ stdcall -syscall ZwFlushKey(long) NtFlushKey
+@ stdcall -syscall ZwFlushVirtualMemory(long ptr ptr long) NtFlushVirtualMemory
 @ stub ZwFlushWriteBuffer
 # @ stub ZwFreeUserPhysicalPages
-@ stdcall ZwFreeVirtualMemory(long ptr ptr long) NtFreeVirtualMemory
-@ stdcall ZwFsControlFile(long long long long long long long long long long) NtFsControlFile
-@ stdcall ZwGetContextThread(long ptr) NtGetContextThread
-@ stdcall ZwGetCurrentProcessorNumber() NtGetCurrentProcessorNumber
+@ stdcall -syscall ZwFreeVirtualMemory(long ptr ptr long) NtFreeVirtualMemory
+@ stdcall -syscall ZwFsControlFile(long long long long long long long long long long) NtFsControlFile
+@ stdcall -syscall ZwGetContextThread(long ptr) NtGetContextThread
+@ stdcall -syscall ZwGetCurrentProcessorNumber() NtGetCurrentProcessorNumber
 # @ stub ZwGetDevicePowerState
 @ stub ZwGetPlugPlayEvent
-@ stdcall ZwGetTickCount() NtGetTickCount
-@ stdcall ZwGetWriteWatch(long long ptr long ptr ptr ptr) NtGetWriteWatch
-@ stdcall ZwImpersonateAnonymousToken(long) NtImpersonateAnonymousToken
+@ stdcall -syscall ZwGetTickCount() NtGetTickCount
+@ stdcall -syscall ZwGetWriteWatch(long long ptr long ptr ptr ptr) NtGetWriteWatch
+@ stdcall -syscall ZwImpersonateAnonymousToken(long) NtImpersonateAnonymousToken
 @ stub ZwImpersonateClientOfPort
 @ stub ZwImpersonateThread
 @ stub ZwInitializeRegistry
-@ stdcall ZwInitiatePowerAction(long long long long) NtInitiatePowerAction
-@ stdcall ZwIsProcessInJob(long long) NtIsProcessInJob
+@ stdcall -syscall ZwInitiatePowerAction(long long long long) NtInitiatePowerAction
+@ stdcall -syscall ZwIsProcessInJob(long long) NtIsProcessInJob
 # @ stub ZwIsSystemResumeAutomatic
-@ stdcall ZwListenPort(ptr ptr) NtListenPort
-@ stdcall ZwLoadDriver(ptr) NtLoadDriver
+@ stdcall -syscall ZwListenPort(ptr ptr) NtListenPort
+@ stdcall -syscall ZwLoadDriver(ptr) NtLoadDriver
 # @ stub ZwLoadKey2
-@ stdcall ZwLoadKey(ptr ptr) NtLoadKey
-@ stdcall ZwLockFile(long long ptr ptr ptr ptr ptr ptr long long) NtLockFile
+@ stdcall -syscall ZwLoadKey(ptr ptr) NtLoadKey
+@ stdcall -syscall ZwLockFile(long long ptr ptr ptr ptr ptr ptr long long) NtLockFile
 # @ stub ZwLockProductActivationKeys
 # @ stub ZwLockRegistryKey
-@ stdcall ZwLockVirtualMemory(long ptr ptr long) NtLockVirtualMemory
+@ stdcall -syscall ZwLockVirtualMemory(long ptr ptr long) NtLockVirtualMemory
 # @ stub ZwMakePermanentObject
-@ stdcall ZwMakeTemporaryObject(long) NtMakeTemporaryObject
+@ stdcall -syscall ZwMakeTemporaryObject(long) NtMakeTemporaryObject
 # @ stub ZwMapUserPhysicalPages
 # @ stub ZwMapUserPhysicalPagesScatter
-@ stdcall ZwMapViewOfSection(long long ptr long long ptr ptr long long long) NtMapViewOfSection
+@ stdcall -syscall ZwMapViewOfSection(long long ptr long long ptr ptr long long long) NtMapViewOfSection
 # @ stub ZwModifyBootEntry
-@ stdcall ZwNotifyChangeDirectoryFile(long long ptr ptr ptr ptr long long long) NtNotifyChangeDirectoryFile
-@ stdcall ZwNotifyChangeKey(long long ptr ptr ptr long long ptr long long) NtNotifyChangeKey
+@ stdcall -syscall ZwNotifyChangeDirectoryFile(long long ptr ptr ptr ptr long long long) NtNotifyChangeDirectoryFile
+@ stdcall -syscall ZwNotifyChangeKey(long long ptr ptr ptr long long ptr long long) NtNotifyChangeKey
 # @ stub ZwNotifyChangeMultipleKeys
-@ stdcall ZwOpenDirectoryObject(long long long) NtOpenDirectoryObject
-@ stdcall ZwOpenEvent(long long long) NtOpenEvent
+@ stdcall -syscall ZwOpenDirectoryObject(long long long) NtOpenDirectoryObject
+@ stdcall -syscall ZwOpenEvent(long long long) NtOpenEvent
 @ stub ZwOpenEventPair
-@ stdcall ZwOpenFile(ptr long ptr ptr long long) NtOpenFile
-@ stdcall ZwOpenIoCompletion(ptr long ptr) NtOpenIoCompletion
-@ stdcall ZwOpenJobObject(ptr long ptr) NtOpenJobObject
-@ stdcall ZwOpenKey(ptr long ptr) NtOpenKey
-@ stdcall ZwOpenKeyedEvent(ptr long ptr) NtOpenKeyedEvent
-@ stdcall ZwOpenMutant(ptr long ptr) NtOpenMutant
+@ stdcall -syscall ZwOpenFile(ptr long ptr ptr long long) NtOpenFile
+@ stdcall -syscall ZwOpenIoCompletion(ptr long ptr) NtOpenIoCompletion
+@ stdcall -syscall ZwOpenJobObject(ptr long ptr) NtOpenJobObject
+@ stdcall -syscall ZwOpenKey(ptr long ptr) NtOpenKey
+@ stdcall -syscall ZwOpenKeyedEvent(ptr long ptr) NtOpenKeyedEvent
+@ stdcall -syscall ZwOpenMutant(ptr long ptr) NtOpenMutant
 @ stub ZwOpenObjectAuditAlarm
-@ stdcall ZwOpenProcess(ptr long ptr ptr) NtOpenProcess
-@ stdcall ZwOpenProcessToken(long long ptr) NtOpenProcessToken
-@ stdcall ZwOpenProcessTokenEx(long long long ptr) NtOpenProcessTokenEx
-@ stdcall ZwOpenSection(ptr long ptr) NtOpenSection
-@ stdcall ZwOpenSemaphore(long long ptr) NtOpenSemaphore
-@ stdcall ZwOpenSymbolicLinkObject (ptr long ptr) NtOpenSymbolicLinkObject
-@ stdcall ZwOpenThread(ptr long ptr ptr) NtOpenThread
-@ stdcall ZwOpenThreadToken(long long long ptr) NtOpenThreadToken
-@ stdcall ZwOpenThreadTokenEx(long long long long ptr) NtOpenThreadTokenEx
-@ stdcall ZwOpenTimer(ptr long ptr) NtOpenTimer
+@ stdcall -syscall ZwOpenProcess(ptr long ptr ptr) NtOpenProcess
+@ stdcall -syscall ZwOpenProcessToken(long long ptr) NtOpenProcessToken
+@ stdcall -syscall ZwOpenProcessTokenEx(long long long ptr) NtOpenProcessTokenEx
+@ stdcall -syscall ZwOpenSection(ptr long ptr) NtOpenSection
+@ stdcall -syscall ZwOpenSemaphore(long long ptr) NtOpenSemaphore
+@ stdcall -syscall ZwOpenSymbolicLinkObject (ptr long ptr) NtOpenSymbolicLinkObject
+@ stdcall -syscall ZwOpenThread(ptr long ptr ptr) NtOpenThread
+@ stdcall -syscall ZwOpenThreadToken(long long long ptr) NtOpenThreadToken
+@ stdcall -syscall ZwOpenThreadTokenEx(long long long long ptr) NtOpenThreadTokenEx
+@ stdcall -syscall ZwOpenTimer(ptr long ptr) NtOpenTimer
 @ stub ZwPlugPlayControl
-@ stdcall ZwPowerInformation(long ptr long ptr long) NtPowerInformation
-@ stdcall ZwPrivilegeCheck(ptr ptr ptr) NtPrivilegeCheck
+@ stdcall -syscall ZwPowerInformation(long ptr long ptr long) NtPowerInformation
+@ stdcall -syscall ZwPrivilegeCheck(ptr ptr ptr) NtPrivilegeCheck
 @ stub ZwPrivilegeObjectAuditAlarm
 @ stub ZwPrivilegedServiceAuditAlarm
-@ stdcall ZwProtectVirtualMemory(long ptr ptr long ptr) NtProtectVirtualMemory
-@ stdcall ZwPulseEvent(long ptr) NtPulseEvent
-@ stdcall ZwQueryAttributesFile(ptr ptr) NtQueryAttributesFile
+@ stdcall -syscall ZwProtectVirtualMemory(long ptr ptr long ptr) NtProtectVirtualMemory
+@ stdcall -syscall ZwPulseEvent(long ptr) NtPulseEvent
+@ stdcall -syscall ZwQueryAttributesFile(ptr ptr) NtQueryAttributesFile
 # @ stub ZwQueryBootEntryOrder
 # @ stub ZwQueryBootOptions
 # @ stub ZwQueryDebugFilterState
-@ stdcall ZwQueryDefaultLocale(long ptr) NtQueryDefaultLocale
-@ stdcall ZwQueryDefaultUILanguage(ptr) NtQueryDefaultUILanguage
-@ stdcall ZwQueryDirectoryFile(long long ptr ptr ptr ptr long long long ptr long) NtQueryDirectoryFile
-@ stdcall ZwQueryDirectoryObject(long ptr long long long ptr ptr) NtQueryDirectoryObject
-@ stdcall ZwQueryEaFile(long ptr ptr long long ptr long ptr long) NtQueryEaFile
-@ stdcall ZwQueryEvent(long long ptr long ptr) NtQueryEvent
-@ stdcall ZwQueryFullAttributesFile(ptr ptr) NtQueryFullAttributesFile
-@ stdcall ZwQueryInformationAtom(long long ptr long ptr) NtQueryInformationAtom
-@ stdcall ZwQueryInformationFile(long ptr ptr long long) NtQueryInformationFile
-@ stdcall ZwQueryInformationJobObject(long long ptr long ptr) NtQueryInformationJobObject
+@ stdcall -syscall ZwQueryDefaultLocale(long ptr) NtQueryDefaultLocale
+@ stdcall -syscall ZwQueryDefaultUILanguage(ptr) NtQueryDefaultUILanguage
+@ stdcall -syscall ZwQueryDirectoryFile(long long ptr ptr ptr ptr long long long ptr long) NtQueryDirectoryFile
+@ stdcall -syscall ZwQueryDirectoryObject(long ptr long long long ptr ptr) NtQueryDirectoryObject
+@ stdcall -syscall ZwQueryEaFile(long ptr ptr long long ptr long ptr long) NtQueryEaFile
+@ stdcall -syscall ZwQueryEvent(long long ptr long ptr) NtQueryEvent
+@ stdcall -syscall ZwQueryFullAttributesFile(ptr ptr) NtQueryFullAttributesFile
+@ stdcall -syscall ZwQueryInformationAtom(long long ptr long ptr) NtQueryInformationAtom
+@ stdcall -syscall ZwQueryInformationFile(long ptr ptr long long) NtQueryInformationFile
+@ stdcall -syscall ZwQueryInformationJobObject(long long ptr long ptr) NtQueryInformationJobObject
 @ stub ZwQueryInformationPort
-@ stdcall ZwQueryInformationProcess(long long ptr long ptr) NtQueryInformationProcess
-@ stdcall ZwQueryInformationThread(long long ptr long ptr) NtQueryInformationThread
-@ stdcall ZwQueryInformationToken(long long ptr long ptr) NtQueryInformationToken
-@ stdcall ZwQueryInstallUILanguage(ptr) NtQueryInstallUILanguage
+@ stdcall -syscall ZwQueryInformationProcess(long long ptr long ptr) NtQueryInformationProcess
+@ stdcall -syscall ZwQueryInformationThread(long long ptr long ptr) NtQueryInformationThread
+@ stdcall -syscall ZwQueryInformationToken(long long ptr long ptr) NtQueryInformationToken
+@ stdcall -syscall ZwQueryInstallUILanguage(ptr) NtQueryInstallUILanguage
 @ stub ZwQueryIntervalProfile
-@ stdcall ZwQueryIoCompletion(long long ptr long ptr) NtQueryIoCompletion
-@ stdcall ZwQueryKey(long long ptr long ptr) NtQueryKey
-@ stdcall ZwQueryLicenseValue(ptr ptr ptr long ptr) NtQueryLicenseValue
-@ stdcall ZwQueryMultipleValueKey(long ptr long ptr long ptr) NtQueryMultipleValueKey
-@ stdcall ZwQueryMutant(long long ptr long ptr) NtQueryMutant
-@ stdcall ZwQueryObject(long long long long long) NtQueryObject
+@ stdcall -syscall ZwQueryIoCompletion(long long ptr long ptr) NtQueryIoCompletion
+@ stdcall -syscall ZwQueryKey(long long ptr long ptr) NtQueryKey
+@ stdcall -syscall ZwQueryLicenseValue(ptr ptr ptr long ptr) NtQueryLicenseValue
+@ stdcall -syscall ZwQueryMultipleValueKey(long ptr long ptr long ptr) NtQueryMultipleValueKey
+@ stdcall -syscall ZwQueryMutant(long long ptr long ptr) NtQueryMutant
+@ stdcall -syscall ZwQueryObject(long long long long long) NtQueryObject
 @ stub ZwQueryOpenSubKeys
-@ stdcall ZwQueryPerformanceCounter(ptr ptr) NtQueryPerformanceCounter
+@ stdcall -syscall ZwQueryPerformanceCounter(ptr ptr) NtQueryPerformanceCounter
 # @ stub ZwQueryPortInformationProcess
 # @ stub ZwQueryQuotaInformationFile
-@ stdcall ZwQuerySection (long long long long long) NtQuerySection
-@ stdcall ZwQuerySecurityObject (long long long long long) NtQuerySecurityObject
-@ stdcall ZwQuerySemaphore(long long ptr long ptr) NtQuerySemaphore
-@ stdcall ZwQuerySymbolicLinkObject(long ptr ptr) NtQuerySymbolicLinkObject
-@ stdcall ZwQuerySystemEnvironmentValue(ptr ptr long ptr) NtQuerySystemEnvironmentValue
-@ stdcall ZwQuerySystemEnvironmentValueEx(ptr ptr ptr ptr ptr) NtQuerySystemEnvironmentValueEx
-@ stdcall ZwQuerySystemInformation(long long long long) NtQuerySystemInformation
-@ stdcall ZwQuerySystemTime(ptr) NtQuerySystemTime
-@ stdcall ZwQueryTimer(ptr long ptr long ptr) NtQueryTimer
-@ stdcall ZwQueryTimerResolution(long long long) NtQueryTimerResolution
-@ stdcall ZwQueryValueKey(long ptr long ptr long ptr) NtQueryValueKey
-@ stdcall ZwQueryVirtualMemory(long ptr long ptr long ptr) NtQueryVirtualMemory
-@ stdcall ZwQueryVolumeInformationFile(long ptr ptr long long) NtQueryVolumeInformationFile
-@ stdcall ZwQueueApcThread(long ptr long long long) NtQueueApcThread
-@ stdcall ZwRaiseException(ptr ptr long) NtRaiseException
-@ stdcall ZwRaiseHardError(long long ptr ptr long long) NtRaiseHardError
-@ stdcall ZwReadFile(long long ptr ptr ptr ptr long ptr ptr) NtReadFile
-@ stdcall ZwReadFileScatter(long long ptr ptr ptr ptr long ptr ptr) NtReadFileScatter
+@ stdcall -syscall ZwQuerySection (long long long long long) NtQuerySection
+@ stdcall -syscall ZwQuerySecurityObject (long long long long long) NtQuerySecurityObject
+@ stdcall -syscall ZwQuerySemaphore(long long ptr long ptr) NtQuerySemaphore
+@ stdcall -syscall ZwQuerySymbolicLinkObject(long ptr ptr) NtQuerySymbolicLinkObject
+@ stdcall -syscall ZwQuerySystemEnvironmentValue(ptr ptr long ptr) NtQuerySystemEnvironmentValue
+@ stdcall -syscall ZwQuerySystemEnvironmentValueEx(ptr ptr ptr ptr ptr) NtQuerySystemEnvironmentValueEx
+@ stdcall -syscall ZwQuerySystemInformation(long long long long) NtQuerySystemInformation
+@ stdcall -syscall ZwQuerySystemTime(ptr) NtQuerySystemTime
+@ stdcall -syscall ZwQueryTimer(ptr long ptr long ptr) NtQueryTimer
+@ stdcall -syscall ZwQueryTimerResolution(long long long) NtQueryTimerResolution
+@ stdcall -syscall ZwQueryValueKey(long ptr long ptr long ptr) NtQueryValueKey
+@ stdcall -syscall ZwQueryVirtualMemory(long ptr long ptr long ptr) NtQueryVirtualMemory
+@ stdcall -syscall ZwQueryVolumeInformationFile(long ptr ptr long long) NtQueryVolumeInformationFile
+@ stdcall -syscall ZwQueueApcThread(long ptr long long long) NtQueueApcThread
+@ stdcall -syscall ZwRaiseException(ptr ptr long) NtRaiseException
+@ stdcall -syscall ZwRaiseHardError(long long ptr ptr long long) NtRaiseHardError
+@ stdcall -syscall ZwReadFile(long long ptr ptr ptr ptr long ptr ptr) NtReadFile
+@ stdcall -syscall ZwReadFileScatter(long long ptr ptr ptr ptr long ptr ptr) NtReadFileScatter
 @ stub ZwReadRequestData
-@ stdcall ZwReadVirtualMemory(long ptr ptr long ptr) NtReadVirtualMemory
+@ stdcall -syscall ZwReadVirtualMemory(long ptr ptr long ptr) NtReadVirtualMemory
 @ stub ZwRegisterNewDevice
-@ stdcall ZwRegisterThreadTerminatePort(ptr) NtRegisterThreadTerminatePort
-@ stdcall ZwReleaseKeyedEvent(long ptr long ptr) NtReleaseKeyedEvent
-@ stdcall ZwReleaseMutant(long ptr) NtReleaseMutant
+@ stdcall -syscall ZwRegisterThreadTerminatePort(ptr) NtRegisterThreadTerminatePort
+@ stdcall -syscall ZwReleaseKeyedEvent(long ptr long ptr) NtReleaseKeyedEvent
+@ stdcall -syscall ZwReleaseMutant(long ptr) NtReleaseMutant
 @ stub ZwReleaseProcessMutant
-@ stdcall ZwReleaseSemaphore(long long ptr) NtReleaseSemaphore
-@ stdcall ZwRemoveIoCompletion(ptr ptr ptr ptr ptr) NtRemoveIoCompletion
+@ stdcall -syscall ZwReleaseSemaphore(long long ptr) NtReleaseSemaphore
+@ stdcall -syscall ZwRemoveIoCompletion(ptr ptr ptr ptr ptr) NtRemoveIoCompletion
 # @ stub ZwRemoveProcessDebug
 # @ stub ZwRenameKey
-@ stdcall ZwReplaceKey(ptr long ptr) NtReplaceKey
+@ stdcall -syscall ZwReplaceKey(ptr long ptr) NtReplaceKey
 @ stub ZwReplyPort
-@ stdcall ZwReplyWaitReceivePort(ptr ptr ptr ptr) NtReplyWaitReceivePort
+@ stdcall -syscall ZwReplyWaitReceivePort(ptr ptr ptr ptr) NtReplyWaitReceivePort
 @ stub ZwReplyWaitReceivePortEx
 @ stub ZwReplyWaitReplyPort
 # @ stub ZwRequestDeviceWakeup
 @ stub ZwRequestPort
-@ stdcall ZwRequestWaitReplyPort(ptr ptr ptr) NtRequestWaitReplyPort
+@ stdcall -syscall ZwRequestWaitReplyPort(ptr ptr ptr) NtRequestWaitReplyPort
 # @ stub ZwRequestWakeupLatency
-@ stdcall ZwResetEvent(long ptr) NtResetEvent
-@ stdcall ZwResetWriteWatch(long ptr long) NtResetWriteWatch
-@ stdcall ZwRestoreKey(long long long) NtRestoreKey
+@ stdcall -syscall ZwResetEvent(long ptr) NtResetEvent
+@ stdcall -syscall ZwResetWriteWatch(long ptr long) NtResetWriteWatch
+@ stdcall -syscall ZwRestoreKey(long long long) NtRestoreKey
 # @ stub ZwResumeProcess
-@ stdcall ZwResumeThread(long long) NtResumeThread
-@ stdcall ZwSaveKey(long long) NtSaveKey
+@ stdcall -syscall ZwResumeThread(long long) NtResumeThread
+@ stdcall -syscall ZwSaveKey(long long) NtSaveKey
 # @ stub ZwSaveKeyEx
 # @ stub ZwSaveMergedKeys
-@ stdcall ZwSecureConnectPort(ptr ptr ptr ptr ptr ptr ptr ptr ptr) NtSecureConnectPort
+@ stdcall -syscall ZwSecureConnectPort(ptr ptr ptr ptr ptr ptr ptr ptr ptr) NtSecureConnectPort
 # @ stub ZwSetBootEntryOrder
 # @ stub ZwSetBootOptions
-@ stdcall ZwSetContextThread(long ptr) NtSetContextThread
+@ stdcall -syscall ZwSetContextThread(long ptr) NtSetContextThread
 @ stub ZwSetDebugFilterState
 @ stub ZwSetDefaultHardErrorPort
-@ stdcall ZwSetDefaultLocale(long long) NtSetDefaultLocale
-@ stdcall ZwSetDefaultUILanguage(long) NtSetDefaultUILanguage
-@ stdcall ZwSetEaFile(long ptr ptr long) NtSetEaFile
-@ stdcall ZwSetEvent(long long) NtSetEvent
+@ stdcall -syscall ZwSetDefaultLocale(long long) NtSetDefaultLocale
+@ stdcall -syscall ZwSetDefaultUILanguage(long) NtSetDefaultUILanguage
+@ stdcall -syscall ZwSetEaFile(long ptr ptr long) NtSetEaFile
+@ stdcall -syscall ZwSetEvent(long long) NtSetEvent
 # @ stub ZwSetEventBoostPriority
 @ stub ZwSetHighEventPair
 @ stub ZwSetHighWaitLowEventPair
 @ stub ZwSetHighWaitLowThread
 # @ stub ZwSetInformationDebugObject
-@ stdcall ZwSetInformationFile(long long long long long) NtSetInformationFile
-@ stdcall ZwSetInformationJobObject(long long ptr long) NtSetInformationJobObject
-@ stdcall ZwSetInformationKey(long long ptr long) NtSetInformationKey
-@ stdcall ZwSetInformationObject(long long ptr long) NtSetInformationObject
-@ stdcall ZwSetInformationProcess(long long long long) NtSetInformationProcess
-@ stdcall ZwSetInformationThread(long long ptr long) NtSetInformationThread
-@ stdcall ZwSetInformationToken(long long ptr long) NtSetInformationToken
-@ stdcall ZwSetIntervalProfile(long long) NtSetIntervalProfile
-@ stdcall ZwSetIoCompletion(ptr long ptr long long) NtSetIoCompletion
+@ stdcall -syscall ZwSetInformationFile(long long long long long) NtSetInformationFile
+@ stdcall -syscall ZwSetInformationJobObject(long long ptr long) NtSetInformationJobObject
+@ stdcall -syscall ZwSetInformationKey(long long ptr long) NtSetInformationKey
+@ stdcall -syscall ZwSetInformationObject(long long ptr long) NtSetInformationObject
+@ stdcall -syscall ZwSetInformationProcess(long long long long) NtSetInformationProcess
+@ stdcall -syscall ZwSetInformationThread(long long ptr long) NtSetInformationThread
+@ stdcall -syscall ZwSetInformationToken(long long ptr long) NtSetInformationToken
+@ stdcall -syscall ZwSetIntervalProfile(long long) NtSetIntervalProfile
+@ stdcall -syscall ZwSetIoCompletion(ptr long ptr long long) NtSetIoCompletion
 @ stub ZwSetLdtEntries
 @ stub ZwSetLowEventPair
 @ stub ZwSetLowWaitHighEventPair
 @ stub ZwSetLowWaitHighThread
 # @ stub ZwSetQuotaInformationFile
-@ stdcall ZwSetSecurityObject(long long ptr) NtSetSecurityObject
+@ stdcall -syscall ZwSetSecurityObject(long long ptr) NtSetSecurityObject
 @ stub ZwSetSystemEnvironmentValue
 # @ stub ZwSetSystemEnvironmentValueEx
-@ stdcall ZwSetSystemInformation(long ptr long) NtSetSystemInformation
+@ stdcall -syscall ZwSetSystemInformation(long ptr long) NtSetSystemInformation
 @ stub ZwSetSystemPowerState
-@ stdcall ZwSetSystemTime(ptr ptr) NtSetSystemTime
+@ stdcall -syscall ZwSetSystemTime(ptr ptr) NtSetSystemTime
 # @ stub ZwSetThreadExecutionState
-@ stdcall ZwSetTimer(long ptr ptr ptr long long ptr) NtSetTimer
-@ stdcall ZwSetTimerResolution(long long ptr) NtSetTimerResolution
+@ stdcall -syscall ZwSetTimer(long ptr ptr ptr long long ptr) NtSetTimer
+@ stdcall -syscall ZwSetTimerResolution(long long ptr) NtSetTimerResolution
 # @ stub ZwSetUuidSeed
-@ stdcall ZwSetValueKey(long long long long long long) NtSetValueKey
-@ stdcall ZwSetVolumeInformationFile(long ptr ptr long long) NtSetVolumeInformationFile
-@ stdcall ZwShutdownSystem(long) NtShutdownSystem
-@ stdcall ZwSignalAndWaitForSingleObject(long long long ptr) NtSignalAndWaitForSingleObject
+@ stdcall -syscall ZwSetValueKey(long long long long long long) NtSetValueKey
+@ stdcall -syscall ZwSetVolumeInformationFile(long ptr ptr long long) NtSetVolumeInformationFile
+@ stdcall -syscall ZwShutdownSystem(long) NtShutdownSystem
+@ stdcall -syscall ZwSignalAndWaitForSingleObject(long long long ptr) NtSignalAndWaitForSingleObject
 @ stub ZwStartProfile
 @ stub ZwStopProfile
 # @ stub ZwSuspendProcess
-@ stdcall ZwSuspendThread(long ptr) NtSuspendThread
-@ stdcall ZwSystemDebugControl(long ptr long ptr long ptr) NtSystemDebugControl
-@ stdcall ZwTerminateJobObject(long long) NtTerminateJobObject
-@ stdcall ZwTerminateProcess(long long) NtTerminateProcess
-@ stdcall ZwTerminateThread(long long) NtTerminateThread
+@ stdcall -syscall ZwSuspendThread(long ptr) NtSuspendThread
+@ stdcall -syscall ZwSystemDebugControl(long ptr long ptr long ptr) NtSystemDebugControl
+@ stdcall -syscall ZwTerminateJobObject(long long) NtTerminateJobObject
+@ stdcall -syscall ZwTerminateProcess(long long) NtTerminateProcess
+@ stdcall -syscall ZwTerminateThread(long long) NtTerminateThread
 @ stub ZwTestAlert
 # @ stub ZwTraceEvent
 # @ stub ZwTranslateFilePath
-@ stdcall ZwUnloadDriver(ptr) NtUnloadDriver
-@ stdcall ZwUnloadKey(long) NtUnloadKey
+@ stdcall -syscall ZwUnloadDriver(ptr) NtUnloadDriver
+@ stdcall -syscall ZwUnloadKey(long) NtUnloadKey
 @ stub ZwUnloadKeyEx
-@ stdcall ZwUnlockFile(long ptr ptr ptr ptr) NtUnlockFile
-@ stdcall ZwUnlockVirtualMemory(long ptr ptr long) NtUnlockVirtualMemory
-@ stdcall ZwUnmapViewOfSection(long ptr) NtUnmapViewOfSection
+@ stdcall -syscall ZwUnlockFile(long ptr ptr ptr ptr) NtUnlockFile
+@ stdcall -syscall ZwUnlockVirtualMemory(long ptr ptr long) NtUnlockVirtualMemory
+@ stdcall -syscall ZwUnmapViewOfSection(long ptr) NtUnmapViewOfSection
 @ stub ZwVdmControl
 @ stub ZwW32Call
 # @ stub ZwWaitForDebugEvent
-@ stdcall ZwWaitForKeyedEvent(long ptr long ptr) NtWaitForKeyedEvent
-@ stdcall ZwWaitForMultipleObjects(long ptr long long ptr) NtWaitForMultipleObjects
+@ stdcall -syscall ZwWaitForKeyedEvent(long ptr long ptr) NtWaitForKeyedEvent
+@ stdcall -syscall ZwWaitForMultipleObjects(long ptr long long ptr) NtWaitForMultipleObjects
 @ stub ZwWaitForProcessMutant
-@ stdcall ZwWaitForSingleObject(long long long) NtWaitForSingleObject
+@ stdcall -syscall ZwWaitForSingleObject(long long long) NtWaitForSingleObject
 @ stub ZwWaitHighEventPair
 @ stub ZwWaitLowEventPair
-@ stdcall ZwWriteFile(long long ptr ptr ptr ptr long ptr ptr) NtWriteFile
-@ stdcall ZwWriteFileGather(long long ptr ptr ptr ptr long ptr ptr) NtWriteFileGather
+@ stdcall -syscall ZwWriteFile(long long ptr ptr ptr ptr long ptr ptr) NtWriteFile
+@ stdcall -syscall ZwWriteFileGather(long long ptr ptr ptr ptr long ptr ptr) NtWriteFileGather
 @ stub ZwWriteRequestData
-@ stdcall ZwWriteVirtualMemory(long ptr ptr long ptr) NtWriteVirtualMemory
-@ stdcall ZwYieldExecution() NtYieldExecution
+@ stdcall -syscall ZwWriteVirtualMemory(long ptr ptr long ptr) NtWriteVirtualMemory
+@ stdcall -syscall ZwYieldExecution() NtYieldExecution
 @ cdecl -private -arch=i386 _CIcos() NTDLL__CIcos
 @ cdecl -private -arch=i386 _CIlog() NTDLL__CIlog
 @ cdecl -private -arch=i386 _CIpow() NTDLL__CIpow
-- 
2.4.9

-------------- next part --------------
>From 6f085b2fbcb13a87e1078c421e4a9f6b2e6d421b Mon Sep 17 00:00:00 2001
From: Jacek Caban <jacek at codeweavers.com>
Date: Mon, 2 Nov 2015 12:58:48 +0100
Subject: [PATCH 3/3] ntdll: Call NtOpenFile via syscall wrapper in loader.
To: wine-patches <wine-patches at winehq.org>

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
---
 dlls/ntdll/loader.c     |  4 ++--
 dlls/ntdll/ntdll_misc.h | 11 +++++++++++
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index 831f049..e009f0e 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -2149,7 +2149,7 @@ static NTSTATUS find_dll_file( const WCHAR *load_path, const WCHAR *libname,
             attr.ObjectName = &nt_name;
             attr.SecurityDescriptor = NULL;
             attr.SecurityQualityOfService = NULL;
-            if (NtOpenFile( handle, GENERIC_READ, &attr, &io, FILE_SHARE_READ|FILE_SHARE_DELETE, FILE_SYNCHRONOUS_IO_NONALERT|FILE_NON_DIRECTORY_FILE )) *handle = 0;
+            if (SYSCALL(NtOpenFile)( handle, GENERIC_READ, &attr, &io, FILE_SHARE_READ|FILE_SHARE_DELETE, FILE_SYNCHRONOUS_IO_NONALERT|FILE_NON_DIRECTORY_FILE )) *handle = 0;
             goto found;
         }
 
@@ -2184,7 +2184,7 @@ static NTSTATUS find_dll_file( const WCHAR *load_path, const WCHAR *libname,
         attr.ObjectName = &nt_name;
         attr.SecurityDescriptor = NULL;
         attr.SecurityQualityOfService = NULL;
-        if (NtOpenFile( handle, GENERIC_READ, &attr, &io, FILE_SHARE_READ|FILE_SHARE_DELETE, FILE_SYNCHRONOUS_IO_NONALERT|FILE_NON_DIRECTORY_FILE )) *handle = 0;
+        if (SYSCALL(NtOpenFile)( handle, GENERIC_READ, &attr, &io, FILE_SHARE_READ|FILE_SHARE_DELETE, FILE_SYNCHRONOUS_IO_NONALERT|FILE_NON_DIRECTORY_FILE )) *handle = 0;
     }
 found:
     RtlFreeUnicodeString( &nt_name );
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h
index cbd19db..7d5331f 100644
--- a/dlls/ntdll/ntdll_misc.h
+++ b/dlls/ntdll/ntdll_misc.h
@@ -260,8 +260,19 @@ extern HANDLE keyed_event DECLSPEC_HIDDEN;
                        ".byte 0x6a," #args "\n\t" /* pushl $args */     \
                        "call " __ASM_NAME("__wine_call_from_regs") "\n\t" \
                        "ret $(4*" #args ")" ) /* fake ret to make copy protections happy */
+
+#define SYSCALL( name ) __syscall_ ## name
+#define DECLARE_SYSCALL_ENTRYPOINT( name )  extern typeof( name ) SYSCALL( name )
+
+#else
+
+#define SYSCALL( name ) name
+#define DECLARE_SYSCALL_ENTRYPOINT( name )
+
 #endif
 
+DECLARE_SYSCALL_ENTRYPOINT(NtOpenFile);
+
 #define HASH_STRING_ALGORITHM_DEFAULT  0
 #define HASH_STRING_ALGORITHM_X65599   1
 #define HASH_STRING_ALGORITHM_INVALID  0xffffffff
-- 
2.4.9



More information about the wine-devel mailing list