gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:28:14 27 4
gpt4 key购买 nike

我正在尝试注册一个性能计数器,这个过程的一部分包括向特定的注册表项添加一些文本描述。对于英语,此 key 是 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,但我记不太清了)下运行良好。

现在我试图在 Windows 7 上使用相同的代码,但它不起作用。问题是,每当我尝试设置注册表值时,它都会因 ERROR_BADKEY 而失败;即使 regedit 也无法修改这些值,所以这不是我的代码的问题。我针对它运行 Process Monitor 并注意到在驱动程序级别没有任何事件,因此看来此访问必须在用户模式代码(例如 advapi32.dll 或任何地方)中被阻止。我理解为什么 Microsoft 会试图阻止人们这样做,因为它很容易搞砸,而且这样做会搞砸机器上的整个性能计数器集合。

我打算调试 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 数据。现在我知道也许我可以再看一眼并弄明白,尽管我现在对此感到厌烦。

最佳答案

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

关于windows - 以编程方式在注册表中注册性能计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7532767/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com