如何从32位进程访问64位注册表?

时间:2014-01-10 03:58:20

标签: c++ registry x86-64 win64 wow64

我有一个与资源管理器上下文菜单集成的程序。它在Win32中正常工作,但在Win64中不能正常工作。我已经将shell扩展编译为Win64,但现在我要注册

主程序的DLL文件是32位,我也希望将主程序保持为32位。

我想访问Wow6432NodeHKEY_CLASS_ROOT下的CLSID密钥。我使用了RegDisableRef,但它不起作用

1 个答案:

答案 0 :(得分:0)

就像files are redirected by WoW64一样,注册表访问也被重定向

  

注册表重定向程序通过在WOW64上提供注册表某些部分的单独逻辑视图来隔离32位和64位应用程序。注册表重定向器拦截对其各自逻辑注册表视图的32位和64位注册表调用,并将它们映射到相应的物理注册表位置。重定向过程对应用程序是透明的。因此,即使数据存储在64位Windows上的其他位置,32位应用程序也可以访问注册表数据,就像它在32位Windows上运行一样。

     

Registry Redirector

使用KEY_WOW64_64KEYsamDesiredRegCreateKeyEx

访问64位注册表项时,需要在RegDeleteKeyEx参数上指定RegOpenKeyEx
  

以下标志使32位应用程序可以访问64位注册表视图中的重定向键,而64位应用程序可以访问32位注册表视图中的重定向键。这些标志对共享注册表项没有影响。有关更多信息,请参阅受WOW64影响的注册表项。

Flag name        Value   Description
KEY_WOW64_64KEY  0x0100  Access a 64-bit key from either a 32-bit or 64-bit application.
KEY_WOW64_32KEY  0x0200  Access a 32-bit key from either a 32-bit or 64-bit application.
                         Windows 10 on ARM: This refers to the 32-bit ARM registry view
                         for 32-bit ARM processes and the 32-bit x86 registry view for
                         32-bit x86 and 64-bit ARM64 processes.
     

Accessing an Alternate Registry View

但是我认为在单独的32位和64位版本中编译程序会更容易。重新编译时,大多数程序不需要更改。此外,您仍然需要重新编译shell扩展,因为64-bit processes can't load 32-bit DLLs