@@ -78,12 +78,21 @@ unsigned CPUDetectClass::L1InstructionCacheSetAssociative;
7878unsigned CPUDetectClass::L1InstructionTraceCacheSize;
7979unsigned CPUDetectClass::L1InstructionTraceCacheSetAssociative;
8080
81+ #if defined(_MSC_VER) && _MSC_VER < 1300
8182unsigned CPUDetectClass::TotalPhysicalMemory;
8283unsigned CPUDetectClass::AvailablePhysicalMemory;
8384unsigned CPUDetectClass::TotalPageMemory;
8485unsigned CPUDetectClass::AvailablePageMemory;
8586unsigned CPUDetectClass::TotalVirtualMemory;
8687unsigned CPUDetectClass::AvailableVirtualMemory;
88+ #else
89+ unsigned long long CPUDetectClass::TotalPhysicalMemory;
90+ unsigned long long CPUDetectClass::AvailablePhysicalMemory;
91+ unsigned long long CPUDetectClass::TotalPageMemory;
92+ unsigned long long CPUDetectClass::AvailablePageMemory;
93+ unsigned long long CPUDetectClass::TotalVirtualMemory;
94+ unsigned long long CPUDetectClass::AvailableVirtualMemory;
95+ #endif
8796
8897unsigned CPUDetectClass::OSVersionNumberMajor;
8998unsigned CPUDetectClass::OSVersionNumberMinor;
@@ -885,6 +894,7 @@ void CPUDetectClass::Init_Memory()
885894{
886895#ifdef WIN32
887896
897+ #if defined(_MSC_VER) && _MSC_VER < 1300
888898 MEMORYSTATUS mem;
889899 GlobalMemoryStatus (&mem);
890900
@@ -894,14 +904,32 @@ void CPUDetectClass::Init_Memory()
894904 AvailablePageMemory = mem.dwAvailPageFile ;
895905 TotalVirtualMemory = mem.dwTotalVirtual ;
896906 AvailableVirtualMemory = mem.dwAvailVirtual ;
897- #elif defined(_UNIX)
907+ #else
908+ MEMORYSTATUSEX mem;
909+ mem.dwLength = sizeof (mem);
910+ GlobalMemoryStatusEx (&mem);
911+
912+ TotalPhysicalMemory = mem.ullTotalPhys ;
913+ AvailablePhysicalMemory = mem.ullAvailPhys ;
914+ TotalPageMemory = mem.ullTotalPageFile ;
915+ AvailablePageMemory = mem.ullAvailPageFile ;
916+ TotalVirtualMemory = mem.ullTotalVirtual ;
917+ AvailableVirtualMemory = mem.ullAvailVirtual ;
918+ #endif // defined(_MSC_VER) && _MSC_VER < 1300
919+
920+ #else
898921#warning FIX Init_Memory()
899- #endif
922+ #endif // WIN32
900923}
901924
902925void CPUDetectClass::Init_OS ()
903926{
904927#ifdef WIN32
928+
929+ // TheSuperHackers @fix OmniBlade 30/07/2025
930+ // GetVersionEx only returns the version of Windows it was manifested for since Windows 8.
931+ // RtlGetVersion returns the correct information at least at the time of writing.
932+ #if defined(_MSC_VER) && _MSC_VER < 1300
905933 OSVERSIONINFO os;
906934 os.dwOSVersionInfoSize = sizeof (os);
907935 GetVersionEx (&os);
@@ -911,7 +939,33 @@ void CPUDetectClass::Init_OS()
911939 OSVersionBuildNumber = os.dwBuildNumber ;
912940 OSVersionPlatformId = os.dwPlatformId ;
913941 OSVersionExtraInfo = os.szCSDVersion ;
914- #elif defined(_UNIX)
942+ #else
943+ typedef LONG (WINAPI * RtlGetVersionPtr)(PRTL_OSVERSIONINFOW);
944+ HMODULE ntdll = LoadLibraryExA (" ntdll" , NULL , 0 );
945+ if (ntdll != nullptr ) {
946+ RtlGetVersionPtr RtlGetVersion = (RtlGetVersionPtr)::GetProcAddress (ntdll, " RtlGetVersion" );
947+
948+ if (RtlGetVersion != nullptr ) {
949+ RTL_OSVERSIONINFOW os = {0 };
950+ os.dwOSVersionInfoSize = sizeof (os);
951+ RtlGetVersion (&os);
952+ OSVersionNumberMajor = os.dwMajorVersion ;
953+ OSVersionNumberMinor = os.dwMinorVersion ;
954+ OSVersionBuildNumber = os.dwBuildNumber ;
955+ OSVersionPlatformId = os.dwPlatformId ;
956+ OSVersionExtraInfo = os.szCSDVersion ;
957+ return ;
958+ }
959+ }
960+
961+ // GetVersionEx will return this info if no manifest is present so seems a safe fallback.
962+ OSVersionNumberMajor = 6 ;
963+ OSVersionNumberMinor = 2 ;
964+ OSVersionBuildNumber = 0 ;
965+ OSVersionPlatformId = 2 ;
966+ OSVersionExtraInfo = " " ;
967+ #endif // defined(_MSC_VER) && _MSC_VER < 1300
968+ #else
915969#warning FIX Init_OS()
916970#endif
917971}
0 commit comments