Alexandre Julliard : ntdll: Use the native machine id instead of hardcoded values.

Alexandre Julliard julliard at winehq.org
Mon May 3 16:37:04 CDT 2021


Module: wine
Branch: master
Commit: 8b79c8d41fe593c21a810bf635bfcb2e8e2fa65a
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=8b79c8d41fe593c21a810bf635bfcb2e8e2fa65a

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon May  3 11:02:21 2021 +0200

ntdll: Use the native machine id instead of hardcoded values.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/unix/loader.c       | 11 ++++-------
 dlls/ntdll/unix/process.c      |  4 +---
 dlls/ntdll/unix/server.c       | 12 ++++++------
 dlls/ntdll/unix/unix_private.h |  6 ++++++
 dlls/ntdll/unix/virtual.c      |  2 +-
 5 files changed, 18 insertions(+), 17 deletions(-)

diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c
index e4c062cea98..e78df4d73d2 100644
--- a/dlls/ntdll/unix/loader.c
+++ b/dlls/ntdll/unix/loader.c
@@ -439,20 +439,17 @@ 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 )
 {
     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];
+    BOOL is_child_64bit;
 
     if (pe_info->image_flags & IMAGE_FLAGS_WineFakeDll) res_start = res_end = 0;
+    if (pe_info->image_flags & IMAGE_FLAGS_ComPlusNativeReady) machine = native_machine;
 
-    if (!is_child_64bit && (is_win64 || is_wow64) && (pe_info->image_flags & IMAGE_FLAGS_ComPlusNativeReady))
-    {
-        is_child_64bit = TRUE;
-        machine = IMAGE_FILE_MACHINE_AMD64;
-    }
+    is_child_64bit = is_machine_64bit( machine );
 
     if (!is_win64 ^ !is_child_64bit)
     {
@@ -1469,7 +1466,7 @@ const WCHAR *get_machine_wow64_dir( WORD machine )
     static const WCHAR sysx8664[] = {'\\','?','?','\\','C',':','\\','w','i','n','d','o','w','s','\\','s','y','s','x','8','6','6','4','\\',0};
     static const WCHAR sysarm64[] = {'\\','?','?','\\','C',':','\\','w','i','n','d','o','w','s','\\','s','y','s','a','r','m','6','4','\\',0};
 
-    if (machine == supported_machines[0]) machine = IMAGE_FILE_MACHINE_TARGET_HOST;
+    if (machine == native_machine) machine = IMAGE_FILE_MACHINE_TARGET_HOST;
 
     switch (machine)
     {
diff --git a/dlls/ntdll/unix/process.c b/dlls/ntdll/unix/process.c
index 3f71d70e60f..ce2033bc0dc 100644
--- a/dlls/ntdll/unix/process.c
+++ b/dlls/ntdll/unix/process.c
@@ -1240,9 +1240,7 @@ NTSTATUS WINAPI NtQueryInformationProcess( HANDLE handle, PROCESSINFOCLASS class
                 SERVER_START_REQ( get_process_info )
                 {
                     req->handle = wine_server_obj_handle( handle );
-                    if (!(ret = wine_server_call( req )))
-                        val = (reply->machine != IMAGE_FILE_MACHINE_AMD64 &&
-                               reply->machine != IMAGE_FILE_MACHINE_ARM64);
+                    if (!(ret = wine_server_call( req ))) val = (reply->machine != native_machine);
                 }
                 SERVER_END_REQ;
             }
diff --git a/dlls/ntdll/unix/server.c b/dlls/ntdll/unix/server.c
index b13e2997962..ff632b7c6c0 100644
--- a/dlls/ntdll/unix/server.c
+++ b/dlls/ntdll/unix/server.c
@@ -103,6 +103,7 @@ static const char *server_dir;
 
 unsigned int supported_machines_count = 0;
 USHORT supported_machines[8] = { 0 };
+USHORT native_machine = 0;
 BOOL is_wow64 = FALSE;
 BOOL process_exiting = FALSE;
 
@@ -1579,10 +1580,9 @@ size_t server_init_process(void)
         fatal_error( "'%s' is a 64-bit installation, it cannot be used with a 32-bit wineserver.\n",
                      config_dir );
 
-    switch (supported_machines[0])
+    native_machine = supported_machines[0];
+    if (is_machine_64bit( native_machine ))
     {
-    case IMAGE_FILE_MACHINE_AMD64:
-    case IMAGE_FILE_MACHINE_ARM64:
         if (arch && !strcmp( arch, "win32" ))
             fatal_error( "WINEARCH set to win32 but '%s' is a 64-bit installation.\n", config_dir );
         if (!is_win64)
@@ -1590,13 +1590,13 @@ size_t server_init_process(void)
             is_wow64 = TRUE;
             init_teb64( NtCurrentTeb() );
         }
-        break;
-    default:
+    }
+    else
+    {
         if (is_win64)
             fatal_error( "'%s' is a 32-bit installation, it cannot support 64-bit applications.\n", config_dir );
         if (arch && !strcmp( arch, "win64" ))
             fatal_error( "WINEARCH set to win64 but '%s' is a 32-bit installation.\n", config_dir );
-        break;
     }
 
     for (i = 0; i < supported_machines_count; i++)
diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h
index a5bade02b8a..c47695c408c 100644
--- a/dlls/ntdll/unix/unix_private.h
+++ b/dlls/ntdll/unix/unix_private.h
@@ -36,9 +36,15 @@ static const WORD current_machine = IMAGE_FILE_MACHINE_ARMNT;
 #elif defined(__aarch64__)
 static const WORD current_machine = IMAGE_FILE_MACHINE_ARM64;
 #endif
+extern WORD native_machine DECLSPEC_HIDDEN;
 
 static const BOOL is_win64 = (sizeof(void *) > sizeof(int));
 
+static inline BOOL is_machine_64bit( WORD machine )
+{
+    return (machine == IMAGE_FILE_MACHINE_AMD64 || machine == IMAGE_FILE_MACHINE_ARM64);
+}
+
 struct debug_info
 {
     unsigned int str_pos;       /* current position in strings buffer */
diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c
index f3e6b612b93..c3baa5f09c7 100644
--- a/dlls/ntdll/unix/virtual.c
+++ b/dlls/ntdll/unix/virtual.c
@@ -4469,7 +4469,7 @@ void virtual_fill_image_information( const pe_image_info_t *pe_info, SECTION_IMA
     info->ImageFileSize               = pe_info->file_size;
     info->CheckSum                    = pe_info->checksum;
 #ifndef _WIN64 /* don't return 64-bit values to 32-bit processes */
-    if (pe_info->machine == IMAGE_FILE_MACHINE_AMD64 || pe_info->machine == IMAGE_FILE_MACHINE_ARM64)
+    if (is_machine_64bit( pe_info->machine ))
     {
         info->TransferAddress = (void *)0x81231234;  /* sic */
         info->MaximumStackSize = 0x100000;




More information about the wine-cvs mailing list