Make physmem.h work on old Windows versions.

Thanks to Hongbo Ni for the original patch.
This commit is contained in:
Lasse Collin 2009-02-15 15:48:45 +02:00
parent 11ae4ae35f
commit 7494816ab0
1 changed files with 27 additions and 4 deletions

View File

@ -81,10 +81,33 @@ physmem(void)
ret = (uint64_t)(si.totalram) * si.mem_unit; ret = (uint64_t)(si.totalram) * si.mem_unit;
#elif defined(_WIN32) #elif defined(_WIN32)
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; MEMORYSTATUSEX meminfo;
meminfo.dwLength = sizeof(meminfo); meminfo.dwLength = sizeof(meminfo);
if (GlobalMemoryStatusEx(&meminfo)) if (gmse(&meminfo))
ret = meminfo.ullTotalPhys; 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__) #elif defined(__DJGPP__)
__dpmi_free_mem_info meminfo; __dpmi_free_mem_info meminfo;