我正在尝试注册性能计数器,此过程的一部分包括向特定注册表项添加一些文本描述。对于英语,此键为HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Perflib \ 009,显然也称为HKEY_PERFORMANCE_TEXT。那里有一对值(Counter,Help)有REG_MULTI_SZ数据,我需要修改它们才能实现我的目标。
这样做的官方方法是使用tool called lodctr along with a .h and .ini file。还有一个function for doing this programmatically,但我的理解是它只是一个关于调用lodctr程序的简单包装器。我发现维护,分发和保持同步3个单独文件的前景有点麻烦,所以我之前编写了代码来执行此操作,它在Windows XP下运行良好(可能还有Vista,但我不记得确定)。 / p>
现在我正在尝试在Windows 7上使用相同的代码,但它不起作用。问题是,每当我尝试设置注册表值时,它都会失败并显示ERROR_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。过了一会儿,我遇到了this KB article,它解释了RegSetValueEx的行为。因为它提到修改系统文件让我认为这个特定的注册表数据可能是由映射文件支持的。然后我遇到了another KB article,提到了system32文件夹中的Perfc009.dat和Perfh009.dat。在十六进制编辑器中打开它们,确定它是我试图修改的原始REG_MULTI_SZ数据。现在我知道也许我可以再看看并弄清楚,虽然我现在很厌烦它。
答案 0 :(得分:2)
没关系,我放弃了。流程更容易。我不会尝试直接修改注册表,而是以编程方式创建.h和.ini文件并调用相关函数。