성능 카운터를 등록하려고하는데이 프로세스의 일부로 특정 레지스트리 키에 텍스트 설명을 추가하는 과정이 포함됩니다. 영어의 경우이 키는 HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Perflib \ 009이며 이는 HKEY_PERFORMANCE_TEXT라고도합니다. 거기에 REG_MULTI_SZ 데이터가있는 한 쌍의 값 (카운터, 도움말)이 있으며 목표를 달성하기 위해 수정해야합니다.프로그래밍 방식으로 레지스트리에 성능 카운터 등록
공식적인 방법은 tool called lodctr along with a .h and .ini file입니다. function for doing this programmatically도 있지만, 필자가 알고있는 것은 lodctr 프로그램을 호출하는 간단한 래퍼입니다. 필자는 이전에 동기화 된 3 개의 개별 파일을 약간의 번거로운 방식으로 유지, 배포 및 유지할 가능성을 발견했기 때문에 이전에이 작업을 수행하기 위해 코드를 작성 했으므로 Windows XP 및 Vista에서도 제대로 작동했습니다.
이제 Windows 7에서 동일한 코드를 사용하려고하는데 작동하지 않습니다. 문제는 레지스트리 값을 설정하려고 할 때마다 ERROR_BADKEY로 실패합니다. 심지어 regedit가 값을 수정하지 못하기 때문에 내 코드에서 문제가되지 않습니다. Process Monitor를 실행하고 드라이버 수준에서 아무런 활동도 없었 음을 알았으므로이 액세스가 사용자 모드 코드에서 차단되어야합니다 (예 : advapi32.dll 또는 어디에서든지). 필자는 왜 Microsoft가 사람들이이 작업을 수행하지 못하도록 막으려하는지 이해합니다. 그렇게하면 컴퓨터에 전체 성능 카운터 모음이 망가질 수 있습니다.
나는 lodctr을 디버그하여 궁금증에서 벗어난 마법을 보게 될 것입니다. 그러나 누군가 전에이 문제가 발생했는지 궁금합니다. lodctr 유틸리티 이외의 다른 옵션이 있습니까? 아마도 NT 레지스트리 API를 직접 호출 할 것입니까? 가능한 경우 lodctr 메서드의 번거 로움을 피하는 것이 좋습니다. 문제를 재현하는
최소한의 예 :
HKEY hKey = NULL;
LONG nResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Perflib\\009"), 0, KEY_ALL_ACCESS, &hKey);
if(ERROR_SUCCESS == nResult)
{
LPCTSTR lpData = _T("bar");
DWORD cbData = (_tcsclen(lpData) + 1) * sizeof(TCHAR);
nResult = RegSetValueEx(hKey, _T("foo"), 0, REG_SZ, (const BYTE*)lpData, cbData);
// here nResult == ERROR_BADKEY
RegCloseKey(hKey);
hKey = NULL;
}
편집을 1 :
내가 한 시간 정도 소요 정도 공식 API를 디버깅하기 위해 노력하고 내가 너무 알아낼 수 더 많은 Google을 사용해 보았습니다. 잠시 후 RegSetValueEx 동작을 설명하는 this KB article이 나타났습니다. 이후로이 특정 레지스트리 데이터가 매핑 된 파일에 의해 뒷받침된다고 생각하게하는 시스템 파일 수정에 대해 언급했습니다. 그런 다음 another KB article을보고 system32 폴더에서 Perfc009.dat 및 Perfh009.dat를 언급했습니다. 이것들을 16 진수 편집기에서 열었습니다. 수정하려고하는 원시 REG_MULTI_SZ 데이터입니다. 이제 나는 다른 모습을 가지고 그것을 이해할 수 있을지도 모른다는 것을 알았으니, 지금 당장은 지루하다.