Module: wine Branch: master Commit: 8a3ba513ff860d5197c445df6707aef0620f837a URL: https://gitlab.winehq.org/wine/wine/-/commit/8a3ba513ff860d5197c445df6707aef...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Feb 14 13:50:52 2023 +0100
ntdll: Replace the wine_server_call() syscall by a Unix call.
---
dlls/ntdll/loader.c | 9 ++++++++ dlls/ntdll/ntdll.spec | 2 +- dlls/ntdll/unix/loader.c | 3 ++- dlls/ntdll/unix/server.c | 50 ++++++++++++++++++++++++++++++++++++++++++ dlls/ntdll/unix/unix_private.h | 2 ++ dlls/ntdll/unixlib.h | 1 + dlls/wow64/struct32.h | 18 --------------- dlls/wow64/syscall.c | 25 --------------------- dlls/wow64/syscall.h | 1 - 9 files changed, 65 insertions(+), 46 deletions(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index b483d75ec45..0a22ec9a36b 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -3210,6 +3210,15 @@ NTSTATUS WINAPI __wine_unix_spawnvp( char * const argv[], int wait ) }
+/*********************************************************************** + * wine_server_call + */ +unsigned int CDECL wine_server_call( void *req_ptr ) +{ + return WINE_UNIX_CALL( unix_wine_server_call, req_ptr ); +} + + /****************************************************************** * LdrLoadDll (NTDLL.@) */ diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index a138c4c0299..8fa8d01c7dd 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -1688,7 +1688,7 @@ # or 'wine_' (for user-visible functions) to avoid namespace conflicts.
# Server interface -@ cdecl -syscall -norelay wine_server_call(ptr) +@ cdecl -norelay wine_server_call(ptr) @ cdecl -syscall wine_server_fd_to_handle(long long long ptr) @ cdecl -syscall wine_server_handle_to_fd(long long ptr ptr)
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c index d040a90dab3..9ff1e5c52cd 100644 --- a/dlls/ntdll/unix/loader.c +++ b/dlls/ntdll/unix/loader.c @@ -358,7 +358,6 @@ static void * const syscalls[] = NtWriteVirtualMemory, NtYieldExecution, wine_nt_to_unix_file_name, - wine_server_call, wine_server_fd_to_handle, wine_server_handle_to_fd, wine_unix_to_nt_file_name, @@ -2060,6 +2059,7 @@ const unixlib_entry_t __wine_unix_call_funcs[] = load_so_dll, unwind_builtin_dll, unixcall_wine_dbg_write, + unixcall_wine_server_call, unixcall_wine_spawnvp, system_time_precise, }; @@ -2078,6 +2078,7 @@ const unixlib_entry_t __wine_unix_call_wow64_funcs[] = wow64_load_so_dll, wow64_unwind_builtin_dll, wow64_wine_dbg_write, + wow64_wine_server_call, wow64_wine_spawnvp, system_time_precise, }; diff --git a/dlls/ntdll/unix/server.c b/dlls/ntdll/unix/server.c index 75a766078cd..f9b403723fa 100644 --- a/dlls/ntdll/unix/server.c +++ b/dlls/ntdll/unix/server.c @@ -286,6 +286,17 @@ unsigned int CDECL wine_server_call( void *req_ptr ) }
+/*********************************************************************** + * unixcall_wine_server_call + * + * Perform a server call. + */ +NTSTATUS unixcall_wine_server_call( void *args ) +{ + return wine_server_call( args ); +} + + /*********************************************************************** * server_enter_uninterrupted_section */ @@ -1764,3 +1775,42 @@ NTSTATUS WINAPI NtClose( HANDLE handle ) } return ret; } + +#ifdef _WIN64 + +struct __server_request_info32 +{ + union + { + union generic_request req; + union generic_reply reply; + } u; + unsigned int data_count; + ULONG reply_data; + struct { ULONG ptr; data_size_t size; } data[__SERVER_MAX_DATA]; +}; + +/********************************************************************** + * wow64_wine_server_call + */ +NTSTATUS wow64_wine_server_call( void *args ) +{ + struct __server_request_info32 *req32 = args; + unsigned int i; + NTSTATUS status; + struct __server_request_info req; + + req.u.req = req32->u.req; + req.data_count = req32->data_count; + for (i = 0; i < req.data_count; i++) + { + req.data[i].ptr = ULongToPtr( req32->data[i].ptr ); + req.data[i].size = req32->data[i].size; + } + req.reply_data = ULongToPtr( req32->reply_data ); + status = wine_server_call( &req ); + req32->u.reply = req.u.reply; + return status; +} + +#endif /* _WIN64 */ diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index 849dc1d28e9..e581cde0486 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -284,9 +284,11 @@ extern void add_completion( HANDLE handle, ULONG_PTR value, NTSTATUS status, ULO extern void set_async_direct_result( HANDLE *async_handle, NTSTATUS status, ULONG_PTR information, BOOL mark_pending ) DECLSPEC_HIDDEN;
extern NTSTATUS unixcall_wine_dbg_write( void *args ) DECLSPEC_HIDDEN; +extern NTSTATUS unixcall_wine_server_call( void *args ) DECLSPEC_HIDDEN; extern NTSTATUS unixcall_wine_spawnvp( void *args ) DECLSPEC_HIDDEN; #ifdef _WIN64 extern NTSTATUS wow64_wine_dbg_write( void *args ) DECLSPEC_HIDDEN; +extern NTSTATUS wow64_wine_server_call( void *args ) DECLSPEC_HIDDEN; extern NTSTATUS wow64_wine_spawnvp( void *args ) DECLSPEC_HIDDEN; #endif
diff --git a/dlls/ntdll/unixlib.h b/dlls/ntdll/unixlib.h index 3266a71c55e..a205c86ac99 100644 --- a/dlls/ntdll/unixlib.h +++ b/dlls/ntdll/unixlib.h @@ -55,6 +55,7 @@ enum ntdll_unix_funcs unix_load_so_dll, unix_unwind_builtin_dll, unix_wine_dbg_write, + unix_wine_server_call, unix_wine_spawnvp, unix_system_time_precise, }; diff --git a/dlls/wow64/struct32.h b/dlls/wow64/struct32.h index 9511f80523f..5780fb574a6 100644 --- a/dlls/wow64/struct32.h +++ b/dlls/wow64/struct32.h @@ -667,24 +667,6 @@ typedef struct ULONG NumberOfBytes; } MEMORY_RANGE_ENTRY32;
-struct __server_iovec32 -{ - ULONG ptr; - data_size_t size; -}; - -struct __server_request_info32 -{ - union - { - union generic_request req; - union generic_reply reply; - } u; - unsigned int data_count; - ULONG reply_data; - struct __server_iovec32 data[__SERVER_MAX_DATA]; -}; - typedef struct { ULONG LowestStartingAddress; diff --git a/dlls/wow64/syscall.c b/dlls/wow64/syscall.c index 8e923d83844..9323bae296e 100644 --- a/dlls/wow64/syscall.c +++ b/dlls/wow64/syscall.c @@ -541,31 +541,6 @@ NTSTATUS WINAPI wow64_NtSetDefaultUILanguage( UINT *args ) }
-/********************************************************************** - * wow64_wine_server_call - */ -NTSTATUS WINAPI wow64_wine_server_call( UINT *args ) -{ - struct __server_request_info32 *req32 = get_ptr( &args ); - - unsigned int i; - NTSTATUS status; - struct __server_request_info req; - - req.u.req = req32->u.req; - req.data_count = req32->data_count; - for (i = 0; i < req.data_count; i++) - { - req.data[i].ptr = ULongToPtr( req32->data[i].ptr ); - req.data[i].size = req32->data[i].size; - } - req.reply_data = ULongToPtr( req32->reply_data ); - status = wine_server_call( &req ); - req32->u.reply = req.u.reply; - return status; -} - - /********************************************************************** * get_syscall_num */ diff --git a/dlls/wow64/syscall.h b/dlls/wow64/syscall.h index 8fbdc3909ef..8b0416d22c2 100644 --- a/dlls/wow64/syscall.h +++ b/dlls/wow64/syscall.h @@ -258,7 +258,6 @@ SYSCALL_ENTRY( NtWriteVirtualMemory ) \ SYSCALL_ENTRY( NtYieldExecution ) \ SYSCALL_ENTRY( wine_nt_to_unix_file_name ) \ - SYSCALL_ENTRY( wine_server_call ) \ SYSCALL_ENTRY( wine_server_fd_to_handle ) \ SYSCALL_ENTRY( wine_server_handle_to_fd ) \ SYSCALL_ENTRY( wine_unix_to_nt_file_name )