Fix bug #5453: Use GetSystemNativeInfo() function if found on the machine running...
authorsfisher <sfisher@f5534014-38df-0310-8fa8-9805f1628bb7>
Tue, 30 Nov 2010 23:42:47 +0000 (23:42 +0000)
committersfisher <sfisher@f5534014-38df-0310-8fa8-9805f1628bb7>
Tue, 30 Nov 2010 23:42:47 +0000 (23:42 +0000)
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@35084 f5534014-38df-0310-8fa8-9805f1628bb7

version_info.c

index 32f99fca4e5c27b151901e82199868dc1af3533d..fe27476b832534b38f86440e65fd47a9038f8ad1 100644 (file)
@@ -190,6 +190,8 @@ get_runtime_version_info(GString *str, void (*additional_info)(GString *))
 #if defined(_WIN32)
        OSVERSIONINFOEX info;
        SYSTEM_INFO system_info;
+       typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
+       PGNSI pGNSI;
 #elif defined(HAVE_SYS_UTSNAME_H)
        struct utsname name;
 #endif
@@ -229,7 +231,14 @@ get_runtime_version_info(GString *str, void (*additional_info)(GString *))
        }
 
        memset(&system_info, '\0', sizeof system_info);
-       GetSystemInfo(&system_info);    /* only for W2K or greater .... (which is what we support) */
+
+       /* Detect if the system we're *running on* supports the GetNativeSystemInfo() function (Windows XP/Server 2003 and higher),
+        * so we get the correct CPU architecture when running under "WOW64" x86 emulation on a 64-bit system. */
+       pGNSI = (PGNSI) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo");
+       if(NULL != pGNSI)
+               pGNSI(&system_info); /* Call GetNativeSystemInfo() if found */
+       else
+               GetSystemInfo(&system_info);    /* Fallback to GetSystemInfo() - only for W2K or greater .... (which is what we support) */
 
        switch (info.dwPlatformId) {