读取HKEY_PERFORMANCE_DATA注册表键遇ERROR_INVALID_HANDLE错误求助
问题描述
我尝试读取NT内部维护的系统性能数据,这类数据会在打开特殊注册表键时被复制到对应注册表位置。但调用RegOpenKeyEx函数打开HKEY_PERFORMANCE_DATA下的"Global"键时,程序返回错误码0x6(对应Windows系统错误码ERROR_INVALID_HANDLE)。我认为读取该注册表键无需特殊权限,想请教问题出在哪里。
相关C语言代码如下:
#include <stdio.h> #include <windows.h> #include <winreg.h> int main() { HKEY hKey; DWORD dataType; BYTE* buffer = NULL; DWORD bufferSize = 0; LSTATUS lResult = RegOpenKeyEx(HKEY_PERFORMANCE_DATA, "Global", 0, KEY_READ, &hKey); if (lResult != ERROR_SUCCESS) { if (lResult == ERROR_FILE_NOT_FOUND) { printf("Key not found.\n"); return TRUE; } else { printf("Error opening key. %02x\n", lResult); return FALSE; } } }
程序输出:
Error opening key. 06
问题原因与解决方法
HKEY_PERFORMANCE_DATA是特殊虚拟键,不支持常规子键打开操作:这个根键并非真实存储在注册表文件中,是Windows提供的虚拟性能数据接口,仅支持RegQueryValueEx直接查询值,不能用RegOpenKeyEx打开其子键,这是触发ERROR_INVALID_HANDLE错误的核心原因。- 正确获取性能数据的方式:直接在
HKEY_PERFORMANCE_DATA根键上调用RegQueryValueEx,将"Global"作为值名称传入,而非尝试打开它作为子键。 - 修正后的示例代码:
#include <stdio.h> #include <windows.h> #include <winreg.h> #include <stdlib.h> int main() { HKEY hKey = HKEY_PERFORMANCE_DATA; DWORD dataType; BYTE* buffer = NULL; DWORD bufferSize = 0; // 先查询所需缓冲区大小 LSTATUS lResult = RegQueryValueExW(hKey, L"Global", NULL, &dataType, NULL, &bufferSize); if (lResult == ERROR_MORE_DATA) { buffer = (BYTE*)malloc(bufferSize); if (buffer != NULL) { lResult = RegQueryValueExW(hKey, L"Global", NULL, &dataType, buffer, &bufferSize); if (lResult == ERROR_SUCCESS) { printf("成功获取Global性能数据\n"); // 需按照Windows性能数据格式解析buffer中的二进制数据 } else { printf("查询数据失败,错误码: %02x\n", lResult); } free(buffer); } else { printf("内存分配失败\n"); } } else { printf("查询缓冲区大小失败,错误码: %02x\n", lResult); } return 0; }
- 额外说明:
HKEY_PERFORMANCE_DATA返回的是结构化二进制数据,直接读取无法直接使用,建议使用**Performance Data Helper (PDH)**系列API来处理性能数据,会更简便且不易出错。
内容的提问来源于stack exchange,提问作者vibhav950
相关产品推荐
相关产品推荐

