Alexandre Julliard : ntdll: Add a helper function to set a syscall table.

Alexandre Julliard julliard at winehq.org
Mon Aug 30 15:53:52 CDT 2021


Module: wine
Branch: master
Commit: d017c704f0131110f96b65e0edac0adf62be1d55
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=d017c704f0131110f96b65e0edac0adf62be1d55

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Aug 30 12:20:03 2021 +0200

ntdll: Add a helper function to set a syscall table.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/unix/loader.c       | 32 +++++++++++++++++++++-----------
 dlls/ntdll/unix/unix_private.h |  1 +
 include/wine/unixlib.h         |  3 +--
 3 files changed, 23 insertions(+), 13 deletions(-)

diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c
index bdd54314540..53df7c87878 100644
--- a/dlls/ntdll/unix/loader.c
+++ b/dlls/ntdll/unix/loader.c
@@ -114,6 +114,7 @@ void     (WINAPI *p__wine_ctrl_routine)(void*);
 SYSTEM_DLL_INIT_BLOCK *pLdrSystemDllInitBlock = NULL;
 
 static NTSTATUS (CDECL *p__wine_set_unix_funcs)( int version, const struct unix_funcs *funcs );
+static void *p__wine_syscall_dispatcher;
 
 extern SYSTEM_SERVICE_TABLE __wine_syscall_table DECLSPEC_HIDDEN;
 
@@ -825,8 +826,6 @@ static NTSTATUS fixup_ntdll_imports( const char *name, HMODULE module )
 
 static void load_ntdll_functions( HMODULE module )
 {
-    void **ptr;
-
     ntdll_exports = get_module_data_dir( module, IMAGE_FILE_EXPORT_DIRECTORY, NULL );
     assert( ntdll_exports );
 
@@ -844,16 +843,15 @@ static void load_ntdll_functions( HMODULE module )
     GET_FUNC( RtlUserThreadStart );
     GET_FUNC( __wine_ctrl_routine );
     GET_FUNC( __wine_set_unix_funcs );
-#undef GET_FUNC
-#define SET_PTR(name,val) \
-    if ((ptr = (void *)find_named_export( module, ntdll_exports, #name ))) *ptr = val; \
-    else ERR( "%s not found\n", #name )
-
-    SET_PTR( __wine_syscall_dispatcher, __wine_syscall_dispatcher );
+    GET_FUNC( __wine_syscall_dispatcher );
 #ifdef __i386__
-    SET_PTR( __wine_ldt_copy, &__wine_ldt_copy );
+    {
+        void **p__wine_ldt_copy;
+        GET_FUNC( __wine_ldt_copy );
+        *p__wine_ldt_copy = &__wine_ldt_copy;
+    }
 #endif
-#undef SET_PTR
+#undef GET_FUNC
 }
 
 static void load_ntdll_wow64_functions( HMODULE module )
@@ -1145,6 +1143,18 @@ static NTSTATUS CDECL init_unix_lib( void *module, DWORD reason, const void *ptr
 }
 
 
+/***********************************************************************
+ *           ntdll_init_syscalls
+ */
+NTSTATUS ntdll_init_syscalls( ULONG id, SYSTEM_SERVICE_TABLE *table, void **dispatcher )
+{
+    if (id > 3) return STATUS_INVALID_PARAMETER;
+    *dispatcher = __wine_syscall_dispatcher;
+    KeServiceDescriptorTable[id] = *table;
+    return STATUS_SUCCESS;
+}
+
+
 /***********************************************************************
  *           __wine_unix_call
  */
@@ -1944,7 +1954,7 @@ static void start_main_thread(void)
     NtCreateKeyedEvent( &keyed_event, GENERIC_READ | GENERIC_WRITE, NULL, 0 );
     load_ntdll();
     if (main_image_info.Machine != current_machine) load_wow64_ntdll( main_image_info.Machine );
-    KeServiceDescriptorTable[0] = __wine_syscall_table;
+    ntdll_init_syscalls( 0, &__wine_syscall_table, p__wine_syscall_dispatcher );
     status = p__wine_set_unix_funcs( NTDLL_UNIXLIB_VERSION, &unix_funcs );
     if (status == STATUS_REVISION_MISMATCH)
     {
diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h
index 731b12d332c..b2bcd423d4b 100644
--- a/dlls/ntdll/unix/unix_private.h
+++ b/dlls/ntdll/unix/unix_private.h
@@ -250,6 +250,7 @@ extern void signal_init_process(void) DECLSPEC_HIDDEN;
 extern void DECLSPEC_NORETURN signal_start_thread( PRTL_THREAD_START_ROUTINE entry, void *arg,
                                                    BOOL suspend, TEB *teb ) DECLSPEC_HIDDEN;
 extern void DECLSPEC_NORETURN signal_exit_thread( int status, void (*func)(int), TEB *teb ) DECLSPEC_HIDDEN;
+extern SYSTEM_SERVICE_TABLE KeServiceDescriptorTable[4] DECLSPEC_HIDDEN;
 extern void __wine_syscall_dispatcher(void) DECLSPEC_HIDDEN;
 extern void WINAPI DECLSPEC_NORETURN __wine_syscall_dispatcher_return( void *frame, ULONG_PTR retval ) DECLSPEC_HIDDEN;
 extern NTSTATUS signal_set_full_context( CONTEXT *context ) DECLSPEC_HIDDEN;
diff --git a/include/wine/unixlib.h b/include/wine/unixlib.h
index 1f5308cb434..072401a0714 100644
--- a/include/wine/unixlib.h
+++ b/include/wine/unixlib.h
@@ -26,10 +26,9 @@ typedef UINT64 unixlib_handle_t;
 
 extern NTSTATUS WINAPI __wine_unix_call( unixlib_handle_t handle, unsigned int code, void *args );
 
-extern SYSTEM_SERVICE_TABLE KeServiceDescriptorTable[4];
-
 /* some useful helpers from ntdll */
 extern DWORD ntdll_umbstowcs( const char *src, DWORD srclen, WCHAR *dst, DWORD dstlen );
 extern int ntdll_wcstoumbs( const WCHAR *src, DWORD srclen, char *dst, DWORD dstlen, BOOL strict );
+extern NTSTATUS ntdll_init_syscalls( ULONG id, SYSTEM_SERVICE_TABLE *table, void **dispatcher );
 
 #endif  /* __WINE_WINE_UNIXLIB_H */




More information about the wine-cvs mailing list