开发X64位系统,不但包含差异,如果使用注册表,注册表也是不同的。

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

如何通过使用 64 位版本 Windows 查看系统注册表 WOW6432Node

作者:sdujq | 2011/8/28 14:48:49 | 阅读 103
64 位版本  Windows 中的 注册表分为 32 位注册表项和 64 位注册表项。许多 32 位注册表项与其相应的 64 位注册表项同名,反之亦然。

64 位版本 W indows 包含的默认 64 位版本注册表 编辑器 (Regedit.exe) 可显示 64 位和 32 位的 注册表项。WOW64 注册表 重定向器为 32 位程序 提供了对应于 32 位程序注册表项的不同注册表项。在 64 位版本的注册表 编辑器中,32 位注册表项显示在以下注册表项下:  HKEY_LOCAL_MACHINE\Software\WOW6432Node使用默认的 64 位版本注册表编辑器, 可以查看或编辑 64 位和 32 位的注册表项和项值。要查看或编辑 64 位注册表项, 必须使用 64 位版本的注册表编辑器 (Regedit.exe)。还可以使用 %systemroot%\Syswow64  文件夹中的 32 位版本注册表编辑器查看或编辑 32 位注册表项和项值。在 32 位版本注册表编辑器中 执行任务的方式与 64 位版本注册表编辑器没有区别。要打开 32 位版本的注册表编辑器,请按照下列步骤操作:
  1. 单击“开始”,然后单击“运行”。 在“打开”框中,键入  %systemroot%\syswow64\regedit,然后单击“确定”。

    注意:除非使用  -m 开关启动注册表编辑器的第二个实例,否则,必须先关闭 64 位版本的注册表编辑器,然后才能打开 32 位版本的注册表编辑器(反之亦然)。例如,如果 64 位版本的注册表编辑器已经在运行,在第 2 步键入  %systemroot%\syswow64\regedit -m 可启动 32 位版本的注册表编辑器。
为了支持 32 位和 64 位 COM 注册和程序状态的共存,WOW64 为 32 位程序提供了一种备用注册表视图。32 位程序会看到与真正的 64 位  HKEY_LOCAL_MACHINE\Software 树完全分开的 32 位  HKEY_LOCAL_MACHINE\Software 树 ( HKEY_LOCAL_MACHINE\Software\WOW6432Node)。这样可以隔离  HKEY_CLASSES_ROOT,因为此树的每个计算机部分驻留在以下注册表项内:  HKEY_LOCAL_MACHINE\Software为了通过 COM 和其他机制实现 64 位/32 位程序互操作性,WOW64 使用了一个“注册表反射器”来在 64 位注册表视图和 32 位注册表视图之间镜像某些注册表项和项值。该反射器是“ 智能”的,因为它只反射 COM 激活 数据

反射的注册表项

WOW64 注册表反射器可能会在反射 过程修改注册表项的 内容和项值,目的是为了 调整 路径名等。因此,32 位的内容与 64 位的内容可能会有所不同。下面的注册表项会被反射:  HKEY_LOCAL_MACHINE\Software\Classes HKEY_LOCAL_MACHINE\Software\COM3 HKEY_LOCAL_MACHINE\Software\Ole HKEY_LOCAL_MACHINE\Software\EventSystem HKEY_LOCAL_MACHINE\Software\RPC

C++ 操作64位系统,默认读取Wow6432Node子键的解决方法。

原先一个win32程序好好地,由于组里不少人用了win 7 64位操作系统,指出原程序有bug,程序不能在64位的操作系统上跑。搞了很久,后来网上搜到一些资料说:64位的操作系统:

xp下具体的程序在电脑中的位置位于:
HKEY_LOCAL_MACHINE\SOFTWARE
vista中是位于
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node
如果你在vista64下面依然访问如下位置,
HKEY_LOCAL_MACHINE\SOFTWARE
你得到的其实就是vista下
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node
的列表。
这其中其实是WOW进行了转换。其中并给出了判断64位还是32位平台的函数:
IsWow64返回TRUE则是64位系统,否则为32位系统。
code如下:VC测试通过
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
LPFN_ISWOW64PROCESS fnIsWow64Process; 
BOOL IsWow64() 

    BOOL bIsWow64 = FALSE; 
    fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress( 
        GetModuleHandle(TEXT("kernel32")),"IsWow64Process"); 
    if (NULL != fnIsWow64Process) 
    { 
        if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64)) 
        { 
            // handle error 
            AfxMessageBox("IsWow64 error!"); 
        } 
    }
    return bIsWow64; 
}

  

   然而,奇怪的是:当我们判断为: IsWow64()时,我便将注册表的地址必为:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\我要读的程序名

  依然读取不成功。后来请教了一位老同事,他说这种问题,应该看微软的最新的msdn。随即搜了搜,发现:

Do not try to open Wow6432Node to view the alternate registry hive in 32-bit code. Instead open the desired branch (e.g., HKLM\Software\Microsoft\xxx) with the KEY_WOW64_64KEY flag as shown above.

