Chinaunix首页 | 论坛 | 博客
  • 博客访问: 456260
  • 博文数量: 750
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 4970
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-09 12:36
文章分类

全部博文(750)

文章存档

2011年(1)

2008年(749)

我的朋友
最近访客

分类:

2008-09-09 15:20:55

      无论是 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位试图里面都是统一的。

【责编:Xiaofei】

--------------------next---------------------

阅读(204) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~