X-Git-Url: http://git.osdn.net/view?p=mutilities%2FMUtilities.git;a=blobdiff_plain;f=src%2FOSSupport_Win32.cpp;h=a71bcd5a20123b0fb29c0bc6b7dcb0149aff659e;hp=1c506ae58014867e98a3a786a51967bf7c541ef5;hb=9c3ab391729c232788cafbaef1878c69e77b4f80;hpb=e4f1b06a6a818f96a893ea256e4b5aeec182b8f6 diff --git a/src/OSSupport_Win32.cpp b/src/OSSupport_Win32.cpp index 1c506ae..a71bcd5 100644 --- a/src/OSSupport_Win32.cpp +++ b/src/OSSupport_Win32.cpp @@ -328,7 +328,6 @@ static inline DWORD SAFE_ADD(const DWORD &a, const DWORD &b, const DWORD &limit return ((a >= limit) || (b >= limit) || ((limit - a) <= b)) ? limit : (a + b); } - static void initialize_os_version(OSVERSIONINFOEXW *const osInfo) { memset(osInfo, 0, sizeof(OSVERSIONINFOEXW)); @@ -645,6 +644,60 @@ const char *MUtils::OS::os_friendly_name(const MUtils::OS::Version::os_version_t } /////////////////////////////////////////////////////////////////////////////// +// OS ARCHITECTURE DETECTION +/////////////////////////////////////////////////////////////////////////////// + +static bool g_os_arch_initialized = false; +static MUtils::OS::os_arch_t g_os_arch = MUtils::OS::os_arch_t(0); +static QReadWriteLock g_os_arch_lock; + +static MUtils::OS::os_arch_t detect_os_arch(void) +{ +#if (!(defined(_M_X64) || defined(_M_IA64))) + typedef BOOL(WINAPI * IsWow64ProcessFun)(__in HANDLE hProcess, __out PBOOL Wow64Process); + const IsWow64ProcessFun isWow64ProcessPtr = MUtils::Win32Utils::resolve(QLatin1String("kernel32"), QLatin1String("IsWow64Process")); + if (isWow64ProcessPtr) + { + BOOL x64flag = FALSE; + if (isWow64ProcessPtr(GetCurrentProcess(), &x64flag)) + { + if (x64flag) + { + return MUtils::OS::ARCH_X64; + } + } + } + return MUtils::OS::ARCH_X86; +#else + return MUtils::OS::ARCH_X64; +#endif +} + +const MUtils::OS::os_arch_t &MUtils::OS::os_architecture(void) +{ + QReadLocker readLock(&g_os_arch_lock); + + //Already initialized? + if (g_os_arch_initialized) + { + return g_os_arch; + } + + readLock.unlock(); + QWriteLocker writeLock(&g_os_arch_lock); + + //Initialized now? + if (g_os_arch_initialized) + { + return g_os_arch; + } + + g_os_arch = detect_os_arch(); + g_os_arch_initialized = MUTILS_BOOLIFY(g_os_arch); + return g_os_arch; +} + +/////////////////////////////////////////////////////////////////////////////// // WINE DETECTION ///////////////////////////////////////////////////////////////////////////////