#include "Framework.h"
using namespace fw;
template<> ComputerInfo* Singleton<ComputerInfo>::ms_instance = nullptr;
ComputerInfo::ComputerInfo()
{
ParseOSName();
ParseCPU();
ParseMemory();
ParseHDSpace();
}
ComputerInfo::~ComputerInfo()
{
}
std::string ComputerInfo::GetOsName()
{
return m_sOsName;
}
std::string ComputerInfo::GetCpuName()
{
return m_sCpuName;
}
std::string ComputerInfo::GetCpuSpeed()
{
return m_sCpuSpeed;
}
std::string ComputerInfo::GetTotalMemory()
{
return m_sTotalMemory;
}
std::string ComputerInfo::GetAvailableMemory()
{
return m_sAvailableMemory;
}
std::string ComputerInfo::GetHDSpace()
{
return m_sHDDAvailableMemory;
}
bool ComputerInfo::CompareWindowsVersionMinor(const DWORD dwMinorVersion)
{
OSVERSIONINFOEX ver;
DWORDLONG dwlConditionMask = 0;
ZeroMemory(&ver, sizeof(OSVERSIONINFOEX));
ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
ver.dwMinorVersion = dwMinorVersion;
VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_EQUAL);
return VerifyVersionInfo(&ver, VER_MINORVERSION, dwlConditionMask);
}
bool ComputerInfo::CompareWindowsVersionMajor(const DWORD dwMajorVersion)
{
OSVERSIONINFOEX ver;
DWORDLONG dwlConditionMask = 0;
ZeroMemory(&ver, sizeof(OSVERSIONINFOEX));
ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
ver.dwMajorVersion = dwMajorVersion;
VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_EQUAL);
return VerifyVersionInfo(&ver, VER_MAJORVERSION, dwlConditionMask);
}
void ComputerInfo::ParseOSName()
{
std::string sOSName = "OS Inconnu";
if (CompareWindowsVersionMajor(6))
{
if ((CompareWindowsVersionMinor(3)))
{
sOSName = "Windows 8.1";
}
else if ((CompareWindowsVersionMinor(2)))
{
sOSName = "Windows 8";
}
else if ((CompareWindowsVersionMinor(1)))
{
sOSName = "Windows 7";
}
else if ((CompareWindowsVersionMinor(0)))
{
sOSName = "Windows Vista";
}
}
else if (CompareWindowsVersionMajor(5))
{
if (CompareWindowsVersionMinor(1))
{
sOSName = "Windows XP";
}
}
m_sOsName = sOSName;
}
void ComputerInfo::ParseCPU()
{
int CPUInfo[4] = {-1};
unsigned nExIds;
char CPUBrandString[0x40] = { 0 };
__cpuid(CPUInfo, 0x80000000);
nExIds = CPUInfo[0];
for (uint32 i = 0x80000000; i <= nExIds; ++i)
{
__cpuid(CPUInfo, i);
if (i == 0x80000002)
memcpy(CPUBrandString, CPUInfo, sizeof(CPUInfo));
else if (i == 0x80000003)
memcpy(CPUBrandString + 16, CPUInfo, sizeof(CPUInfo));
else if (i == 0x80000004)
memcpy(CPUBrandString + 32, CPUInfo, sizeof(CPUInfo));
}
m_sCpuName = STRING_BUILDER->RemoveSpaceAfterString(CPUBrandString);
/************************************/
char Buffer[_MAX_PATH];
DWORD BufSize = _MAX_PATH;
DWORD dwMHz = _MAX_PATH;
HKEY hKey;
long lError = RegOpenKeyExA(HKEY_LOCAL_MACHINE,
"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",
0,
KEY_READ,
&hKey);
if(lError != ERROR_SUCCESS)
{
FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
lError,
0,
Buffer,
_MAX_PATH,
0);
}
RegQueryValueExA(hKey, "~MHz", NULL, NULL, (LPBYTE) &dwMHz, &BufSize);
char string[512] = { 0 };
sprintf(string, "%i", dwMHz);
m_sCpuSpeed = std::string(string) + " MHz";
}
void ComputerInfo::ParseMemory()
{
MEMORYSTATUSEX status;
status.dwLength = sizeof(status);
GlobalMemoryStatusEx(&status);
__int64 totalPhysicalMem = 0;
__int64 availableMem = 0;
totalPhysicalMem = status.ullTotalPhys / 1024;
totalPhysicalMem = (totalPhysicalMem / 1024) + 1;
availableMem = status.ullAvailPhys / 1024;
availableMem = (availableMem / 1024) + 1;
m_sTotalMemory = STRING_BUILDER->IntegerToString((int) totalPhysicalMem) + " MB";
m_sAvailableMemory = STRING_BUILDER->IntegerToString((int) availableMem) + " MB";
}
void ComputerInfo::ParseHDSpace()
{
int const drive = _getdrive();
struct _diskfree_t diskfree;
_getdiskfree(drive, &diskfree);
unsigned __int64 const total = diskfree.sectors_per_cluster * diskfree.bytes_per_sector * diskfree.avail_clusters;
m_sHDDAvailableMemory = STRING_BUILDER->IntegerToString((int)total / 1024 / 1024) + " GB";
}