int CSysInfo::GetKernelBitness(void) { #ifdef TARGET_WINDOWS SYSTEM_INFO si; GetSystemInfo(&si); if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) return 64; BOOL (WINAPI *ptrIsWow64) (HANDLE, PBOOL); HMODULE hKernel32 = GetModuleHandleA("kernel32"); if (hKernel32 == NULL) return 0; // Can't detect OS ptrIsWow64 = (BOOL (WINAPI *) (HANDLE, PBOOL)) GetProcAddress(hKernel32, "IsWow64Process"); BOOL wow64proc = FALSE; if (ptrIsWow64 == NULL || ptrIsWow64(GetCurrentProcess(), &wow64proc) == FALSE) return 0; // Can't detect OS return (wow64proc == FALSE) ? 32 : 64; #elif defined(TARGET_POSIX) struct utsname un; if (uname(&un) == 0) { std::string machine(un.machine); if (machine == "x86_64" || machine == "amd64" || machine == "arm64" || machine == "aarch64" || machine == "ppc64" || machine == "ia64") return 64; return 32; } return 0; // can't detect #else return 0; // unknown #endif }
bool CSysInfo::IsOS64bit() { #ifdef TARGET_WINDOWS SYSTEM_INFO si; GetSystemInfo(&si); if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) return true; BOOL (WINAPI *ptrIsWow64) (HANDLE, PBOOL); HMODULE hKernel32 = GetModuleHandleA("kernel32"); if (hKernel32 == NULL) return false; // Can't detect OS ptrIsWow64 = (BOOL (WINAPI *) (HANDLE, PBOOL)) GetProcAddress(hKernel32, "IsWow64Process"); BOOL wow64proc = FALSE; if (ptrIsWow64 == NULL || ptrIsWow64(GetCurrentProcess(), &wow64proc) == FALSE) return false; // Can't detect OS return wow64proc != FALSE; #else // TARGET_WINDOWS // TODO: Implement Linux, FreeBSD, Android, OSX return false; #endif // TARGET_WINDOWS }