Alexandre Julliard : server: Don't change the reported machine for COM+ images.
Alexandre Julliard
julliard at winehq.org
Fri Mar 19 16:42:02 CDT 2021
Module: wine
Branch: master
Commit: cc9446f87486865f91a71d0a456711633bcb1397
URL: https://source.winehq.org/git/wine.git/?a=commit;h=cc9446f87486865f91a71d0a456711633bcb1397
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Mar 19 22:01:42 2021 +0100
server: Don't change the reported machine for COM+ images.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50826
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/unix/loader.c | 12 +++++++++---
dlls/ntdll/unix/process.c | 15 +++++++++------
server/mapping.c | 4 ----
3 files changed, 18 insertions(+), 13 deletions(-)
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c
index 87a81343737..9e43358a26d 100644
--- a/dlls/ntdll/unix/loader.c
+++ b/dlls/ntdll/unix/loader.c
@@ -452,14 +452,20 @@ static NTSTATUS loader_exec( const char *loader, char **argv, WORD machine )
*/
NTSTATUS exec_wineloader( char **argv, int socketfd, const pe_image_info_t *pe_info )
{
- int is_child_64bit = (pe_info->machine == IMAGE_FILE_MACHINE_AMD64 ||
- pe_info->machine == IMAGE_FILE_MACHINE_ARM64);
+ WORD machine = pe_info->machine;
+ int is_child_64bit = (machine == IMAGE_FILE_MACHINE_AMD64 || machine == IMAGE_FILE_MACHINE_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];
+ if (!is_child_64bit && (is_win64 || is_wow64) && (pe_info->image_flags & IMAGE_FLAGS_ComPlusNativeReady))
+ {
+ is_child_64bit = TRUE;
+ machine = IMAGE_FILE_MACHINE_AMD64;
+ }
+
if (!is_win64 ^ !is_child_64bit)
{
/* remap WINELOADER to the alternate 32/64-bit version if necessary */
@@ -495,7 +501,7 @@ NTSTATUS exec_wineloader( char **argv, int socketfd, const pe_image_info_t *pe_i
putenv( preloader_reserve );
putenv( socket_env );
- return loader_exec( loader, argv, pe_info->machine );
+ return loader_exec( loader, argv, machine );
}
diff --git a/dlls/ntdll/unix/process.c b/dlls/ntdll/unix/process.c
index d6dc893fba5..f1804009782 100644
--- a/dlls/ntdll/unix/process.c
+++ b/dlls/ntdll/unix/process.c
@@ -80,11 +80,14 @@ static const char * const cpu_names[] = { "x86", "x86_64", "PowerPC", "ARM", "AR
static UINT process_error_mode;
-static client_cpu_t get_machine_cpu( WORD machine )
+static client_cpu_t get_machine_cpu( pe_image_info_t *pe_info )
{
- switch (machine)
+ switch (pe_info->machine)
{
- case IMAGE_FILE_MACHINE_I386: return CPU_x86;
+ case IMAGE_FILE_MACHINE_I386:
+ if ((is_win64 || is_wow64) && (pe_info->image_flags & IMAGE_FLAGS_ComPlusNativeReady))
+ return CPU_x86_64;
+ return CPU_x86;
case IMAGE_FILE_MACHINE_AMD64: return CPU_x86_64;
case IMAGE_FILE_MACHINE_ARMNT: return CPU_ARM;
case IMAGE_FILE_MACHINE_ARM64: return CPU_ARM64;
@@ -679,7 +682,7 @@ void DECLSPEC_NORETURN exec_process( NTSTATUS status )
SERVER_START_REQ( exec_process )
{
req->socket_fd = socketfd[1];
- req->cpu = get_machine_cpu( pe_info.machine );
+ req->cpu = get_machine_cpu( &pe_info );
status = wine_server_call( req );
}
SERVER_END_REQ;
@@ -963,7 +966,7 @@ NTSTATUS WINAPI NtCreateUserProcess( HANDLE *process_handle_ptr, HANDLE *thread_
req->create_flags = params->DebugFlags; /* hack: creation flags stored in DebugFlags for now */
req->socket_fd = socketfd[1];
req->access = process_access;
- req->cpu = get_machine_cpu( pe_info.machine );
+ req->cpu = get_machine_cpu( &pe_info );
req->info_size = startup_info_size;
req->handles_size = handles_size;
wine_server_add_data( req, objattr, attr_len );
@@ -990,7 +993,7 @@ NTSTATUS WINAPI NtCreateUserProcess( HANDLE *process_handle_ptr, HANDLE *thread_
break;
case STATUS_INVALID_IMAGE_FORMAT:
ERR( "%s not supported on this installation (%s binary)\n",
- debugstr_us(&path), cpu_names[get_machine_cpu(pe_info.machine)] );
+ debugstr_us(&path), cpu_names[get_machine_cpu(&pe_info)] );
break;
}
goto done;
diff --git a/server/mapping.c b/server/mapping.c
index 3a162eae76b..13a0948a8ab 100644
--- a/server/mapping.c
+++ b/server/mapping.c
@@ -788,11 +788,7 @@ static unsigned int get_image_params( struct mapping *mapping, file_pos_t file_s
if (nt.opt.hdr32.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC)
{
if (!(clr.Flags & COMIMAGE_FLAGS_32BITREQUIRED))
- {
mapping->image.image_flags |= IMAGE_FLAGS_ComPlusNativeReady;
- if (cpu_mask & CPU_FLAG(CPU_x86_64)) mapping->image.machine = IMAGE_FILE_MACHINE_AMD64;
- else if (cpu_mask & CPU_FLAG(CPU_ARM64)) mapping->image.machine = IMAGE_FILE_MACHINE_ARM64;
- }
if (clr.Flags & COMIMAGE_FLAGS_32BITPREFERRED)
mapping->image.image_flags |= IMAGE_FLAGS_ComPlusPrefer32bit;
}
More information about the wine-cvs
mailing list