当前位置:首页 > c++ > 正文内容

注册表重定向器(64位系统注册表WOW6432Node节点有什么用?)

xuwenyan1年前 (2022-07-27)c++1601

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

注册表重定向就是重定向的密钥映射到 Wow6432Node 下的物理位置。 例如, HKEY_LOCAL_MACHINE\Software 重定向到 HKEY_LOCAL_MACHINE\Software\Wow6432Node。关于注册表重定向器参阅微软文档:注册表重定向程序

以在HKEY_LOCAL_MACHINE\Software创建test节点为例

image.png

如果以32位编译运行,创建在:

计算机\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\test

如果以64位编译运行,创建在:

计算机\HKEY_LOCAL_MACHINE\SOFTWARE\test

这就是受到注册表重定向影响的效果,那么如何强制访问其它平台的注册表呢?比如32位访问64位注册表。

软文档里有写到 系统应考虑重定向密钥的物理位置。 应用程序不应直接访问密钥的物理位置,因为此位置可能会更改。 有关详细信息,请参阅 访问备用注册表视图

也就是说,通过添加备用注册表标志即可访问其它平台的注册表位置。

备用注册表视图

标志名称说明
KEY_WOW64_64KEY0x0100从 32 位或 64 位应用程序访问 64 位密钥。
KEY_WOW64_32KEY0x0200从 32 位或 64 位应用程序访问 32 位密钥。
ARM 上的Windows 10:这指的是 32 位 ARM 进程的 32 位 ARM 注册表视图,以及 32 位 x86 和 64 位 ARM64 进程的 32 位 x86 注册表视图。

如何使用备用注册表

由上面例子我们可以知道,32位程序访问HKEY_LOCAL_MACHINE\SOFTWARE\会被重定向到HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\,那么32程序如何强制访问64位程序的注册表呢?

方法就是访问注册表时加上,KEY_WOW64_64KEY标志:

int main() {
  HKEY hkey = nullptr;
  DWORD dwDisposition = REG_CREATED_NEW_KEY;
  HRESULT ret = ::RegCreateKeyEx(HKEY_LOCAL_MACHINE, L"Software\\test", 0, nullptr, 0, 
    KEY_ALL_ACCESS | KEY_WOW64_64KEY, nullptr, &hkey, &dwDisposition);
  if (ret != ERROR_SUCCESS || !hkey)
    return 0;

  ::RegCloseKey(hkey);

  return 0;
}

以32位编译运行:

image.png

可以看到访问的是64位的注册表位置

反过来如果是64位程序需要强制访问32位注册表加上KEY_WOW64_32KEY标志即可,此时将会访问HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\位置,也就是32位程序原有的位置。

受 WOW64 影响的注册表项

微软文档地址:受 WOW64 影响的注册表项

