[PATCH 2/2] Return the correct processor arch and type in wow64 mode

Paul Vriens Paul.Vriens.Wine at gmail.com
Wed May 12 15:58:34 CDT 2010


---
 dlls/kernel32/cpu.c           |   23 ++++++++++++++++-----
 dlls/kernel32/tests/process.c |   43 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 60 insertions(+), 6 deletions(-)

diff --git a/dlls/kernel32/cpu.c b/dlls/kernel32/cpu.c
index 5862eac..6594450 100644
--- a/dlls/kernel32/cpu.c
+++ b/dlls/kernel32/cpu.c
@@ -170,13 +170,24 @@ VOID WINAPI GetSystemInfo(
 VOID WINAPI GetNativeSystemInfo(
     LPSYSTEM_INFO si	/* [out] Destination for system information, may not be NULL */)
 {
-    static BOOL reported = FALSE;
-    if (!reported) {
-        FIXME("(%p) using GetSystemInfo()\n", si);
-        reported = TRUE;
-    } else
-        TRACE("(%p) using GetSystemInfo()\n", si);
+    BOOL is_wow64;
+
     GetSystemInfo(si); 
+
+    IsWow64Process(GetCurrentProcess(), &is_wow64);
+    if (is_wow64)
+    {
+        if (si->u.s.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
+        {
+            si->u.s.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64;
+            si->dwProcessorType = PROCESSOR_AMD_X8664;
+        }
+        else
+        {
+            FIXME("Add the proper information for %d in wow64 mode\n",
+                  si->u.s.wProcessorArchitecture);
+        }
+    }
 }
 
 /***********************************************************************
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c
index 806c468..846c338 100644
--- a/dlls/kernel32/tests/process.c
+++ b/dlls/kernel32/tests/process.c
@@ -55,6 +55,8 @@
     } while (0)
 
 static HINSTANCE hkernel32;
+static void   (WINAPI *pGetNativeSystemInfo)(LPSYSTEM_INFO);
+static BOOL   (WINAPI *pIsWow64Process)(HANDLE,PBOOL);
 static LPVOID (WINAPI *pVirtualAllocEx)(HANDLE, LPVOID, SIZE_T, DWORD, DWORD);
 static BOOL   (WINAPI *pVirtualFreeEx)(HANDLE, LPVOID, SIZE_T, DWORD);
 static BOOL   (WINAPI *pQueryFullProcessImageNameA)(HANDLE hProcess, DWORD dwFlags, LPSTR lpExeName, PDWORD lpdwSize);
@@ -194,6 +196,8 @@ static int     init(void)
     if ((p = strrchr(exename, '/')) != NULL) exename = p + 1;
 
     hkernel32 = GetModuleHandleA("kernel32");
+    pGetNativeSystemInfo = (void *) GetProcAddress(hkernel32, "GetNativeSystemInfo");
+    pIsWow64Process = (void *) GetProcAddress(hkernel32, "IsWow64Process");
     pVirtualAllocEx = (void *) GetProcAddress(hkernel32, "VirtualAllocEx");
     pVirtualFreeEx = (void *) GetProcAddress(hkernel32, "VirtualFreeEx");
     pQueryFullProcessImageNameA = (void *) GetProcAddress(hkernel32, "QueryFullProcessImageNameA");
@@ -1767,6 +1771,44 @@ static void test_Handles(void)
 #endif
 }
 
+static void test_SystemInfo(void)
+{
+    SYSTEM_INFO si, nsi;
+    BOOL is_wow64;
+
+    if (!pGetNativeSystemInfo)
+    {
+        win_skip("GetNativeSystemInfo is not available\n");
+        return;
+    }
+
+    if (!pIsWow64Process || !pIsWow64Process( GetCurrentProcess(), &is_wow64 )) is_wow64 = FALSE;
+
+    GetSystemInfo(&si);
+    pGetNativeSystemInfo(&nsi);
+    if (is_wow64)
+    {
+        if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
+        {
+            ok(nsi.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64,
+               "Expected PROCESSOR_ARCHITECTURE_AMD64, got %d\n",
+               nsi.wProcessorArchitecture);
+            ok(nsi.dwProcessorType == PROCESSOR_AMD_X8664,
+               "Expected PROCESSOR_AMD_X8664, got %d\n",
+               nsi.dwProcessorType);
+        }
+    }
+    else
+    {
+        ok(si.wProcessorArchitecture == nsi.wProcessorArchitecture,
+           "Expected no difference for wProcessorArchitecture, got %d and %d\n",
+           si.wProcessorArchitecture, nsi.wProcessorArchitecture);
+        ok(si.dwProcessorType == nsi.dwProcessorType,
+           "Expected no difference for dwProcessorType, got %d and %d\n",
+           si.dwProcessorType, nsi.dwProcessorType);
+    }
+}
+
 START_TEST(process)
 {
     int b = init();
@@ -1791,6 +1833,7 @@ START_TEST(process)
     test_ProcessNameA();
     test_ProcessName();
     test_Handles();
+    test_SystemInfo();
     /* things that can be tested:
      *  lookup:         check the way program to be executed is searched
      *  handles:        check the handle inheritance stuff (+sec options)
-- 
1.6.2.5


--------------000302030607060602040009--



More information about the wine-patches mailing list