ntdll: The loader is named wine64 only on platforms that support WoW64.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49438
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alexandre Julliard 2020-07-03 19:42:45 +02:00
parent e9951dbe37
commit b64208df0d
3 changed files with 11 additions and 16 deletions

View File

@ -426,13 +426,13 @@ static void preloader_exec( char **argv )
execv( argv[1], argv + 1 );
}
static NTSTATUS loader_exec( const char *loader, char **argv, int is_child_64bit )
static NTSTATUS loader_exec( const char *loader, char **argv, client_cpu_t cpu )
{
char *p, *path;
if (build_dir)
{
argv[1] = build_path( build_dir, is_child_64bit ? "loader/wine64" : "loader/wine" );
argv[1] = build_path( build_dir, (cpu == CPU_x86_64) ? "loader/wine64" : "loader/wine" );
preloader_exec( argv );
return STATUS_INVALID_IMAGE_FORMAT;
}
@ -465,9 +465,11 @@ static NTSTATUS loader_exec( const char *loader, char **argv, int is_child_64bit
*
* argv[0] and argv[1] must be reserved for the preloader and loader respectively.
*/
NTSTATUS exec_wineloader( char **argv, int socketfd, int is_child_64bit,
ULONGLONG res_start, ULONGLONG res_end )
NTSTATUS exec_wineloader( char **argv, int socketfd, const pe_image_info_t *pe_info )
{
int is_child_64bit = (pe_info->cpu == CPU_x86_64 || pe_info->cpu == CPU_ARM64);
ULONGLONG res_start = pe_info->base;
ULONGLONG res_end = pe_info->base + pe_info->map_size;
const char *loader = argv0;
const char *loader_env = getenv( "WINELOADER" );
char preloader_reserve[64], socket_env[64];
@ -507,7 +509,7 @@ NTSTATUS exec_wineloader( char **argv, int socketfd, int is_child_64bit,
putenv( preloader_reserve );
putenv( socket_env );
return loader_exec( loader, argv, is_child_64bit );
return loader_exec( loader, argv, pe_info->cpu );
}
@ -1805,7 +1807,7 @@ void __wine_main( int argc, char *argv[], char *envp[] )
{
char **new_argv = malloc( (argc + 2) * sizeof(*argv) );
memcpy( new_argv + 1, argv, (argc + 1) * sizeof(*argv) );
loader_exec( argv0, new_argv, is_win64 );
loader_exec( argv0, new_argv, client_cpu );
fatal_error( "could not exec the wine loader\n" );
}
}

View File

@ -523,7 +523,6 @@ static void set_stdio_fd( int stdin_fd, int stdout_fd )
static NTSTATUS spawn_process( const RTL_USER_PROCESS_PARAMETERS *params, int socketfd,
int unixdir, char *winedebug, const pe_image_info_t *pe_info )
{
const int is_child_64bit = (pe_info->cpu == CPU_x86_64 || pe_info->cpu == CPU_ARM64);
NTSTATUS status = STATUS_SUCCESS;
int stdin_fd = -1, stdout_fd = -1;
pid_t pid;
@ -556,8 +555,7 @@ static NTSTATUS spawn_process( const RTL_USER_PROCESS_PARAMETERS *params, int so
}
argv = build_argv( &params->CommandLine, 2 );
exec_wineloader( argv, socketfd, is_child_64bit,
pe_info->base, pe_info->base + pe_info->map_size );
exec_wineloader( argv, socketfd, pe_info );
_exit(1);
}
@ -586,7 +584,6 @@ static NTSTATUS spawn_process( const RTL_USER_PROCESS_PARAMETERS *params, int so
NTSTATUS CDECL exec_process( UNICODE_STRING *path, UNICODE_STRING *cmdline, NTSTATUS status )
{
pe_image_info_t pe_info;
BOOL is_child_64bit;
int unixdir, socketfd[2];
char **argv;
HANDLE handle;
@ -601,7 +598,6 @@ NTSTATUS CDECL exec_process( UNICODE_STRING *path, UNICODE_STRING *cmdline, NTST
case STATUS_INVALID_IMAGE_NOT_MZ:
if (getenv( "WINEPRELOADRESERVE" )) return status;
if ((status = get_pe_file_info( path, &handle, &pe_info ))) return status;
is_child_64bit = (pe_info.cpu == CPU_x86_64 || pe_info.cpu == CPU_ARM64);
break;
case STATUS_INVALID_IMAGE_WIN_16:
case STATUS_INVALID_IMAGE_NE_FORMAT:
@ -609,7 +605,6 @@ NTSTATUS CDECL exec_process( UNICODE_STRING *path, UNICODE_STRING *cmdline, NTST
/* we'll start winevdm */
memset( &pe_info, 0, sizeof(pe_info) );
pe_info.cpu = CPU_x86;
is_child_64bit = FALSE;
break;
default:
return status;
@ -642,8 +637,7 @@ NTSTATUS CDECL exec_process( UNICODE_STRING *path, UNICODE_STRING *cmdline, NTST
fchdir( unixdir );
do
{
status = exec_wineloader( argv, socketfd[0], is_child_64bit,
pe_info.base, pe_info.base + pe_info.map_size );
status = exec_wineloader( argv, socketfd[0], &pe_info );
}
#ifdef __APPLE__
while (errno == ENOTSUP && terminate_main_thread());

View File

@ -157,8 +157,7 @@ extern void init_environment( int argc, char *argv[], char *envp[] ) DECLSPEC_HI
extern DWORD ntdll_umbstowcs( const char *src, DWORD srclen, WCHAR *dst, DWORD dstlen ) DECLSPEC_HIDDEN;
extern int ntdll_wcstoumbs( const WCHAR *src, DWORD srclen, char *dst, DWORD dstlen, BOOL strict ) DECLSPEC_HIDDEN;
extern char **build_envp( const WCHAR *envW ) DECLSPEC_HIDDEN;
extern NTSTATUS exec_wineloader( char **argv, int socketfd, int is_child_64bit,
ULONGLONG res_start, ULONGLONG res_end ) DECLSPEC_HIDDEN;
extern NTSTATUS exec_wineloader( char **argv, int socketfd, const pe_image_info_t *pe_info ) DECLSPEC_HIDDEN;
extern void start_server( BOOL debug ) DECLSPEC_HIDDEN;
extern ULONG_PTR get_image_address(void) DECLSPEC_HIDDEN;