分类:
2008-10-27 14:20:26
无论是 XP Professional X64 Edition还是 Server 2003 X64 Edition(以下把均统称为X64系统),都引入了一项“新”的技术:文件和注册表的重定向。
之所以有这个技术,是为了将32位程序和64位程序分离开。这种在64位平台上运行32位程序的模拟器被称为WOW64。以下是MSDN对WOW64的定义
WOW64 is the x86 emulator that allows 32-bit Windows applications to run on 64-bit Windows.
本文并不关注WOW64的具体的执行细节,但是有一点需要注意的是:文件和注册表的重定向和WOW64的执行方式有很大的关系。
在X64系统里面,一些特殊的目录和特殊的注册表键被分为2个独立的部分。对于文件系统来说,%systemroot%\system32 目录被保留给64位文件使用,而32位文件会被重定向到%systemroot%\SysWOW64目录。换句话说,所有的32位程序一般情况下只会出现在%systemroot%\SysWOW64目录里面。任何32位程序试图访问%systemroot%\system32 目录的企图都会被重定向到%systemroot%\SysWOW64目录。这个是一个默认的行为,除非程序的线程明确的指名需要关闭这种重定向机制。
对于注册表来说,也有类似的内容。
注册表重定向,其实质就是维护两套不同的注册表键,一套用于64位,一套用于32位。受影响的键包括:
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER\Software\Classes
HKEY_LOCAL_MACHINE\Software
HKEY_USERS\*\Software\Classes
HKEY_USERS\*_Classes
如前面所述,以上这些键会被维护2套,但是这2套键是如何维护的呢?根据相关文档的说明,维护的方法是采用一种被称为注册表反射的机制完成的。简单的说,当我们在安装Microsoft Office之前打开DOC文档,默认的编辑工具应该是写字板,而且是64位版本的写字板。64位的写字板将注册.doc这个扩展名并把这个扩展名关联到写字板程序,根据X64的运行机制,64位程序修改的是64位的注册表键值,但是WOW64会自动的把这个修改会同步到32位的注册表键下面,这样才能保证关联的正确性。
但是,并不是所有的键值都会受到注册表反射机制的影响。实验证明,如果我们使用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位程序所使用的注册表数据的。
说了这么多,有点乱了吧,下面来整理一下:
1. X64系统引入了重定向机制来实现32位程序数据和64位程序数据的隔离;
2. 重定向机制可以归结为到文件系统上的重定向和注册表的重定向;
3. 文件系统的重定向目录包括:Program Files和%Systemroot%\System32等常见目录;
4. 受注册表重定向影响的键包括:
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER\Software\Classes
HKEY_LOCAL_MACHINE\Software
HKEY_USERS\*\Software\Classes
HKEY_USERS\*_Classes
5. 注册表的重定向机制里面采用了反射机制来保证一些注册表数据在32位试图和64位试图里面都是统一的。