Module: wine Branch: master Commit: a14b4c7d0dbb9a200239070253d6590850654544 URL: https://gitlab.winehq.org/wine/wine/-/commit/a14b4c7d0dbb9a200239070253d6590...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Feb 14 13:48:43 2023 +0100
ntdll: Replace the __wine_unix_spawnvp() syscall by a Unix call.
---
dlls/ntdll/loader.c | 11 +++++++++++ dlls/ntdll/ntdll.spec | 2 +- dlls/ntdll/unix/loader.c | 3 ++- dlls/ntdll/unix/process.c | 38 ++++++++++++++++++++++++++++++++++++++ dlls/ntdll/unix/unix_private.h | 2 ++ dlls/ntdll/unixlib.h | 7 +++++++ dlls/wow64/syscall.c | 19 ------------------- dlls/wow64/syscall.h | 1 - 8 files changed, 61 insertions(+), 22 deletions(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index e47beb461f9..b483d75ec45 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -3199,6 +3199,17 @@ NTSTATUS WINAPI __wine_unix_call( unixlib_handle_t handle, unsigned int code, vo }
+/*********************************************************************** + * __wine_unix_spawnvp + */ +NTSTATUS WINAPI __wine_unix_spawnvp( char * const argv[], int wait ) +{ + struct wine_spawnvp_params params = { (char **)argv, wait }; + + return WINE_UNIX_CALL( unix_wine_spawnvp, ¶ms ); +} + + /****************************************************************** * LdrLoadDll (NTDLL.@) */ diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index c294a605f1e..a138c4c0299 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -1694,7 +1694,7 @@
# Unix interface @ stdcall __wine_unix_call(int64 long ptr) -@ stdcall -syscall __wine_unix_spawnvp(long ptr) +@ stdcall __wine_unix_spawnvp(long ptr) @ stdcall __wine_ctrl_routine(ptr) @ extern -private __wine_syscall_dispatcher @ extern -private __wine_unix_call_dispatcher diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c index b0834c97795..d040a90dab3 100644 --- a/dlls/ntdll/unix/loader.c +++ b/dlls/ntdll/unix/loader.c @@ -357,7 +357,6 @@ static void * const syscalls[] = NtWriteFileGather, NtWriteVirtualMemory, NtYieldExecution, - __wine_unix_spawnvp, wine_nt_to_unix_file_name, wine_server_call, wine_server_fd_to_handle, @@ -2061,6 +2060,7 @@ const unixlib_entry_t __wine_unix_call_funcs[] = load_so_dll, unwind_builtin_dll, unixcall_wine_dbg_write, + 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_spawnvp, system_time_precise, };
diff --git a/dlls/ntdll/unix/process.c b/dlls/ntdll/unix/process.c index 9f2c5ffb29c..79e5d4bab87 100644 --- a/dlls/ntdll/unix/process.c +++ b/dlls/ntdll/unix/process.c @@ -538,6 +538,44 @@ NTSTATUS WINAPI __wine_unix_spawnvp( char * const argv[], int wait ) }
+/*********************************************************************** + * unixcall_wine_spawnvp + */ +NTSTATUS unixcall_wine_spawnvp( void *args ) +{ + struct wine_spawnvp_params *params = args; + + return __wine_unix_spawnvp( params->argv, params->wait ); +} + + +#ifdef _WIN64 +/*********************************************************************** + * wow64_wine_spawnvp + */ +NTSTATUS wow64_wine_spawnvp( void *args ) +{ + struct + { + ULONG argv; + int wait; + } const *params32 = args; + + ULONG *argv32 = ULongToPtr( params32->argv ); + unsigned int i, count = 0; + char **argv; + NTSTATUS ret; + + while (argv32[count]) count++; + argv = malloc( (count + 1) * sizeof(*argv) ); + for (i = 0; i < count; i++) argv[i] = ULongToPtr( argv32[i] ); + argv[count] = NULL; + ret = __wine_unix_spawnvp( argv, params32->wait ); + free( argv ); + return ret; +} +#endif + /*********************************************************************** * fork_and_exec * diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index fcaf51d9652..849dc1d28e9 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -284,8 +284,10 @@ 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_spawnvp( void *args ) DECLSPEC_HIDDEN; #ifdef _WIN64 extern NTSTATUS wow64_wine_dbg_write( void *args ) DECLSPEC_HIDDEN; +extern NTSTATUS wow64_wine_spawnvp( void *args ) DECLSPEC_HIDDEN; #endif
extern void dbg_init(void) DECLSPEC_HIDDEN; diff --git a/dlls/ntdll/unixlib.h b/dlls/ntdll/unixlib.h index 9fd23627ee9..3266a71c55e 100644 --- a/dlls/ntdll/unixlib.h +++ b/dlls/ntdll/unixlib.h @@ -31,6 +31,12 @@ struct wine_dbg_write_params unsigned int len; };
+struct wine_spawnvp_params +{ + char **argv; + int wait; +}; + struct load_so_dll_params { UNICODE_STRING nt_name; @@ -49,6 +55,7 @@ enum ntdll_unix_funcs unix_load_so_dll, unix_unwind_builtin_dll, unix_wine_dbg_write, + unix_wine_spawnvp, unix_system_time_precise, };
diff --git a/dlls/wow64/syscall.c b/dlls/wow64/syscall.c index 41215e58bb0..8e923d83844 100644 --- a/dlls/wow64/syscall.c +++ b/dlls/wow64/syscall.c @@ -541,25 +541,6 @@ NTSTATUS WINAPI wow64_NtSetDefaultUILanguage( UINT *args ) }
-/********************************************************************** - * wow64___wine_unix_spawnvp - */ -NTSTATUS WINAPI wow64___wine_unix_spawnvp( UINT *args ) -{ - ULONG *argv32 = get_ptr( &args ); - int wait = get_ulong( &args ); - - unsigned int i, count = 0; - char **argv; - - while (argv32[count]) count++; - argv = Wow64AllocateTemp( (count + 1) * sizeof(*argv) ); - for (i = 0; i < count; i++) argv[i] = ULongToPtr( argv32[i] ); - argv[count] = NULL; - return __wine_unix_spawnvp( argv, wait ); -} - - /********************************************************************** * wow64_wine_server_call */ diff --git a/dlls/wow64/syscall.h b/dlls/wow64/syscall.h index 801bc6054da..8fbdc3909ef 100644 --- a/dlls/wow64/syscall.h +++ b/dlls/wow64/syscall.h @@ -257,7 +257,6 @@ SYSCALL_ENTRY( NtWriteFileGather ) \ SYSCALL_ENTRY( NtWriteVirtualMemory ) \ SYSCALL_ENTRY( NtYieldExecution ) \ - SYSCALL_ENTRY( __wine_unix_spawnvp ) \ SYSCALL_ENTRY( wine_nt_to_unix_file_name ) \ SYSCALL_ENTRY( wine_server_call ) \ SYSCALL_ENTRY( wine_server_fd_to_handle ) \