意思是说:访问时,不要去打开Wow6432Node ,而应在API里使用 KEY_WOW64_64KEY 。

 

 

 

 最后,在64位的机器上跑时,使用KEY_WOW64_64KEY标识:

retCode = RegCreateKeyEx(HKEY_LOCAL_MACHINE,subKeyName.c_str(), 0, NULL, REG_OPTION_NON_VOLATILE,
   KEY_EXECUTE|KEY_WOW64_64KEY, NULL, &hkey, NULL);

问题果然解决了!

         加油!征途才刚刚开始!

Wow6432注册表项表明你正在运行64位版本的Windows 。操作系统使用此密钥为32位的64位版本的Windows上运行的应用程序提出HKEY_LOCAL_MACHINE \软件的一个单独的视图。当32位应用程序查询下一个值在HKEY_LOCAL_MACHINE \ SOFTWARE \ <company> \ < ...子项,应用程序读取的HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ ...子项。下图显示了下的Wow6432Node结构, 32位应用程序将看到。一个“注册表反射器”复制某些值之间的32位和64位注册表视图(例如,主要用于COM注册) ,并使用最后一个作家胜的方式解决任何冲突。
Windows 注册表 64操作系统上的注册表 文件系统重定向 UAC 注册表重定向 SysWoW64 注册表存放注册表跟环境变量   64操作系统 在64的操作系统中有64版本的注册表编辑器以及32版本的注册表编辑器,64版本的注册表在C:\Windows\regedit.exe,32版本的在C:\Windows\SysWow64\regedit.exe。 注册表中的内容主要分为系统 阅读详情

相关推荐

25、64 调试与 Windows x64 系统全解析

本文深入解析了64调试与Windows x64系统的各个方面,涵盖自定义调试器扩展、WOW64仿真机制、调试工具的使用差异、寄存器与调用约定变化、异常调度模型、内存结构及安全机制等内容。详细探讨了在x64架构下调试原生应用与32兼容应用的技术挑战与解决方案,并提供了调试流程、最佳实践及常见问题应对策略,是掌握现代Windows平台高级调试技术的全面指南。

ipfs8storage的博客 141

Windows重定向技术【文件重定向与注册表重定向】

Windows重定向技术【文件重定向、注册表重定向】

4213

Windows 64操作系统和32操作系统注册表上的有一点不一样

Windows64操作系统为提供对32应用程序的兼容,在“C:\Windows\SysWOW64”目录下保留了很多32的工具(如CMD.exe是32的)。在Windows64操作系统上跑三十二应用程序,操作注册表,搜素目录时,微软通过反射(Reflector),会将“\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall”...

weixin_30555515的博客 258

读取注册表的方法

最近在做一些关于注册表的程序,发现原来读取注册表都是大有讲究的,所以就想写一篇文章来记录下来。 一、操作系统 32Windows操作系统已经非常罕见了,现在主流的操作系统是64Windows。64系统为了兼容32的应用程序,内置了一套模拟32的子系统,它就是WOW64 (Windows-on-Windows 64-bit)。但是64系统对于x64和Win32程序是分别对待的,注册表就是一个例子。 二、注册表视图 下面我们分别以x64方式(系统默认)和Win32的方式打开注册表编辑器

RainbowPY的博客 3265

64系统重定向

折腾了几回机器,才明白x64上有x64、x86两种注册表,记录下。  //z 2012-2-9 17:40:19 IS2120@CSDN 32注册表被重定向为HKEY_LOCAL_MACHINE\Software\WOW6432Node 关于64Windows操作系统中的注册表 修改注册表之前,一定要先进行备份,并且要知道在发生问题时如还原注册表

xringm的博客 3175

64和32驱动开发差异

64系统新增机制 1. WOW64子系统 WOW64子系统是64系统为了兼容32应用程序而新增的子系统。相当于一个轻量级的兼容层,主要在应用层工作,由三个DLL实现,Wow64.dll、Wow64Win.dll、Wow64Cpu.dll。 当一个32应用程序发起系统调用时,WOW64子系统会拦截到这个系统调用,如果其中包含指针,它会先把这些指针的长度转换成合适的长度,然后再把系统调用提交给内核。 通常把这个拦截—转换的过程称为thunking,它是32应用程序能运行在64系统下的关键。 WOW6

qq_42814021的博客 1910

C#操作注册表32&64系统

简要复述一下理论基础:微软为了让32程序不做任修改就能运行在64的操作系统上,添加了一个十分重要的WOW64子系统来实现这个功能,WOW64是Windows-32-on-Windows-64的简称,从总体上来说,WOW64是一套基于用户模式的动态链接库,它可以把32应用程序的发出的命令翻译成64系统可以接受的格式,即:WOW 层处理诸如在 32 和 64 模式之间切换处理器以及模拟 32 系统的事务。文件系统:32进程不能加载64Dll,64进程也不可以加载32Dll。

weixin_53370274的博客 892

64电脑c语言程序下载,vc2010 x64

