Alexandre Julliard : ntdll: Store main() arguments in the Unix library.
Alexandre Julliard
julliard at winehq.org
Mon May 18 15:00:13 CDT 2020
Module: wine
Branch: master
Commit: 45a63e5b3ce0e5d7fcc55ce57f315086b87f8ad7
URL: https://source.winehq.org/git/wine.git/?a=commit;h=45a63e5b3ce0e5d7fcc55ce57f315086b87f8ad7
Author: Alexandre Julliard <julliard at winehq.org>
Date: Sun May 17 11:44:16 2020 +0200
ntdll: Store main() arguments in the Unix library.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/env.c | 21 ++++++++-------------
dlls/ntdll/loader.c | 10 ++++++----
dlls/ntdll/unix/loader.c | 40 ++++++++++++++++++++++++++++++++++------
dlls/ntdll/unixlib.h | 3 ++-
4 files changed, 50 insertions(+), 24 deletions(-)
diff --git a/dlls/ntdll/env.c b/dlls/ntdll/env.c
index 3acf7f52d5..5ba3c7c7b3 100644
--- a/dlls/ntdll/env.c
+++ b/dlls/ntdll/env.c
@@ -61,13 +61,6 @@ static inline SIZE_T get_env_length( const WCHAR *env )
return end + 1 - env;
}
-#ifdef __APPLE__
-extern char **__wine_get_main_environment(void);
-#else
-extern char **__wine_main_environ;
-static char **__wine_get_main_environment(void) { return __wine_main_environ; }
-#endif
-
/***********************************************************************
* is_special_env_var
@@ -779,8 +772,6 @@ static void set_library_wargv( char **argv, const UNICODE_STRING *image )
total -= reslen;
}
wargv[argc] = NULL;
-
- __wine_main_argc = argc;
__wine_main_wargv = wargv;
}
@@ -1465,6 +1456,10 @@ void init_user_process_params( SIZE_T data_size )
startup_info_t *info = NULL;
RTL_USER_PROCESS_PARAMETERS *params = NULL;
UNICODE_STRING curdir, dllpath, imagepath, cmdline, title, desktop, shellinfo, runtime;
+ int argc;
+ char **argv, **envp;
+
+ unix_funcs->get_main_args( &argc, &argv, &envp );
if (!data_size)
{
@@ -1472,13 +1467,13 @@ void init_user_process_params( SIZE_T data_size )
WCHAR *env, curdir_buffer[MAX_PATH];
NtCurrentTeb()->Peb->ProcessParameters = &initial_params;
- initial_params.Environment = build_initial_environment( __wine_get_main_environment() );
+ initial_params.Environment = build_initial_environment( envp );
curdir.Buffer = curdir_buffer;
curdir.MaximumLength = sizeof(curdir_buffer);
get_current_directory( &curdir );
initial_params.CurrentDirectory.DosPath = curdir;
- get_image_path( __wine_main_argv[0], &initial_params.ImagePathName );
- set_library_wargv( __wine_main_argv, &initial_params.ImagePathName );
+ get_image_path( argv[0], &initial_params.ImagePathName );
+ set_library_wargv( argv, &initial_params.ImagePathName );
build_command_line( __wine_main_wargv, &cmdline );
LdrGetDllPath( initial_params.ImagePathName.Buffer, 0, &load_path, &dummy );
RtlInitUnicodeString( &dllpath, load_path );
@@ -1566,7 +1561,7 @@ void init_user_process_params( SIZE_T data_size )
else params->Environment[0] = 0;
}
- set_library_wargv( __wine_main_argv, NULL );
+ set_library_wargv( argv, NULL );
done:
RtlFreeHeap( GetProcessHeap(), 0, info );
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index 35dc7e1eaa..fa65ae1e9f 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -1324,11 +1324,12 @@ static void call_tls_callbacks( HMODULE module, UINT reason )
static void call_constructors( WINE_MODREF *wm )
{
#ifdef HAVE_DLINFO
- extern char **__wine_main_environ;
struct link_map *map;
void (*init_func)(int, char **, char **) = NULL;
void (**init_array)(int, char **, char **) = NULL;
ULONG_PTR i, init_arraysz = 0;
+ int argc;
+ char **argv, **envp;
#ifdef _WIN64
const Elf64_Dyn *dyn;
#else
@@ -1351,11 +1352,12 @@ static void call_constructors( WINE_MODREF *wm )
TRACE( "%s: got init_func %p init_array %p %lu\n", debugstr_us( &wm->ldr.BaseDllName ),
init_func, init_array, init_arraysz );
- if (init_func) init_func( __wine_main_argc, __wine_main_argv, __wine_main_environ );
+ unix_funcs->get_main_args( &argc, &argv, &envp );
+
+ if (init_func) init_func( argc, argv, envp );
if (init_array)
- for (i = 0; i < init_arraysz / sizeof(*init_array); i++)
- init_array[i]( __wine_main_argc, __wine_main_argv, __wine_main_environ );
+ for (i = 0; i < init_arraysz / sizeof(*init_array); i++) init_array[i]( argc, argv, envp );
#endif
}
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c
index 73dfb7b6c7..ebe143ca97 100644
--- a/dlls/ntdll/unix/loader.c
+++ b/dlls/ntdll/unix/loader.c
@@ -65,6 +65,14 @@ WINE_DEFAULT_DEBUG_CHANNEL(ntdll);
extern IMAGE_NT_HEADERS __wine_spec_nt_header;
extern void CDECL __wine_set_unix_funcs( int version, const struct unix_funcs *funcs );
+extern int __wine_main_argc;
+extern char **__wine_main_argv;
+extern char **__wine_main_environ;
+
+static int main_argc;
+static char **main_argv;
+static char **main_envp;
+
static inline void *get_rva( const IMAGE_NT_HEADERS *nt, ULONG_PTR addr )
{
return (BYTE *)nt + addr;
@@ -150,6 +158,19 @@ void CDECL get_host_version( const char **sysname, const char **release )
}
+/*************************************************************************
+ * get_main_args
+ *
+ * Return the initial arguments.
+ */
+static void CDECL get_main_args( int *argc, char **argv[], char **envp[] )
+{
+ *argc = main_argc;
+ *argv = main_argv;
+ *envp = main_envp;
+}
+
+
/*************************************************************************
* map_so_dll
*
@@ -428,6 +449,7 @@ static HMODULE load_ntdll(void)
*/
static struct unix_funcs unix_funcs =
{
+ get_main_args,
get_version,
get_build_id,
get_host_version,
@@ -684,9 +706,6 @@ static void check_command_line( int argc, char *argv[] )
*/
void __wine_main( int argc, char *argv[], char *envp[] )
{
- extern int __wine_main_argc;
- extern char **__wine_main_argv;
- extern char **__wine_main_environ;
HMODULE module;
wine_init_argv0_path( argv[0] );
@@ -705,9 +724,9 @@ void __wine_main( int argc, char *argv[], char *envp[] )
}
}
- __wine_main_argc = argc;
- __wine_main_argv = argv;
- __wine_main_environ = envp;
+ __wine_main_argc = main_argc = argc;
+ __wine_main_argv = main_argv = argv;
+ __wine_main_environ = main_envp = envp;
virtual_init();
module = load_ntdll();
@@ -734,6 +753,15 @@ NTSTATUS __cdecl __wine_init_unix_lib( HMODULE module, const void *ptr_in, void
{
const IMAGE_NT_HEADERS *nt = ptr_in;
+#ifdef __APPLE__
+ extern char **__wine_get_main_environment(void);
+ main_envp = __wine_get_main_environment();
+#else
+ main_envp = __wine_main_environ;
+#endif
+ main_argc = __wine_main_argc;
+ main_argv = __wine_main_argv;
+
map_so_dll( nt, module );
fixup_ntdll_imports( &__wine_spec_nt_header, module );
*(struct unix_funcs **)ptr_out = &unix_funcs;
diff --git a/dlls/ntdll/unixlib.h b/dlls/ntdll/unixlib.h
index 62ba2615ba..12e7aa0265 100644
--- a/dlls/ntdll/unixlib.h
+++ b/dlls/ntdll/unixlib.h
@@ -24,11 +24,12 @@
#include "wine/debug.h"
/* increment this when you change the function table */
-#define NTDLL_UNIXLIB_VERSION 3
+#define NTDLL_UNIXLIB_VERSION 4
struct unix_funcs
{
/* environment functions */
+ void (CDECL *get_main_args)( int *argc, char **argv[], char **envp[] );
const char * (CDECL *get_version)(void);
const char * (CDECL *get_build_id)(void);
void (CDECL *get_host_version)( const char **sysname, const char **release );
More information about the wine-cvs
mailing list