Module: wine Branch: master Commit: aef821ccbd9f2b7c8980c289316696eb4a3bca3c URL: https://source.winehq.org/git/wine.git/?a=commit;h=aef821ccbd9f2b7c8980c2893...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Mar 25 11:29:37 2021 +0100
ntdll: Add a helper to launch start.exe always as builtin.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/unix/env.c | 12 +++--------- dlls/ntdll/unix/loader.c | 26 ++++++++++++++++++++++++++ dlls/ntdll/unix/unix_private.h | 1 + 3 files changed, 30 insertions(+), 9 deletions(-)
diff --git a/dlls/ntdll/unix/env.c b/dlls/ntdll/unix/env.c index 07b9f0fc384..f7ba8ce8ab5 100644 --- a/dlls/ntdll/unix/env.c +++ b/dlls/ntdll/unix/env.c @@ -1880,23 +1880,17 @@ static RTL_USER_PROCESS_PARAMETERS *build_initial_params(void)
if (status) /* try launching it through start.exe */ { - static const WCHAR startW[] = {'C',':','\','w','i','n','d','o','w','s','\', - 's','y','s','t','e','m','3','2','\','s','t','a','r','t','.','e','x','e',0}; static const WCHAR slashwW[] = {'/','w',0}; static const WCHAR slashbW[] = {'/','b',0}; - const WCHAR *args[] = { startW, slashwW, slashbW }; + const WCHAR *args[] = { NULL, slashwW, slashbW };
free( image ); prepend_main_wargv( args, 3 ); - if ((status = load_main_exe( startW, NULL, curdir, &image, &module, &image_info ))) - { - MESSAGE( "wine: failed to start %s\n", debugstr_w(main_wargv[2]) ); - NtTerminateProcess( GetCurrentProcess(), status ); - } + load_start_exe( &image, &module, &image_info ); } - else main_wargv[0] = get_dos_path( image );
NtCurrentTeb()->Peb->ImageBaseAddress = module; + main_wargv[0] = get_dos_path( image ); cmdline = build_command_line( main_wargv );
TRACE( "image %s cmdline %s dir %s\n", diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c index 24cc546c300..2467b640a79 100644 --- a/dlls/ntdll/unix/loader.c +++ b/dlls/ntdll/unix/loader.c @@ -1544,6 +1544,32 @@ failed: }
+/*********************************************************************** + * load_start_exe + * + * Load start.exe as main image. + */ +NTSTATUS load_start_exe( WCHAR **image, void **module, SECTION_IMAGE_INFORMATION *image_info ) +{ + static const WCHAR startW[] = {'\','?','?','\','C',':','\','w','i','n','d','o','w','s','\', + 's','y','s','t','e','m','3','2','\','s','t','a','r','t','.','e','x','e',0}; + UNICODE_STRING nt_name; + NTSTATUS status; + SIZE_T size; + + init_unicode_string( &nt_name, startW ); + status = find_builtin_dll( &nt_name, module, &size, image_info, current_machine, FALSE ); + if (status) + { + MESSAGE( "wine: failed to load start.exe: %x\n", status ); + NtTerminateProcess( GetCurrentProcess(), status ); + } + *image = malloc( sizeof(startW) ); + memcpy( *image, startW, sizeof(startW) ); + return status; +} + + #ifdef __FreeBSD__ /* The PT_LOAD segments are sorted in increasing order, and the first * starts at the beginning of the ELF file. By parsing the file, we can diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index a486a2ff0f4..3f84fa9c065 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -145,6 +145,7 @@ extern NTSTATUS load_builtin( const pe_image_info_t *image_info, const WCHAR *fi void **addr_ptr, SIZE_T *size_ptr ) DECLSPEC_HIDDEN; extern NTSTATUS load_main_exe( const WCHAR *name, const char *unix_name, const WCHAR *curdir, WCHAR **image, void **module, SECTION_IMAGE_INFORMATION *image_info ) DECLSPEC_HIDDEN; +extern NTSTATUS load_start_exe( WCHAR **image, void **module, SECTION_IMAGE_INFORMATION *image_info ) DECLSPEC_HIDDEN; extern void start_server( BOOL debug ) DECLSPEC_HIDDEN; extern ULONG_PTR get_image_address(void) DECLSPEC_HIDDEN;