KeyWindows Server 2008 R2, Windows 7, and NewerWindows Server 2008, Windows Vista, Windows Server 2003, and Windows XP
HKEY_LOCAL_MACHINESharedShared
HKEY_LOCAL_MACHINE\SOFTWARERedirectedRedirected
HKEY_LOCAL_MACHINE\SOFTWARE\ClassesSharedRedirected and reflected
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppidSharedRedirected and reflected with one exception: the DllSurrogate and DllSurrogateExecutable registry values are not reflected if their value is an empty string.
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSIDRedirectedRedirected and reflected only for CLSIDs that do not specify InprocServer32 or InprocHandler32.
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\DirectShowRedirectedRedirected and reflected
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\HCPSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\InterfaceRedirectedRedirected and reflected
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Media TypeRedirectedRedirected and reflected
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MediaFoundationRedirectedRedirected and reflected
HKEY_LOCAL_MACHINE\SOFTWARE\ClientsSharedRedirected
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\COM3SharedRedirected and reflected
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Calais\CurrentSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Calais\ReadersSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\ServicesSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\CTF\SystemSharedSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\CTF\TIPSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DFSSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Driver SigningSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\EnterpriseCertificatesSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\EventSystemSharedRedirected and reflected
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSMQSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Non-Driver SigningSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Notepad\DefaultFontsSharedRedirected
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\OLESharedRedirected and reflected
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RASSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RPCSharedRedirected and reflected
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SOFTWARE\Microsoft\Shared Tools\MSInfoSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificatesSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\TermServLicensingSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\TransactionServerSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App PathsSharedRedirected
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Control Panel\Cursors\SchemesSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlersSharedRedirected
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\DriveIconsSharedRedirected
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\KindMapSharedRedirected
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group PolicySharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\PoliciesSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\PreviewHandlersSharedRedirected
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SetupSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\LocationsSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ConsoleSharedRedirected
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontDpiSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLinkSharedRedirected
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontMapperSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontsSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutesSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Gre_InitializeSharedRedirected
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution OptionsSharedRedirected
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Language PackSharedRedirected
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCardsSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PerflibSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PortsSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PrintSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileListSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time ZonesSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\PoliciesSharedShared
HKEY_LOCAL_MACHINE\SOFTWARE\RegisteredApplicationsSharedShared; Windows Server 2003 and Windows XP: This key was added in Windows Vista.
HKEY_CURRENT_USERSharedShared
HKEY_CURRENT_USER\SOFTWARESharedShared
HKEY_CURRENT_USER\SOFTWARE\ClassesSharedRedirected and reflected
HKEY_CURRENT_USER\SOFTWARE\Classes\AppidSharedRedirected and reflected with one exception: the DllSurrogate and DllSurrogateExecutable registry values are not reflected if their value is an empty string.
HKEY_CURRENT_USER\SOFTWARE\Classes\CLSIDRedirectedRedirected and reflected
HKEY_CURRENT_USER\SOFTWARE\Classes\DirectShowRedirectedRedirected and reflected
HKEY_CURRENT_USER\SOFTWARE\Classes\InterfaceRedirectedRedirected and reflected
HKEY_CURRENT_USER\SOFTWARE\Classes\Media TypeRedirectedRedirected and reflected
HKEY_CURRENT_USER\SOFTWARE\Classes\MediaFoundationRedirectedRedirected and reflected


    文章作者:xuwenyan
    版权声明:本文为本站原创文章,转载请注明出处,非常感谢,如版权漏申明或您觉得任何有异议的地方欢迎与本站取得联系。

    扫描二维码推送至手机访问。

    版权声明:本文由艺文笔记发布,如需转载请注明出处。

    本文链接:https://www.xuwenyan.com/archives/2786

    分享给朋友:

    “注册表重定向器(64位系统注册表WOW6432Node节点有什么用?)” 的相关文章

    C++智能指针基本原理

    C++智能指针基本原理

    什么是智能指针?最简单来说就是会自动释放内存的指针,使用方便,不用担心内存泄漏问题。它其实就是通过封装,利用对象的析构函数释放申请的内存,基本上自动释放的用法都是利用析构函数去做一些释放工作。如:自动释放的句柄智能指针的基本实现class TestClass {  p...

    C++如何获取控制台程序的输出内容?

    C++如何获取控制台程序的输出内容?

    很多工具程序(如ffmpeg)的进度显示往往都是以控制台字符显示的方法,我们可能需要调用这种控制台工具去完成工作,但同时又希望以友好的ui界面去显示当前的工作状态(如进度)。此时我们能想到的就是运行控制台程序,然后以某种方式去获取到控制台程序的输出,然后转换到我们的ui界面上去显示。 有多种...

    使用GDI、MFC_GDI、GDI+绘制数组RGBA序列

    使用GDI、MFC_GDI、GDI+绘制数组RGBA序列

    学习ffmpeg时遇到一个问题,ffmpeg解码出RGB颜色后怎么绘制到屏幕上,于是将GDI、MFC_GDI、GDI+等方式都记录一下 1:注意按windows的要求,R、G、B、A顺序要调整为B、G、R、A 。 2:GDI不支持透明通道A,透明通道A的值读进去以后没有作用。想要支持透...

    VC的ATL工程向导同时生成一个PS工程是做什么的?可以不要吗?

    VC的ATL工程向导同时生成一个PS工程是做什么的?可以不要吗?

    例如,我用VC2015的工程向导新建一个ATL的工程名字叫myAtl,那么VC会同时给我生成一个叫做myAtlPS的工程。这个myAtlPS工程是做什么的?什么情况下可以不需要它?什么情况下它又是必须存在的? PS工程是什么?可以不要吗? 这个PS工程叫做代理与存根(proxy&nbs...

    解决程序在xp系统总是莫名奇妙的崩溃问题(/Zc:threadSafeInit- )

    解决程序在xp系统总是莫名奇妙的崩溃问题(/Zc:threadSafeInit- )

    现象:程序在xp系统上面总是莫名其妙的崩溃,检查代码看不出任何问题,感觉代码都很好。即使你远程调试,找到了崩溃的点,当你注释了崩溃点之后,还是会崩溃到别的地方。当你遇到了这种情况的时候,不妨参照一下下面的方法看看,说不定可以解决问题。如何解决?将崩溃程序相关的所有工程代码全部关闭全局变量的线程安全检...

    ATL实现windows右键菜单扩展(ContextMenu)

    ATL实现windows右键菜单扩展(ContextMenu)

    右键菜单,即用户右击shell对象时弹出的上下文菜单(context menu)。本文记录了如何创建右键菜单的基本过程,跟着步骤一步一步来,即可创建出一个右键菜单工程。第一步,新建一个ATL工程Visual Studio—>新建项目—>ATL—>使用默认配置(一直按下一步即可)。注...