以编程方式在registry中注册性能计数器

我试图注册一个性能计数器,这个过程的一部分包括添加一些文本描述到一个特定的registry项。 对于英文这个键是HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Perflib \ 009这显然也被称为HKEY_PERFORMANCE_TEXT。 在那里有一对值(计数器,帮助)有REG_MULTI_SZ数据,我需要修改它们来完成我的目标。

正式的做法是使用名为lodctr的工具以及.h和.ini文件 。 还有一个函数可以通过编程实现 ,但是我的理解是,这只是一个简单的调用lodctr程序的包装器。 我发现维护,分发和保持3个单独的文件同步的前景有点麻烦,所以我以前编写代码来做到这一点,它在Windows XP(也可能是Vista,但我不记得肯定)下工作得很好。

现在我试图在Windows 7上使用相同的代码,它不起作用。 问题是,每当我尝试设置registry值失败与ERROR_BADKEY; 即使是registry编辑器也无法修改这些值,所以这不是我的代码的问题。 我运行了Process Monitor,注意到在驱动程序级别没有任何活动,所以看起来这个访问必须在用户模式代码(例如advapi32.dll或其他地方)中被阻止。 我明白为什么微软会试图阻止人们这样做,因为这很容易搞砸,这样做会把整个性能计数器集合搞乱。

我要去debugginglodctr,看看纯粹是出于好奇,这个魔法是什么,但是我想知道有没有人碰到过这个? 除了lodctr工具还有其他的select吗? 也许直接调用NTregistryAPI? 如果可能的话,我宁愿避免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:

我花了大约一个小时左右的时间试图debugging官方API,无法弄清楚,所以我尝试了更多的谷歌。 过了一会儿,我遇到了这个解释RegSetValueEx行为的知识库文章 。 由于它提到修改系统文件,让我想到也许这个特定的registry数据是由映射文件支持。 然后我遇到了另一个知识库文章 ,在System32文件夹中提到了Perfc009.dat和Perfh009.dat。 在hex编辑器中打开这些,确定这是我正在尝试修改的原始REG_MULTI_SZ数据。 现在我知道,也许我可以再看看,但现在我觉得很无聊。

没关系,我放弃了。 顺其自然,顺其自然。 我不会直接修改注册表,而是以编程方式创建.h和.ini文件,并调用相关函数。