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



我正在尝试注册一个性能计数器,这个过程的一部分包括向特定的注册表项添加一些文本描述。对于英语,此键是HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionPerflib09,显然也被称为HKEY_PERFORMANCE_TEXT。有一对值在那里(计数器,帮助)有REG_MULTI_SZ数据,我需要修改它们来完成我的目标。

官方的方法是使用一个叫做lodctr的工具以及一个。h和。ini文件。还有一个函数可以通过编程方式完成此操作,但我的理解是,它只是调用lodctr程序的简单包装。我发现维护、分发和保持3个独立文件的同步有点麻烦,所以我之前写了一些代码来做这件事,它在Windows XP下工作得很好(可能还有Vista,尽管我记不清楚了)。

现在我试图在Windows 7上使用相同的代码,它不起作用。问题是,每当我试图设置注册表值时,它就会用ERROR_BADKEY失败;甚至regedit也无法修改这些值,所以这对我的代码来说不是问题。我对它运行进程监视器,并注意到在驱动程序级别没有活动,所以似乎这种访问必须在用户模式代码中被阻止(例如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,但还是没能弄清楚,所以我又尝试了一些Google。过了一会儿,我看到了这篇解释RegSetValueEx行为的知识库文章。因为它提到了修改系统文件,这让我想到也许这个特定的注册表数据是由映射文件支持的。然后我看到了另一篇提到system32文件夹中的Perfc009.dat和Perfh009.dat的知识库文章。在十六进制编辑器中打开这些,果然是我试图修改的原始REG_MULTI_SZ数据。现在我知道了,也许我可以再看一眼,把它弄清楚,尽管我现在对它很厌倦。

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

最新更新