2011-09-23 88 views
2

我正在嘗試註冊性能計數器,並且此過程的一部分包括向特定註冊表項添加一些文本說明。對於英文這個鍵是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;即使是註冊表編輯器也無法修改這些值,所以這對我的代碼沒有任何影響。我運行了Process Monitor並注意到驅動程序級沒有任何活動,所以看起來這個訪問必須在用戶模式代碼(例如advapi32.dll或任何地方)中被阻止。我明白爲什麼微軟會試圖阻止人們這樣做,因爲這很容易搞砸,這樣做會使計算機上的整個性能計數器集合失效。

我打算調試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,無法弄明白,所以我嘗試了更多的谷歌。一段時間後,我遇到了this KB article,它解釋了RegSetValueEx行爲。因爲它提到修改系統文件,讓我想到也許這個特定的註冊表數據是由映射文件支持的。然後我遇到了another KB article,它提到了system32文件夾中的Perfc009.dat和Perfh009.dat。用十六進制編輯器打開這些文件,並確定它是我嘗試修改的原始REG_MULTI_SZ數據。現在我知道,也許我可以再看一眼並弄清楚,儘管我現在對它感到厭煩。

回答

2

沒關係,我放棄了。順其自然,順其自然。我不會直接修改註冊表,而是以編程方式創建.h和.ini文件並調用相關函數。