@@ -78,12 +78,21 @@ unsigned CPUDetectClass::L1InstructionCacheSetAssociative;
78
78
unsigned CPUDetectClass::L1InstructionTraceCacheSize;
79
79
unsigned CPUDetectClass::L1InstructionTraceCacheSetAssociative;
80
80
81
+ #if defined(_MSC_VER) && _MSC_VER < 1300
81
82
unsigned CPUDetectClass::TotalPhysicalMemory;
82
83
unsigned CPUDetectClass::AvailablePhysicalMemory;
83
84
unsigned CPUDetectClass::TotalPageMemory;
84
85
unsigned CPUDetectClass::AvailablePageMemory;
85
86
unsigned CPUDetectClass::TotalVirtualMemory;
86
87
unsigned 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
87
96
88
97
unsigned CPUDetectClass::OSVersionNumberMajor;
89
98
unsigned CPUDetectClass::OSVersionNumberMinor;
@@ -885,6 +894,7 @@ void CPUDetectClass::Init_Memory()
885
894
{
886
895
#ifdef WIN32
887
896
897
+ #if defined(_MSC_VER) && _MSC_VER < 1300
888
898
MEMORYSTATUS mem;
889
899
GlobalMemoryStatus (&mem);
890
900
@@ -894,14 +904,32 @@ void CPUDetectClass::Init_Memory()
894
904
AvailablePageMemory = mem.dwAvailPageFile ;
895
905
TotalVirtualMemory = mem.dwTotalVirtual ;
896
906
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
898
921
#warning FIX Init_Memory()
899
- #endif
922
+ #endif // WIN32
900
923
}
901
924
902
925
void CPUDetectClass::Init_OS ()
903
926
{
904
927
#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
905
933
OSVERSIONINFO os;
906
934
os.dwOSVersionInfoSize = sizeof (os);
907
935
GetVersionEx (&os);
@@ -911,7 +939,33 @@ void CPUDetectClass::Init_OS()
911
939
OSVersionBuildNumber = os.dwBuildNumber ;
912
940
OSVersionPlatformId = os.dwPlatformId ;
913
941
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
915
969
#warning FIX Init_OS()
916
970
#endif
917
971
}
0 commit comments