vc2010 x64全称为microsoft visual c++ 2010 Redistributable Package (x64),vc2010是微软针对64操作系统开发一款运行库文件,此文件是很多软件或游戏必不可少的,如果缺少vc2010可能会造成软件或游戏不能正常运行。Microsoft Visual C++ 2010是安装 Visual C++ 库的运行时组件,使用户能够在未安装...

weixin_36272668的博客 2167

32与64系统差异Windows应用实践

计算机体系结构中,32与64系统的核心差异在于CPU数据处理能力与内存寻址空间。32系统受限于4GB内存寻址,而64系统理论上支持16EB内存空间,显著提升了大型应用运行效率。x86与x64指令集架构的演进带来了兼容性设计,使64系统能无缝运行32程序。在Windows系统中,这种差异体现在Program Files目录分离、注册表重定向等机制上。对于开发者而言,理解指针大小、数据类型变化对编程的影响至关重要。随着Windows 11等现代操作系统全面转向64,掌握系统架构差异对软件开发、硬件

weixin_33824385的博客 304

C# 32/64程序读写注册表差异

用C#实现注册表的读\写是一件很容易的事情,在此不做详细的讲解。 用C#操作注册表主要用到的两个函数为(已经渗透到下面的实例程序中,注:要引入Microsoft.Win32命名空间): 1:读取键值-->Registry.LocalMachine.OpenSubKey(“..Key的路径...”, true),这里的第2个bool类型的参数含义为:标志打开的键值是否可以更改(即:是否可

紫声潇潇 3050

C# 32/64系统下程序读写注册表差异

C# 32/64程序读写注册表差异 用C#实现注册表的读\写是一件很容易的事情,在此不做详细的讲解。 用C#操作注册表主要用到的两个函数为(已经渗透到下面的实例程序中,注:要引入Microsoft.Win32命名空间): 1:读取键值-->Registry.LocalMachine.OpenSubKey(“..Key的路径...”, true),这里的第2个bool类型的参数含义为:标

斌哥的博客 1781

Windows上读取注册表与操作系统版本关系

最近接到一个小需求是提供一个公司产品的卸载工具,因为前段时间刚好写过类似的powershell脚本,大概流程是读取Windows注册表获取产品安装路径,调用安装目录下工具关闭自保护、停用用户态服务、在“HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall”路径查询产品GUID,然后调用msiexec工具完成卸载。

weixin_44034389的博客 662

32程序 是如运行在 64Windows 系统上的?

加粗样式WOW64是让32应用程序能够在64Windows操作系统上无缝运行的关键。它利用CPU的模式切换能力,通过系统调用转换、文件系统注册表重定向以及其他技术手段来实现这一目标。过程中存在一些性能损耗,但在大多数情况下,这种损耗对用户体验的影响不大。例如我们常用的许多软件(如QQ、WPS等)都依然是32软件,而在使用过程中几乎感觉不到性能的变化。长远来看,随着越来越多的应用程序原生支持64WOW64的依赖将逐渐减少,直到32应用程序最终淡出市场。

hebhljdx的博客 6934

VS2010和VS2008使用不同编译方式在64机器生成注册表对比

最近写一个小工具用到了使用C#来进行注册表的操作,使用C#来进行注册表的操作需要引入命名空间Microsoft.Win32,关于操作注册表的帮助类可以参考RegHelper.cs。下面分别使用VS2010和VS2008使用Any CPU、X64、X86和Itanium进行编译,运行在32机器和64机器进行对比。看下面一段代码: stringsubkey=@"sof...

weixin_33971130的博客 170

x86 x64 开发区别与注意事项

Windows上面32与64的区别有: 1.指针大小的区别,sizeof(int *)在32bit下面是4个字节,在64bit下面是8个字节 2.size_t的区别,size_t在32bit下面是4个字节的范围,在64bit下面是8个字节的范围 3.地址空间的区别,在

Orlando的积累知识库 2914

C# 32程序与64程序读\写注册表的区别

用C#实现注册表的读\写是一件很容易的事情,在此不做详细的讲解。   用C#操作注册表主要用到的两个函数为(已经渗透到下面的实例程序中,注:要引入Microsoft.Win32命名空间):       1:读取键值-->Registry.LocalMachine.OpenSubKey(“..Key的路径...”, true),这里的第2个bool类型的参数含义为:标志打开的键值是否可以

专注.Net开发、安卓开发、智能家居、物联网应用及项目管理 1039

32与64PowerShell深度解析:架构差异与实战指南

32与64PowerShell关键差异解析:1)架构层面,64支持更大内存(16EB)和更宽寄存器;2)路径差异,64于System32,32在SysWOW64;3)内存限制,32仅2-3GB用户空间;4)系统重定向机制(WoW64)使32程序访问System32时自动转向SysWOW64。实战建议:处理大内存任务必须使用64,兼容旧组件时需注意重定向问题,可通过[Environment]::Is64BitProcess检测当前架构。

Bruce_xiaowei的博客 877
上一篇: 都有那些测试名词。
下一篇: MonoDevelop开发笔记,c#中类的默认访问修饰符,是private还是internal
鹧鸪菜
博客等级 码龄20年 330粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值