Непонятный ключ HKEY_PERFORMANCE_DATA
От: NNN7 Украина  
Дата: 04.05.14 08:22
Оценка:
Здравствуйте ! Программисты , очень нужна Ваша помощь . Уже сил нету . Как работать с ключом 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=/*...*/
 
    
    
    }}


Как это всё обрабатывать то? ((

Как узнать , например , загрузку процессора или ещё что-нибудь?

Не знаю, что и делать ((

Помогите , пожалуйста , подтолкните в правильное русло
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.