Files
yttrium-virtio-gpu/Balloon/app/memstat.cpp
T
2014-04-21 17:54:59 +10:00

207 lines
5.8 KiB
C++

#include "memstat.h"
#include "utils.h"
CMemStat::CMemStat()
{
initialized = FALSE;
locator = NULL;
service = NULL;
}
CMemStat::~CMemStat()
{
service = NULL;
locator = NULL;
if (initialized == TRUE) {
CoUninitialize();
}
}
BOOL CMemStat::Init()
{
HRESULT status = S_OK;
status = CoInitializeEx(NULL,
COINIT_MULTITHREADED);
if (FAILED(status)) {
PrintMessage("Cannot initialize COM");
return status;
}
initialized = TRUE;
status = CoInitializeSecurity(
NULL,
-1,
NULL,
NULL,
RPC_C_AUTHN_LEVEL_PKT,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE,
0
);
if (FAILED(status)) {
PrintMessage("Cannot initialize security");
return FALSE;
}
status = CoCreateInstance(
CLSID_WbemLocator,
NULL,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
reinterpret_cast< void** >( &locator )
);
if (FAILED(status)) {
PrintMessage("Cannot create instance");
return FALSE;
}
status = locator->ConnectServer(
L"root\\cimv2",
NULL,
NULL,
0L,
0L,
NULL,
NULL,
&service
);
if (FAILED(status)) {
PrintMessage("Cannot connect to wmi server");
return FALSE;
}
status = CoSetProxyBlanket(service,
RPC_C_AUTHN_WINNT,
RPC_C_AUTHZ_NONE,
NULL,
RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE
);
if (FAILED(status)) {
PrintMessage("Cannot set proxy blanket");
return FALSE;
}
return TRUE;
}
BOOL CMemStat::GetStatus(PBALLOON_STAT pStat)
{
MEMORYSTATUSEX statex = {sizeof(statex)};
CComPtr< IEnumWbemClassObject > enumerator;
CComPtr< IWbemClassObject > memory;
ULONG retcnt;
_variant_t var_val;
HRESULT status = S_OK;
UINT idx = 0;
if(!pStat) {
PrintMessage("Invalid pointer");
return FALSE;
}
status = service->ExecQuery(
L"WQL",
L"SELECT * FROM Win32_PerfFormattedData_PerfOS_Memory",
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&enumerator
);
if (FAILED(status)) {
PrintMessage("Cannot execute query");
return FALSE;
}
while(enumerator)
{
status = enumerator->Next(
WBEM_INFINITE,
1L,
&memory,
&retcnt
);
if (retcnt == 0) {
break;
}
status = memory->Get(
L"PagesInputPerSec",
0,
&var_val,
NULL,
NULL
);
if (FAILED(status) || (var_val.vt == VT_NULL)) {
PrintMessage("Cannot get PagesInputPerSec");
var_val.vt = -1;
}
pStat[idx].tag = VIRTIO_BALLOON_S_SWAP_IN;
pStat[idx].val = (long)var_val;
idx++;
status = memory->Get(
L"PagesOutputPerSec",
0,
&var_val,
NULL,
NULL
);
if (FAILED(status) || (var_val.vt == VT_NULL)) {
PrintMessage("Cannot get PagesOutputPerSec");
var_val.vt = -1;
}
pStat[idx].tag = VIRTIO_BALLOON_S_SWAP_OUT;
pStat[idx].val = (long)var_val;
idx++;
status = memory->Get(
L"PageReadsPerSec",
0,
&var_val,
NULL,
NULL
);
if (FAILED(status) || (var_val.vt == VT_NULL)) {
PrintMessage("Cannot get PageReadsPerSec");
var_val.vt = -1;
}
pStat[idx].tag = VIRTIO_BALLOON_S_MAJFLT;
pStat[idx].val = (long)var_val;
idx++;
status = memory->Get(
L"PageFaultsPerSec",
0,
&var_val,
NULL,
NULL
);
if (FAILED(status) || (var_val.vt == VT_NULL)) {
PrintMessage("Cannot get PageFaultsPerSec");
var_val.vt = -1;
}
pStat[idx].tag = VIRTIO_BALLOON_S_MINFLT;
pStat[idx].val = (long)var_val;
idx++;
GlobalMemoryStatusEx(&statex);
pStat[idx].tag = VIRTIO_BALLOON_S_MEMFREE;
pStat[idx].val = statex.ullAvailPhys;
idx++;
pStat[idx].tag = VIRTIO_BALLOON_S_MEMTOT;
pStat[idx].val = statex.ullTotalPhys;
}
return TRUE;
}