如何通过使用 64 位版本 Windows 查看系统注册表 WOW6432Node
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 位版本的注册表编辑器,请按照下列步骤操作:
-
单击“开始”,然后单击“运行”。 在“打开”框中,键入
%systemroot%\syswow64\regedit,然后单击“确定”。
注意:除非使用 -m 开关启动注册表编辑器的第二个实例,否则,必须先关闭 64 位版本的注册表编辑器,然后才能打开 32 位版本的注册表编辑器(反之亦然)。例如,如果 64 位版本的注册表编辑器已经在运行,在第 2 步键入 %systemroot%\syswow64\regedit -m 可启动 32 位版本的注册表编辑器。
反射的注册表项
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原先一个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注册) ,并使用最后一个作家胜的方式解决任何冲突。