64为系统重定向
2016-03-24 14:51
239 查看
折腾了几回机器,才明白x64上有x64、x86两种注册表,记录下。
//z 2012-2-9 17:40:19 IS2120@CSDN
32位注册表被重定向为HKEY_LOCAL_MACHINE\Software\WOW6432Node
关于64位Windows操作系统中的注册表
64 位版本 Windows 中的注册表分为 32 位注册表项和 64 位注册表项。许多 32 位注册表项与其相应的 64 位注册表项同名,反之亦然。
//z 2012-2-9 17:40:19 IS2120@CSDN
64 位版本 Windows 包含的默认 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 位版本的注册表编辑器,请按照下列步骤操作:
为了支持 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 位注册表视图之间镜像某些注册表项和项值。该反射器是“智能”的,因为 //z
2012-2-9 17:40:19 IS2120@CSDN它只反射 COM 激活数据。
WOW64 注册表反射器可能会在反射过程中修改注册表项的内容和项值,目的是为了调整路径名等。因此,32 位的内容与 64 位的内容可能会有所不同。下面的注册表项会被反射:
什么是重定向
无论是Windows XP Professional X64 Edition、Windows Server 2003X64 Edition还是Windows Vista X64 Edition(以下把均统称为X64系统),都引入了一项技术:文件和注册表的重定向。
//z 2012-2-9 17:40:19 IS2120@CSDN
之所以有这个技术,是为了将32位程序和64位程序分离开。这种在64位平台上运行32位程序的模拟器被称为WOW64。WOW64是"Windows 32 on Windows 64"的简称,它在系统层中另提供了一层,以支持老式的32位程序。
在X64系统里面,一些特殊的目录和特殊的注册表键被分为2个独立的部分。对于文件系统来说,%systemroot%/system32 目录被保留给64位文件使用,而32位文件会被重定向到%systemroot%/SysWOW64目录。换句话说,所有的32位程序一般情况下只会出现在%systemroot%/SysWOW64目录里面。任何32位程序试图访问%systemroot%/system32 目录的企图都会被重定向到%systemroot%/SysWOW64目录。这个是一个默认的行为,除非程序的线程明确的指名需要关闭这种重定向机制。
//z 2012-2-9 17:40:19 IS2120@CSDN
对于注册表来说,也有类似的内容。WOW64子系统也提供了对注册表访问的重定向。如果是32位程序,对注册表的操作不论是读还是写, WOW64都将会截取对HKLM/Software访问,并重定向到HKLM/Software/Wow6432Node(即32位应用程序的注册信息被写在HKLM/Software/Wow6432Node中,而不是预期的HKLM/Software中);如果是64位程序,就直接到 HKLM/Software。
需要重定向的注册表项
注册表重定向,其实质就是维护两套不同的注册表键,一套用于64位,一套用于32位。受影响的键不只是上面提及的HKLM/Software,还包括:
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER/Software/Classes
HKEY_LOCAL_MACHINE/Software
HKEY_USERS/*/Software/Classes
HKEY_USERS/*_Classes
其中,64位程序的注册信息存储在上面的健中,32位程序的注册信息重定向存储在下列健中:
HKEY_CLASSES_ROOT/WOW6432node
HKEY_CURRENT_USER/Software/Classes/WOW6432node
HKEY_LOCAL_MACHINE/Software/WOW6432node
HKEY_USERS/*/Software/Classes/WOW6432node
HKEY_USERS/*_Classes/WOW6432node
//z 2012-2-9 17:40:19 IS2120@CSDN
当运行32位程序,wow64会截取程序对注册表HKLM/Software的访问,并重定向于HKLM/Software/Wow6432Node。
如前面所述,以上这些键会被维护2套,但是这2套键是如何维护的呢?其维护的方法是采用一种被称为注册表反射的机制完成的。
注册表反射
注册表反射是在64 位注册表视图和 32 位注册表视图之间复制某些特定的注册表项和项值。
如在X64系统中,我们在安装64位Microsoft Office后, 64位的Winword.exe将注册.doc这个扩展名并把这个扩展名关联到Winword.exe程序,根据X64的运行机制,64位程序修改的是64位的注册表键值,但是WOW64会自动的把这个修改会同步到32位的注册表键下面,这样32位和64位的应用程序都可以使用64位Winword.exe打开.doc文件。
但是,并不是所有的键值都会受到注册表反射机制的影响。实验证明,如果我们使用32位的注册表编辑器在HKEY_LOCAL_MACHINE/Software下新建一个项,然后使用64位的注册表编辑器查看,会发现这个项只会出现在HKEY_LOCAL_MACHINE/Software/Wow6432Node键下而不会出现在HKEY_LOCAL_MACHINE/Software键下,因为HKEY_LOCAL_MACHINE/Software键是专门用于存放64位程序所使用的注册表数据的,而HKEY_LOCAL_MACHINE/Software/Wow6432Node键是专门用于存放32位程序所使用的注册表数据的
注册表中受到反射机制影响的有:
HKEY_LOCAL_MACHINE/Software/Classes(32位XP下读写HKEY_CLASSES_ROOT/Rising.Rav.20会同时出现HKEY_LOCAL_MACHINE/Software/Classe/Rising.Rav.20,两者的值永远相同,似乎有一个是镜像,64位XP下读写HKEY_CLASSES_ROOT/Rising.Rav.20则会被重定向到HKEY_LOCAL_MACHINE/Software/Classe/Rising.Rav.20,并且由于注册表反射的原因,同时也会修改HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/Classes/Rising.Rav.20,两者的值同样是永远相同的。)
HKEY_LOCAL_MACHINE/Software/COM3
HKEY_LOCAL_MACHINE/Software/EventSystem
HKEY_LOCAL_MACHINE/Software/Ole
HKEY_LOCAL_MACHINE/Software/Rpc
HKEY_USERS/*/Software/Classes
HKEY_USERS/*_Classes
注册表重定向机制对系统的影响
由于注册表重定向机制存在,下列程序调用没有问题:
Ø 32位应用程序a调用32位应用程序b并访问b的注册表信息。由于注册表重定向机制,32位应用程序b的注册信息在HKLM/Software/Wow6432Node中,而32位应用程序a访问注册表也会被重定向到HKLM/Software/Wow6432Node中,所以访问正常;
Ø 64位应用程序a调用64位应用程序b并访问b的注册表信息。64位应用程序b的注册信息在HKLM/Software,64位应用程序a访问注册表时直接访问HKLM/Software,所以访问正常;
但是在下列情况时会出现问题:
Ø 64位应用程序调用32位应用程序并访问其注册表信息。
如瑞星杀软有U盘病毒查杀功能,在插入U盘后弹出的提示框中有瑞星杀毒的标志;但是在64位系统中,此项功能失效。这是因为32位瑞星将此项功能的注册信息写到了HKLM/Software/Wow6432Node下;而调用该功能的应用程序是64位的操作系统,由于64位操作系统访问注册表时直接访问HKLM/Software,所以没有读取到该功能的注册数据,该功能因而失效。
解决方法:在此功能写注册表时,32位瑞星应用程序要将该注册信息写到64位程序的注册表项中,即HKLM/Software下。
Ø 32位应用程序调用64位应用程序并访问其注册表信息。解决方法可以参上。
应用程序如何访问注册表
上文提到32位与64位应用程序分别访问注册表问题,下面总结一下:
64位程序如何访问64位的注册表(HKLM/Software)
Ø 64位程序访问64位的注册表,直接到 HKLM/Software。
32位程序如何访问32位的注册表(HKLM/Software/Wow6432Node)
Ø 32位程序访问32位的注册表, WOW64将会截取对HKLM/Software访问,并重定向到HKLM/Software/Wow6432Node
32位程序如何访问64位的注册表(HKLM/Software)
Ø 在调用函数RegCreateKeyEx创建注册表项时,对其第六个参数REGSAM samDesired设置中添加参数KEY_WOW64_64KEY,这样可以实现对64位注册表的访问;
Ø 在调用函数RegOpenKeyEx打开注册表项时,要对其第四个参数REGSAM samDesired设置中添加参数KEY_WOW64_64KEY,这样可以实现对64位注册表的访问;
64位程序如何访问32位的注册表(HKLM/Software/Wow6432Node)
Ø 在调用函数RegCreateKeyEx创建注册表项时,对其第六个参数REGSAM samDesired设置中添加参数KEY_WOW32_64KEY,这样可以实现对32位注册表的访问;
Ø 在调用函数RegOpenKeyEx打开注册表项时,要对其第四个参数REGSAM samDesired设置中添加参数KEY_WOW32_64KEY,这样可以实现对32位注册表的访问;
//z 2012-2-9 17:40:19 IS2120@CSDN
32位注册表被重定向为HKEY_LOCAL_MACHINE\Software\WOW6432Node
关于64位Windows操作系统中的注册表
修改注册表之前,一定要先进行备份,并且要知道在发生问题时如何还原注册表。 |
64位Windows操作系统中的注册表不同于32位Windows操作系统。如果您使用64位的Windows操作系统,如果发现一些程序运行不正常,比如很多需要手工导入*.reg的程序,请注意将注册表项导入到这里:HKEY_LOCAL_MACHINE\Software\WOW6432Node |
//z 2012-2-9 17:40:19 IS2120@CSDN
64 位版本 Windows 包含的默认 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. | 单击“开始”,然后单击“运行”。 |
2. | 在“打开”框中,键入 %systemroot%\syswow64\regedit,然后单击“确定”。 |
注意:除非使用 -m 开关启动注册表编辑器的第二个实例,否则,必须先关闭 64 位版本的注册表编辑器,然后才能打开 32 位版本的注册表编辑器(反之亦然)。例如,如果 64 位版本的注册表编辑器已经在运行,在第 2 步键入 %systemroot%\syswow64\regedit -m 可启动 32 位版本的注册表编辑器。 |
32 位HKEY_LOCAL_MACHINE\Software 树 (HKEY_LOCAL_MACHINE\Software\WOW6432Node)。这样可以隔离HKEY_CLASSES_ROOT,因为此树的每个计算机部分驻留在以下注册表项内:
HKEY_LOCAL_MACHINE\Software
为了通过 COM 和其他机制实现 64 位/32 位程序互操作性,WOW64 使用了一个“注册表反射器”来在 64 位注册表视图和 32 位注册表视图之间镜像某些注册表项和项值。该反射器是“智能”的,因为 //z
2012-2-9 17:40:19 IS2120@CSDN它只反射 COM 激活数据。
反射的注册表项
//z 2012-2-9 17:40:19 IS2120@CSDN
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 |
无论是Windows XP Professional X64 Edition、Windows Server 2003X64 Edition还是Windows Vista X64 Edition(以下把均统称为X64系统),都引入了一项技术:文件和注册表的重定向。
//z 2012-2-9 17:40:19 IS2120@CSDN
之所以有这个技术,是为了将32位程序和64位程序分离开。这种在64位平台上运行32位程序的模拟器被称为WOW64。WOW64是"Windows 32 on Windows 64"的简称,它在系统层中另提供了一层,以支持老式的32位程序。
在X64系统里面,一些特殊的目录和特殊的注册表键被分为2个独立的部分。对于文件系统来说,%systemroot%/system32 目录被保留给64位文件使用,而32位文件会被重定向到%systemroot%/SysWOW64目录。换句话说,所有的32位程序一般情况下只会出现在%systemroot%/SysWOW64目录里面。任何32位程序试图访问%systemroot%/system32 目录的企图都会被重定向到%systemroot%/SysWOW64目录。这个是一个默认的行为,除非程序的线程明确的指名需要关闭这种重定向机制。
//z 2012-2-9 17:40:19 IS2120@CSDN
对于注册表来说,也有类似的内容。WOW64子系统也提供了对注册表访问的重定向。如果是32位程序,对注册表的操作不论是读还是写, WOW64都将会截取对HKLM/Software访问,并重定向到HKLM/Software/Wow6432Node(即32位应用程序的注册信息被写在HKLM/Software/Wow6432Node中,而不是预期的HKLM/Software中);如果是64位程序,就直接到 HKLM/Software。
需要重定向的注册表项
注册表重定向,其实质就是维护两套不同的注册表键,一套用于64位,一套用于32位。受影响的键不只是上面提及的HKLM/Software,还包括:
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER/Software/Classes
HKEY_LOCAL_MACHINE/Software
HKEY_USERS/*/Software/Classes
HKEY_USERS/*_Classes
其中,64位程序的注册信息存储在上面的健中,32位程序的注册信息重定向存储在下列健中:
HKEY_CLASSES_ROOT/WOW6432node
HKEY_CURRENT_USER/Software/Classes/WOW6432node
HKEY_LOCAL_MACHINE/Software/WOW6432node
HKEY_USERS/*/Software/Classes/WOW6432node
HKEY_USERS/*_Classes/WOW6432node
//z 2012-2-9 17:40:19 IS2120@CSDN
当运行32位程序,wow64会截取程序对注册表HKLM/Software的访问,并重定向于HKLM/Software/Wow6432Node。
如前面所述,以上这些键会被维护2套,但是这2套键是如何维护的呢?其维护的方法是采用一种被称为注册表反射的机制完成的。
注册表反射
注册表反射是在64 位注册表视图和 32 位注册表视图之间复制某些特定的注册表项和项值。
如在X64系统中,我们在安装64位Microsoft Office后, 64位的Winword.exe将注册.doc这个扩展名并把这个扩展名关联到Winword.exe程序,根据X64的运行机制,64位程序修改的是64位的注册表键值,但是WOW64会自动的把这个修改会同步到32位的注册表键下面,这样32位和64位的应用程序都可以使用64位Winword.exe打开.doc文件。
但是,并不是所有的键值都会受到注册表反射机制的影响。实验证明,如果我们使用32位的注册表编辑器在HKEY_LOCAL_MACHINE/Software下新建一个项,然后使用64位的注册表编辑器查看,会发现这个项只会出现在HKEY_LOCAL_MACHINE/Software/Wow6432Node键下而不会出现在HKEY_LOCAL_MACHINE/Software键下,因为HKEY_LOCAL_MACHINE/Software键是专门用于存放64位程序所使用的注册表数据的,而HKEY_LOCAL_MACHINE/Software/Wow6432Node键是专门用于存放32位程序所使用的注册表数据的
注册表中受到反射机制影响的有:
HKEY_LOCAL_MACHINE/Software/Classes(32位XP下读写HKEY_CLASSES_ROOT/Rising.Rav.20会同时出现HKEY_LOCAL_MACHINE/Software/Classe/Rising.Rav.20,两者的值永远相同,似乎有一个是镜像,64位XP下读写HKEY_CLASSES_ROOT/Rising.Rav.20则会被重定向到HKEY_LOCAL_MACHINE/Software/Classe/Rising.Rav.20,并且由于注册表反射的原因,同时也会修改HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/Classes/Rising.Rav.20,两者的值同样是永远相同的。)
HKEY_LOCAL_MACHINE/Software/COM3
HKEY_LOCAL_MACHINE/Software/EventSystem
HKEY_LOCAL_MACHINE/Software/Ole
HKEY_LOCAL_MACHINE/Software/Rpc
HKEY_USERS/*/Software/Classes
HKEY_USERS/*_Classes
注册表重定向机制对系统的影响
由于注册表重定向机制存在,下列程序调用没有问题:
Ø 32位应用程序a调用32位应用程序b并访问b的注册表信息。由于注册表重定向机制,32位应用程序b的注册信息在HKLM/Software/Wow6432Node中,而32位应用程序a访问注册表也会被重定向到HKLM/Software/Wow6432Node中,所以访问正常;
Ø 64位应用程序a调用64位应用程序b并访问b的注册表信息。64位应用程序b的注册信息在HKLM/Software,64位应用程序a访问注册表时直接访问HKLM/Software,所以访问正常;
但是在下列情况时会出现问题:
Ø 64位应用程序调用32位应用程序并访问其注册表信息。
如瑞星杀软有U盘病毒查杀功能,在插入U盘后弹出的提示框中有瑞星杀毒的标志;但是在64位系统中,此项功能失效。这是因为32位瑞星将此项功能的注册信息写到了HKLM/Software/Wow6432Node下;而调用该功能的应用程序是64位的操作系统,由于64位操作系统访问注册表时直接访问HKLM/Software,所以没有读取到该功能的注册数据,该功能因而失效。
解决方法:在此功能写注册表时,32位瑞星应用程序要将该注册信息写到64位程序的注册表项中,即HKLM/Software下。
Ø 32位应用程序调用64位应用程序并访问其注册表信息。解决方法可以参上。
应用程序如何访问注册表
上文提到32位与64位应用程序分别访问注册表问题,下面总结一下:
64位程序如何访问64位的注册表(HKLM/Software)
Ø 64位程序访问64位的注册表,直接到 HKLM/Software。
32位程序如何访问32位的注册表(HKLM/Software/Wow6432Node)
Ø 32位程序访问32位的注册表, WOW64将会截取对HKLM/Software访问,并重定向到HKLM/Software/Wow6432Node
32位程序如何访问64位的注册表(HKLM/Software)
Ø 在调用函数RegCreateKeyEx创建注册表项时,对其第六个参数REGSAM samDesired设置中添加参数KEY_WOW64_64KEY,这样可以实现对64位注册表的访问;
Ø 在调用函数RegOpenKeyEx打开注册表项时,要对其第四个参数REGSAM samDesired设置中添加参数KEY_WOW64_64KEY,这样可以实现对64位注册表的访问;
64位程序如何访问32位的注册表(HKLM/Software/Wow6432Node)
Ø 在调用函数RegCreateKeyEx创建注册表项时,对其第六个参数REGSAM samDesired设置中添加参数KEY_WOW32_64KEY,这样可以实现对32位注册表的访问;
Ø 在调用函数RegOpenKeyEx打开注册表项时,要对其第四个参数REGSAM samDesired设置中添加参数KEY_WOW32_64KEY,这样可以实现对32位注册表的访问;
相关文章推荐
- 论left-pad的实现
- iOS 设计中 网络请求之 同步请求(json 请求--新方法和老方法)
- python爬虫
- scala学习资料
- 项目经理的职责
- EL表达式字符串的截取
- Hadoop-读取数据的几种方式
- MyBatis 解决字段名与实体类属性名不相同的冲突
- 惊呆了!这个APP是他做的?
- 常用tcp协议交互的分析解读及与socket编程之间的关系
- Linux 网络调优参数
- OptionParser命令参数介绍及使用
- Java学习笔记(六):面向对象、接口和抽象类
- Java的Spi机制心得
- C++,cout和std::cout的区别
- Linux下Socket编程函数格式详解
- C++之:模板元编程(三) 默认模板参数
- XAudio2学习之IXAudio2VoiceCallback回调
- 依赖注入的方式和注入的配置实例
- Bootstrap Table 查询(服务器端)、刷新数据