Upload 2.0.2
[physicsfs] / lzma / CPP / Windows / System.cpp
1 // Windows/System.cpp
2
3 #include "StdAfx.h"
4
5 #include "System.h"
6
7 namespace NWindows {
8 namespace NSystem {
9
10 UInt32 GetNumberOfProcessors()
11 {
12   SYSTEM_INFO systemInfo;
13   GetSystemInfo(&systemInfo);
14   return (UInt32)systemInfo.dwNumberOfProcessors;
15 }
16
17 #if !defined(_WIN64) && defined(__GNUC__)
18
19 typedef struct _MY_MEMORYSTATUSEX {
20   DWORD dwLength;
21   DWORD dwMemoryLoad;
22   DWORDLONG ullTotalPhys;
23   DWORDLONG ullAvailPhys;
24   DWORDLONG ullTotalPageFile;
25   DWORDLONG ullAvailPageFile;
26   DWORDLONG ullTotalVirtual;
27   DWORDLONG ullAvailVirtual;
28   DWORDLONG ullAvailExtendedVirtual;
29 } MY_MEMORYSTATUSEX, *MY_LPMEMORYSTATUSEX;
30
31 #else
32
33 #define MY_MEMORYSTATUSEX MEMORYSTATUSEX
34 #define MY_LPMEMORYSTATUSEX LPMEMORYSTATUSEX
35
36 #endif
37
38 typedef BOOL (WINAPI *GlobalMemoryStatusExP)(MY_LPMEMORYSTATUSEX lpBuffer);
39
40 UInt64 GetRamSize()
41 {
42   MY_MEMORYSTATUSEX stat;
43   stat.dwLength = sizeof(stat);
44   #ifdef _WIN64
45   if (!::GlobalMemoryStatusEx(&stat))
46     return 0;
47   return stat.ullTotalPhys;
48   #else
49   GlobalMemoryStatusExP globalMemoryStatusEx = (GlobalMemoryStatusExP)
50         ::GetProcAddress(::GetModuleHandle(TEXT("kernel32.dll")),
51         "GlobalMemoryStatusEx");
52   if (globalMemoryStatusEx != 0)
53     if (globalMemoryStatusEx(&stat))
54       return stat.ullTotalPhys;
55   {
56     MEMORYSTATUS stat;
57     stat.dwLength = sizeof(stat);
58     GlobalMemoryStatus(&stat);
59     return stat.dwTotalPhys;
60   }
61   #endif
62 }
63
64 }}