Поиск идентификатора счетчика пермонов через winreg - PullRequest
2 голосов
/ 13 июля 2009

У меня есть приложение, которое собирает значения счетчиков Perfmon через API, представленный в winreg.h - чтобы собрать значения счетчиков Perfmon, я должен позвонить RegQueryValueExW, передав идентификатор интересующего меня счетчика Perfmon. и для того, чтобы получить этот идентификатор, мне нужно запросить в реестре список имен счетчиков Perfmon и пройти поиск нужного мне

C ++ не является моим языком выбора, поэтому ниже приведен шаткий пример, возможно, с множеством синтаксических ошибок, но вы поняли:

DWORD IdProcessIndex = 0;
WCHAR* RawStrings = new WCHAR[ len ];
WCHAR* pCurrent;
DWORD nLenInChars;

// Get the name id of the "ID Process" counter
RegQueryValueExW(HKEY_PERFORMANCE_DATA, COUNTER009, 0, 0, (PBYTE)RawStrings, &len)

pCurrent = (WCHAR*)RawStrings;
while ( (nLenInChars = wcslen(pCurrent)) != 0 && IdProcessIndex == 0 )
{
    WCHAR* pName;
    pName = pCurrent + nLenInChars + 1;

    if ( wcscmp( pName, L"ID Process" ) == 0)
    {
        IdProcessIndex = _wtoi( pCurrent );
    }

    pCurrent = pName + wcslen( pName ) + 1;
}

// Get data for the "ID Process" counter
WCHAR strIdProcessIndex[32];
_itow( nIdProcessIndex, strIdProcessIndex, 10 );

RegQueryValueExW(HKEY_PERFORMANCE_DATA, strIdProcessIndex, NULL, NULL, (PBYTE)pData, &len)

Проблема в том, что на некоторых машинах (на которых установлен комплект разработчика Windows CE) есть второй счетчик perfmon с именем «Идентификатор процесса», и поэтому приведенный выше код находит идентификатор неверного счетчика.

Я не вижу никакого способа отличить эти два типа, кроме того, в каком порядке они находятся - в настоящий момент я считаю, что лучше всего взять первый найденный счетчик с подходящим именем, есть ли лучший вариант?

(Невозможно перенести это в .Net или что-то подобное)

Ответы [ 2 ]

2 голосов
/ 23 марта 2010

Я понимаю, что это старый, но в случае, если это помогает:

  1. Тим прав, самостоятельно разбирать двоичные данные сложно. Приготовься к миру боли. Я бы порекомендовал PDH (инкапсулирует доступ к реестру для вас) или, если это не удалось, WMI (хотя учтите, что WMI намного медленнее).
  2. Вы не можете получить данные только для счетчика производительности (ID Process, с индексом 784). Вам нужно получить его для всего объекта (Process, с индексом 230).
  3. Идентификаторы для встроенных объектов гарантированно будут одинаковыми во всех установках Windows. Поэтому, если вам нужен только один счетчик, просто используйте 230. :)
0 голосов
/ 14 июля 2009

Я не вижу возможности различить два

Они дают одинаковое значение? Если да, то почему бы вам не важно, какой из них вы используете?

Если они разные, ты можешь попробовать оба? (например, OpenProcess для обоих идентификаторов)

(невозможно перенести это в .Net или что-то подобное)

Как насчет использования API-интерфейса PDH (например, PdhOpenQuery) или интерфейсов COM, предоставляемых WMI? Вы можете сделать как из родного C ++.

Я никогда не использовал счетчики производительности, читая реестр напрямую, но может случиться так, что по какой-то веской причине есть два счетчика «ID Process» (например, приложения в WoW16 / 64 имеют отдельные идентификаторы процессов?) Альтернатива покажет то же самое. Вы видите два из них на панели MMC AdminstrativeTools \ Performance?

...