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