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

Windows 以编程方式在注册表中注册性能计数器,windows,registry,performancecounter,Windows,Registry,Performancecounter,我正在尝试注册一个性能计数器,这个过程的一部分包括向特定注册表项添加一些文本描述。对于英语,此键为HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009,显然也被称为HKEY_PERFORMANCE_TEXT。下面有一对值(Counter,Help)包含REG_MULTI_SZ数据,我需要修改它们以实现我的目标 官方的做法是使用。还有一个,但我的理解是,它只是调用lodctr程序的一个简单包装器。我发

我正在尝试注册一个性能计数器,这个过程的一部分包括向特定注册表项添加一些文本描述。对于英语,此键为HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009,显然也被称为HKEY_PERFORMANCE_TEXT。下面有一对值(Counter,Help)包含REG_MULTI_SZ数据,我需要修改它们以实现我的目标

官方的做法是使用。还有一个,但我的理解是,它只是调用lodctr程序的一个简单包装器。我发现维护、分发和保持3个独立文件的同步有点麻烦,所以我以前编写了代码来实现这一点,并且在Windows XP(可能还有Vista,但我不记得很清楚)下工作得很好

现在我尝试在Windows7上使用相同的代码,但它不起作用。问题是,每当我尝试设置注册表值时,它都会失败,并出现错误\u BADKEY;即使regedit也无法修改值,因此我的代码没有问题。我对其运行了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,但我想不出答案,所以我尝试了更多的Google。过了一会儿,我发现这解释了RegSetValueEx的行为。因为它提到修改系统文件,这让我想到也许这个特定的注册表数据是由一个映射文件支持的。然后我在system32文件夹中发现了提到Perfc009.dat和Perfh009.dat的内容。在一个十六进制编辑器中打开这些文件,可以肯定的是,我正试图修改的是原始REG_MULTI_SZ数据。现在我知道也许我可以再看一眼,弄清楚它,尽管我现在已经厌倦了。

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