From: Ivan Maidanski Date: Sat, 2 Aug 2014 07:51:16 +0000 (+0400) Subject: Do not show WoW64 warning message unless CHECK_NOT_WOW64 defined (Win32) X-Git-Tag: gc7_6_0~199^2~19 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8431e390fb231a892cab8015549aac5b31896ce8;p=gc Do not show WoW64 warning message unless CHECK_NOT_WOW64 defined (Win32) * misc.c (GC_init): Do not show warning message box about WoW64 unless CHECK_NOT_WOW64 (and GC_WIN32_THREADS); use GetModuleHandle instead of GetModuleHandleA; check GetModuleHandle result; refine comment; reformat code. Conflicts: misc.c --- diff --git a/misc.c b/misc.c index 8145890f..6e56c3a2 100644 --- a/misc.c +++ b/misc.c @@ -853,31 +853,29 @@ GC_API void GC_CALL GC_init(void) initial_heap_sz = (word)MINHINCR; # endif -#ifdef GC_DEBUG -#ifndef _WIN64 +# if defined(MSWIN32) && !defined(_WIN64) && defined(GC_WIN32_THREADS) \ + && defined(CHECK_NOT_WOW64) { - // wow64: running 32-bit-gc on 64-bit-sys is broken! - // code copied from msdn docs example - typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS)(HANDLE, PBOOL); - LPFN_ISWOW64PROCESS fnIsWow64Process = 0; - fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(GetModuleHandleA("kernel32"), "IsWow64Process"); - if (NULL != fnIsWow64Process) - { - BOOL bIsWow64 = FALSE; - if (fnIsWow64Process(GetCurrentProcess(), &bIsWow64)) - { - if (bIsWow64) - MessageBoxA(NULL, - "This program uses the BDWGC garbage collector compiled for 32-bit " - "but running on a 64-bit version of Windows.\n" - "This is known to be broken due to a design flaw in Windows itself! Expect erratic behaviour...", - "32-bit program running on 64-bit system", - MB_ICONWARNING | MB_OK); - } - } + /* Windows: running 32-bit GC on 64-bit system is broken! */ + /* WoW64 bug affects SuspendThread, no workaround exists. */ + HMODULE hK32 = GetModuleHandle(TEXT("kernel32.dll")); + if (hK32) { + FARPROC pfn = GetProcAddress(hK32, "IsWow64Process"); + BOOL bIsWow64 = FALSE; + if (pfn + && (*(BOOL (WINAPI*)(HANDLE, BOOL*))pfn)(GetCurrentProcess(), + &bIsWow64) + && bIsWow64) { + MessageBoxA(NULL, "This program uses BDWGC garbage collector" + " compiled for 32-bit but running on 64-bit Windows.\n" + "This is known to be broken due to a design flaw" + " in Windows itself! Expect erratic behavior...", + "32-bit program running on 64-bit system", + MB_ICONWARNING | MB_OK); + } + } } -#endif -#endif +# endif DISABLE_CANCEL(cancel_state); /* Note that although we are nominally called with the */