kernel32: Move Unicode argv initialization to ntdll.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
075741b681
commit
ee56be3fcd
|
@ -835,45 +835,28 @@ static void set_wow64_environment(void)
|
|||
}
|
||||
|
||||
/***********************************************************************
|
||||
* set_library_wargv
|
||||
* set_library_argv
|
||||
*
|
||||
* Set the Wine library Unicode argv global variables.
|
||||
* Set the Wine library argv global variables.
|
||||
*/
|
||||
static void set_library_wargv( char **argv )
|
||||
static void set_library_argv( WCHAR **wargv )
|
||||
{
|
||||
int argc;
|
||||
char *q;
|
||||
WCHAR *p;
|
||||
WCHAR **wargv;
|
||||
char *p, **argv;
|
||||
DWORD total = 0;
|
||||
|
||||
for (argc = 0; argv[argc]; argc++)
|
||||
total += MultiByteToWideChar( CP_UNIXCP, 0, argv[argc], -1, NULL, 0 );
|
||||
|
||||
wargv = RtlAllocateHeap( GetProcessHeap(), 0,
|
||||
total * sizeof(WCHAR) + (argc + 1) * sizeof(*wargv) );
|
||||
p = (WCHAR *)(wargv + argc + 1);
|
||||
for (argc = 0; argv[argc]; argc++)
|
||||
{
|
||||
DWORD reslen = MultiByteToWideChar( CP_UNIXCP, 0, argv[argc], -1, p, total );
|
||||
wargv[argc] = p;
|
||||
p += reslen;
|
||||
total -= reslen;
|
||||
}
|
||||
wargv[argc] = NULL;
|
||||
|
||||
/* convert argv back from Unicode since it has to be in the Ansi codepage not the Unix one */
|
||||
|
||||
for (argc = 0; wargv[argc]; argc++)
|
||||
total += WideCharToMultiByte( CP_ACP, 0, wargv[argc], -1, NULL, 0, NULL, NULL );
|
||||
|
||||
argv = RtlAllocateHeap( GetProcessHeap(), 0, total + (argc + 1) * sizeof(*argv) );
|
||||
q = (char *)(argv + argc + 1);
|
||||
p = (char *)(argv + argc + 1);
|
||||
for (argc = 0; wargv[argc]; argc++)
|
||||
{
|
||||
DWORD reslen = WideCharToMultiByte( CP_ACP, 0, wargv[argc], -1, q, total, NULL, NULL );
|
||||
argv[argc] = q;
|
||||
q += reslen;
|
||||
DWORD reslen = WideCharToMultiByte( CP_ACP, 0, wargv[argc], -1, p, total, NULL, NULL );
|
||||
argv[argc] = p;
|
||||
p += reslen;
|
||||
total -= reslen;
|
||||
}
|
||||
argv[argc] = NULL;
|
||||
|
@ -884,30 +867,6 @@ static void set_library_wargv( char **argv )
|
|||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* update_library_argv0
|
||||
*
|
||||
* Update the argv[0] global variable with the binary we have found.
|
||||
*/
|
||||
static void update_library_argv0( const WCHAR *argv0 )
|
||||
{
|
||||
DWORD len = strlenW( argv0 );
|
||||
|
||||
if (len > strlenW( __wine_main_wargv[0] ))
|
||||
{
|
||||
__wine_main_wargv[0] = RtlAllocateHeap( GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR) );
|
||||
}
|
||||
strcpyW( __wine_main_wargv[0], argv0 );
|
||||
|
||||
len = WideCharToMultiByte( CP_ACP, 0, argv0, -1, NULL, 0, NULL, NULL );
|
||||
if (len > strlen( __wine_main_argv[0] ) + 1)
|
||||
{
|
||||
__wine_main_argv[0] = RtlAllocateHeap( GetProcessHeap(), 0, len );
|
||||
}
|
||||
WideCharToMultiByte( CP_ACP, 0, argv0, -1, __wine_main_argv[0], len, NULL, NULL );
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* build_command_line
|
||||
*
|
||||
|
@ -1232,13 +1191,10 @@ void * CDECL __wine_kernel_init(void)
|
|||
}
|
||||
|
||||
init_windows_dirs();
|
||||
|
||||
set_library_wargv( __wine_main_argv );
|
||||
boot_events[0] = boot_events[1] = 0;
|
||||
|
||||
if (!peb->ProcessParameters->WindowTitle.Buffer)
|
||||
{
|
||||
update_library_argv0( main_exe_name );
|
||||
if (!build_command_line( __wine_main_wargv )) goto error;
|
||||
start_wineboot( boot_events );
|
||||
}
|
||||
|
@ -1269,6 +1225,7 @@ void * CDECL __wine_kernel_init(void)
|
|||
set_additional_environment();
|
||||
}
|
||||
set_wow64_environment();
|
||||
set_library_argv( __wine_main_wargv );
|
||||
|
||||
if (!(peb->ImageBaseAddress = LoadLibraryExW( main_exe_name, 0, DONT_RESOLVE_DLL_REFERENCES )))
|
||||
{
|
||||
|
|
|
@ -513,6 +513,45 @@ failed:
|
|||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* set_library_wargv
|
||||
*
|
||||
* Set the Wine library Unicode argv global variables.
|
||||
*/
|
||||
static void set_library_wargv( char **argv, const UNICODE_STRING *image )
|
||||
{
|
||||
int argc;
|
||||
WCHAR *p, **wargv;
|
||||
DWORD total = 0;
|
||||
|
||||
if (image) total += 1 + image->Length / sizeof(WCHAR);
|
||||
for (argc = (image != NULL); argv[argc]; argc++)
|
||||
total += ntdll_umbstowcs( 0, argv[argc], strlen(argv[argc]) + 1, NULL, 0 );
|
||||
|
||||
wargv = RtlAllocateHeap( GetProcessHeap(), 0,
|
||||
total * sizeof(WCHAR) + (argc + 1) * sizeof(*wargv) );
|
||||
p = (WCHAR *)(wargv + argc + 1);
|
||||
if (image)
|
||||
{
|
||||
strcpyW( p, image->Buffer );
|
||||
wargv[0] = p;
|
||||
p += 1 + image->Length / sizeof(WCHAR);
|
||||
total -= 1 + image->Length / sizeof(WCHAR);
|
||||
}
|
||||
for (argc = (image != NULL); argv[argc]; argc++)
|
||||
{
|
||||
DWORD reslen = ntdll_umbstowcs( 0, argv[argc], strlen(argv[argc]) + 1, p, total );
|
||||
wargv[argc] = p;
|
||||
p += reslen;
|
||||
total -= reslen;
|
||||
}
|
||||
wargv[argc] = NULL;
|
||||
|
||||
__wine_main_argc = argc;
|
||||
__wine_main_wargv = wargv;
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* NtQuerySystemEnvironmentValue [NTDLL.@]
|
||||
*/
|
||||
|
@ -1034,6 +1073,7 @@ void init_user_process_params( SIZE_T data_size )
|
|||
params->Environment = build_initial_environment( __wine_get_main_environment() );
|
||||
get_current_directory( ¶ms->CurrentDirectory.DosPath );
|
||||
get_image_path( __wine_main_argv[0], ¶ms->ImagePathName );
|
||||
set_library_wargv( __wine_main_argv, ¶ms->ImagePathName );
|
||||
|
||||
if (isatty(0) || isatty(1) || isatty(2))
|
||||
params->ConsoleHandle = (HANDLE)2; /* see kernel32/kernel_private.h */
|
||||
|
@ -1103,6 +1143,8 @@ void init_user_process_params( SIZE_T data_size )
|
|||
else params->Environment[0] = 0;
|
||||
}
|
||||
|
||||
set_library_wargv( __wine_main_argv, NULL );
|
||||
|
||||
done:
|
||||
RtlFreeHeap( GetProcessHeap(), 0, info );
|
||||
if (RtlSetCurrentDirectory_U( ¶ms->CurrentDirectory.DosPath ))
|
||||
|
|
Loading…
Reference in New Issue