You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

读取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 17:42:47