winapi - 使用 NtOpenKey 时重定向注册表访问的正确方法是什么?

我正在处理的代码同时包含 32 位和 64 位组件,它们需要在注册表中共享信息。因此,我在使用 NtOpenKey 函数(相当于 ZwOpenKey 的用户模式)时尝试控制注册表重定向 - 我需要从 64 位代码调用此函数但访问32 位注册表。 (代码过去只有 32 位,现在升级到 64 位,所以我更愿意使用尽可能多的现有代码——这就是说我不想重写所有内容以使用 RegOpenKeyEx.)

自然地,NtOpenKey 无法识别 KEY_WOW64_32KEY 访问标志,这与高级注册表函数不同,因此无法指定重定向。

此时我能想到的唯一解决方案是在访问注册表时在键名中显式硬编码Wow6432Node;像这样的东西:

\Registry\Machine\Software\Wow6432Node\MyCompanyKey\MyKey

不幸的是,这更像是一种 hack,Microsoft 特别不鼓励这样做。

这个问题有正确的解决方法吗?通读文档没有帮助,我也找不到任何相关的搜索结果。

编辑:只是一些额外的细节:我需要支持 Windows Server 2003 32 位/64 位、Windows 7/8 和 Windows Server 2008 32 位/64 位。 (基本上所有从 Windows Server 2003 + Windows 7 及以上版本开始的服务器版本。)

最佳答案

native API 不提供与 KEY_WOW64_32KEY 等效的功能。您的选择是:

  1. 使用 Win32 API。
  2. 坚持使用原生 API 并对路径进行硬编码。
  3. 混合使用 Win32 和 native API。使用 Win32 API 以 KEY_WOW64_32KEY 打开 HKLM\Software。然后调用 NtQueryKey 找出 key 的 native 名称。然后从那里开始使用 native API。这解决了您对硬编码的反对意见。

选项 3 听起来似乎有道理,但我从未调用过 NtQueryKey,甚至不能确定这个想法是否有效。

https://stackoverflow.com/questions/13239049/

相关文章:

ruby-on-rails - 在 rails 3 中连接两个表

google-chrome - "Extension Install Failure: Packag

authentication - 如何使用 JavaMail 调试 SMTP 身份验证错误?

c# - 将 DependencyProperty 转发到用户控件中包含的控件

.net - 即使所有新发布者都有签名证书,未知发布者警告是否真的会出现?

php - 在 foreach 循环中使用数组变量

python - 将 Python 正则表达式用于 Twitter 数据

c# - 执行相机预览镜像模式的正确方法

python - 从 `scipy.ndimage.map_coordinates` 输出向量/数组

python - 组装字节码 - PyCode New