c++ - 检测键是否是加载/安装的注册表配置单元的根

标签 c++ c windows registry

在运行的 Windows 中,我如何通过自己的 C/C++ 程序确定某个键是否是注册表配置单元的“挂载点”,即根目录?

通过RegLoadKey()和底层的 NT native 函数(ZwLoadKey 又名 NtLoadKey 来自用户模式)可以加载/安装配置单元。

有没有办法在给定 key (句柄或路径)的情况下确定该 key 是注册表配置单元的根还是“挂载点”?

为了清楚起见,我知道 \Registry(对象管理器命名空间)中的许多键是加载的配置单元内部的子键。但我想了解某个特定键是否代表已加载配置单元的 root。所以我知道一个键的名称,并且我想通过任何方式查明 Windows 必须提供该键是否是已加载配置单元的根。

展示如何为给定键找出磁盘上已加载配置单元的相应文件路径的加分项。

注意:我不关心是否需要 Win32 API 或 NT native API 来实现此目的。我只是直接寻找实现这一壮举的方法。

最佳答案

有一种间接方法可以检查这一点 - 调用未记录的 NT native API 函数 ZwQueryOpenSubKeys:

EXTERN_C
NTSYSCALLAPI
NTSTATUS
NTAPI
ZwQueryOpenSubKeys(
    _In_ POBJECT_ATTRIBUTES TargetKey,
    _Out_ PULONG HandleCount
);

根据以下line从 WRK 代码我们可以假设在 key 不是根单元格的情况下,API 返回 STATUS_INVALID_PARAMETER。如果 STATUS_SUCCESS 返回,这是配置单元的根单元格。对于其他状态代码,我们无法判断它是否是 hive 的根。

示例代码:

enum { root, not_root, fail } IsRootCell(PCOBJECT_ATTRIBUTES poa)
{
    ULONG  HandleCount;
    switch (NtQueryOpenSubKeys(poa, &HandleCount))
    {
    case STATUS_SUCCESS:
        return root;
    case STATUS_INVALID_PARAMETER:
        return not_root;
    }

    return fail;
};

关于c++ - 检测键是否是加载/安装的注册表配置单元的根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51986659/

相关文章:

c++ - 在 C++ 中查找换行符

c - 是否所有指向连续内存块的指针都自动索引了?/不是这样的情况?

c - 如何在终止线程之前将线程数据复制到数组?

c++ - Windows默默捕捉到的异常,如何手动处理?

java - 设置外观时,JOptionPane 无效

c++ - asio : multiple pending async_read?

c++ - Qt:自定义插槽不起作用

c++ - C - 在控制台应用程序中使用鼠标和键盘,无需等待按任意键

c - 整数声明中的段错误

windows - 在 Windows 中为特定文件扩展名添加上下文菜单项