I need to access read/write and sent/received type of data about disk and network operations of a specified Windows process as Resource Monitor displays it. How can I do it with WinAPI? Can I do it with PDH?
Asked
Active
Viewed 76 times
1 Answers
0
Process disk information can be obtained using PDH. For obtaining network information, you can refer to this question.
Here is a complete example for your reference.
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <locale.h>
#include <Pdh.h>
#include <string>
#include <pdhmsg.h>
#include <tchar.h>
#pragma comment(lib,"Pdh.lib")
int nCPU;
using std::string;
using namespace std;
int GetData()
{
HQUERY query;
double dbVal;
long iVal;
//PDH_STATUS status = PdhOpenQuery(NULL, NULL, &query);
PDH_STATUS status = PdhOpenQuery(0, 0, &query);
if (ERROR_SUCCESS != status)
{
MessageBox(NULL, TEXT("failed"), TEXT(""), MB_OK);
return -1;
}
HCOUNTER cntProcessCPU, cntProcessMemory;
HCOUNTER cntProcessDiskRead, cntProcessDiskWrite;
status = PdhAddCounter(query, L"\\Process(YourProcessName)\\% Processor Time", NULL, &cntProcessCPU);
status = PdhAddCounter(query, L"\\Process(YourProcessName)\\Working Set - Private", NULL, &cntProcessMemory);
status = PdhAddCounter(query, L"\\Process(YourProcessName)\\IO Read Bytes/sec", NULL, &cntProcessDiskRead);
status = PdhAddCounter(query, L"\\Process(YourProcessName)\\IO Write Bytes/sec", NULL, &cntProcessDiskWrite);
printf("111");
if (ERROR_SUCCESS != status)
{
MessageBox(NULL, TEXT("add failed"), TEXT(""), MB_OK);
return -1;
}
status = PdhCollectQueryData(query);
Sleep(500);
status = PdhCollectQueryData(query);
if (ERROR_SUCCESS != status)
{
MessageBox(NULL, TEXT("request failed"), TEXT(""), MB_OK);
return -1;
}
PDH_FMT_COUNTERVALUE pdhValue;
DWORD dwValue;
status = PdhGetFormattedCounterValue(cntProcessCPU, PDH_FMT_DOUBLE, &dwValue, &pdhValue);
if (ERROR_SUCCESS != status)
{
MessageBox(NULL, TEXT("Get failed"), TEXT(""), MB_OK);
return -1;
}
else
{
dbVal = pdhValue.doubleValue;
printf("Process-CPU: %3d%% ", (int)(dbVal / nCPU + 0.5));
}
status = PdhGetFormattedCounterValue(cntProcessMemory, PDH_FMT_DOUBLE, &dwValue, &pdhValue);
if (ERROR_SUCCESS != status)
{
MessageBox(NULL, TEXT("Get failed"), TEXT(""), MB_OK);
return -1;
}
else
{
dbVal = pdhValue.doubleValue;
printf("Process-Memory: %8dK \n", (int)(dbVal / 1024));
}
status = PdhGetFormattedCounterValue(cntProcessDiskRead, PDH_FMT_DOUBLE, &dwValue, &pdhValue);
if (ERROR_SUCCESS != status)
{
MessageBox(NULL, TEXT("Get failed"), TEXT(""), MB_OK);
return -1;
}
else
{
dbVal = pdhValue.doubleValue;
printf("Process-DiskRead:%8dK/s ", (int)(dbVal / 1024));
}
status = PdhGetFormattedCounterValue(cntProcessDiskWrite, PDH_FMT_DOUBLE, &dwValue, &pdhValue);
if (ERROR_SUCCESS != status)
{
MessageBox(NULL, TEXT("Get failed"), TEXT(""), MB_OK);
return -1;
}
else
{
dbVal = pdhValue.doubleValue;
printf("Process-DiskWrite:%8dK/s \n*****************************************************************************\n", (int)(dbVal / 1024));
}
PdhRemoveCounter(cntProcessCPU);
PdhRemoveCounter(cntProcessMemory);
PdhRemoveCounter(cntProcessDiskRead);
PdhRemoveCounter(cntProcessDiskWrite);
PdhCloseQuery(query);
}
int main() {
SYSTEM_INFO si;
GetSystemInfo(&si);
nCPU = si.dwNumberOfProcessors;
while (1)
{
Sleep(500);
GetData();
}
system("pause");
return 0;
}

Junjie Zhu - MSFT
- 2,086
- 1
- 2
- 6
-
Thank you, it works. I hoped there is performance API for windows that looks less bulky than PDH. – CurtisB Oct 22 '22 at 08:34