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