在运行的 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/