Поиск идентификатора счетчика пермонов через winreg
У меня есть приложение, которое собирает значения счетчиков 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 ответа
Я понимаю, что это старый, но в случае, если это помогает:
- Тим прав, разбирать двоичные данные самостоятельно сложно. Приготовься к миру боли. Я бы порекомендовал PDH (инкапсулирует доступ к реестру для вас) или, в случае неудачи, WMI (хотя учтите, что WMI намного медленнее).
- Вы не можете получить данные только для счетчика производительности (
ID Process
с индексом784
). Вы должны получить его для всего объекта (Process
с индексом230
). - Идентификаторы для встроенных объектов гарантированно будут одинаковыми во всех установках Windows. Так что, если это единственный счетчик, который вам нужен, просто используйте
230
,:)
Я не вижу возможности различить два
Они дают одинаковую ценность? Если так, то почему бы вам не важно, какой из них вы используете?
Если они разные, ты можешь попробовать оба? (например, OpenProcess на обоих идентификаторах)
(Нельзя перенести это в.Net или что-то подобное)
Как насчет использования API PDH (например, PdhOpenQuery) или интерфейсов COM, предоставляемых WMI? Вы можете сделать как из родного C++.
Я никогда не использовал счетчики производительности, читая реестр напрямую, но может случиться так, что по какой-то веской причине есть два счетчика "Идентификатор процесса" (например, приложения под WoW16/64 имеют отдельные идентификаторы процессов?), И альтернатива покажет тоже самое. Вы видите два из них на панели MMC AdminstrativeTools \ Performance?