From: Lasse Collin Date: Sun, 15 Feb 2009 13:48:45 +0000 (+0200) Subject: Make physmem.h work on old Windows versions. X-Git-Tag: upstream/5.1.3~566 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7494816ab08d82f4d6409788825930c4e43cfd0d;p=platform%2Fupstream%2Fxz.git Make physmem.h work on old Windows versions. Thanks to Hongbo Ni for the original patch. --- diff --git a/src/common/physmem.h b/src/common/physmem.h index 7075bc5..acf03c7 100644 --- a/src/common/physmem.h +++ b/src/common/physmem.h @@ -81,10 +81,33 @@ physmem(void) ret = (uint64_t)(si.totalram) * si.mem_unit; #elif defined(_WIN32) - MEMORYSTATUSEX meminfo; - meminfo.dwLength = sizeof(meminfo); - if (GlobalMemoryStatusEx(&meminfo)) - ret = meminfo.ullTotalPhys; + if ((GetVersion() & 0xFF) >= 5) { + // Windows 2000 and later have GlobalMemoryStatusEx() which + // supports reporting values greater than 4 GiB. To keep the + // code working also on older Windows versions, use + // GlobalMemoryStatusEx() conditionally. + HMODULE kernel32 = GetModuleHandle("kernel32.dll"); + if (kernel32 != NULL) { + BOOL (WINAPI *gmse)(LPMEMORYSTATUSEX) = GetProcAddress( + kernel32, "GlobalMemoryStatusEx"); + if (gmse != NULL) { + MEMORYSTATUSEX meminfo; + meminfo.dwLength = sizeof(meminfo); + if (gmse(&meminfo)) + ret = meminfo.ullTotalPhys; + } + } + } + + if (ret == 0) { + // GlobalMemoryStatus() is supported by Windows 95 and later, + // so it is fine to link against it unconditionally. Note that + // GlobalMemoryStatus() has no return value. + MEMORYSTATUS meminfo; + meminfo.dwLength = sizeof(meminfo); + GlobalMemoryStatus(&meminfo); + ret = meminfo.dwTotalPhys; + } #elif defined(__DJGPP__) __dpmi_free_mem_info meminfo;