Здравствуйте ! Программисты , очень нужна Ваша помощь . Уже сил нету . Как работать с ключом HKEY_PERFORMANCE_DATA? Нужно определить значение основных счётчиков продуктивности . Уже перечитал всё , что можно и нельзя,но так и не разобрался .
Как считать с этого ключа данные ?
#include "stdafx.h"
#include <windows.h>
#include <malloc.h>
#include <stdio.h>
#define TOTALBYTES 8192
#define BYTEINCREMENT 4096
void main()
{
DWORD BufferSize = TOTALBYTES;
DWORD cbData;
DWORD dwRet;
PPERF_DATA_BLOCK PerfData = (PPERF_DATA_BLOCK) malloc( BufferSize );
cbData = BufferSize;
printf("\nRetrieving the data...");
dwRet = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
TEXT("Global"),
NULL,
NULL,
(LPBYTE) PerfData,
&cbData );
while( dwRet == ERROR_MORE_DATA )
{
// Get a buffer that is big enough.
BufferSize += BYTEINCREMENT;
PerfData = (PPERF_DATA_BLOCK) realloc( PerfData, BufferSize );
cbData = BufferSize;
printf(".");
dwRet = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
TEXT("Global"),
NULL,
NULL,
(LPBYTE) PerfData,
&cbData );
}
if( dwRet == ERROR_SUCCESS )
printf("\n\nFinal buffer size is %d\n", BufferSize);
else printf("\nRegQueryValueEx failed (%d)\n", dwRet);
}
прочитал , что список активных счётчиков лежит в HKLM\Software\Microsoft\Windows NT\Corrent Version\PerfLib
понял , что там изображены счётчики и их индексы
Я так понимаю, что для каждого счётчика нужно использовать свой индекс?
#include "stdafx.h"
#include <windows.h>
#include <malloc.h>
#include <stdio.h>
#include <iostream>
using namespace std;
#define TOTALBYTES 8192
#define BYTEINCREMENT 4096
const int Process_Index = 230;
const int PID_Process = 784;
void main()
{
DWORD BufferSize = TOTALBYTES; //размер буфера
DWORD cbData;
DWORD dwRet; //код возврата
PPERF_DATA_BLOCK PerfData = (PPERF_DATA_BLOCK) malloc( BufferSize );
PPERF_OBJECT_TYPE PerObjType;
PPERF_INSTANCE_DEFINITION PerDefin;
PPERF_COUNTER_BLOCK PerCount;
int i,k,j; //для циклов
string name;
cbData = BufferSize;
printf("\nRetrieving the data...");
dwRet = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
TEXT("Global"),
NULL,
NULL,
(LPBYTE) PerfData,
&cbData );
while( dwRet == ERROR_MORE_DATA )
{
// Get a buffer that is big enough.
BufferSize += BYTEINCREMENT;
PerfData = (PPERF_DATA_BLOCK) realloc( PerfData, BufferSize );
cbData = BufferSize;
printf(".");
dwRet = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
TEXT("Global"),
NULL,
NULL,
(LPBYTE) PerfData,
&cbData );
}
if( dwRet == ERROR_SUCCESS )
{ printf("\n\nFinal buffer size is %d\n", BufferSize);
// cout<<PerfData<<" "<<endl;
}
else printf("\nRegQueryValueEx failed (%d)\n", dwRet);
RegCloseKey(HKEY_PERFORMANCE_DATA);
for (i=0;i<PerfData->NumObjectTypes;i++)
{
//ищем объект Process (индекс 230)
if(PerObjType->ObjectNameTitleIndex=Process_Index)
{ //заполняем расположение описаний счётчиков PERE_COUNTER_DEFINITION
PerCount=/*....*/
}
// Получаем экземпляры объекта Process, если они есть
if(PerObjType->NumInstances>0)
//получаем указатель на первую структуру PERF_INFINITION
PerDefin=/*...*/
}}
Как это всё обрабатывать то? ((
Как узнать , например , загрузку процессора или ещё что-нибудь?
Не знаю, что и делать ((
Помогите , пожалуйста , подтолкните в правильное русло