x64下文件和注册表访问的重定向

节选自: http://blog.csdn.net/magictong/article/details/5892209

http://blog.csdn.net/magictong/article/details/5895482


关于文件和注册表的重定向:

      需要这个技术的原因是需要在x64系统上面把32位程序和64位程序分离开。这种技术有个强大的名字叫WOW64,注意不是魔兽世界64级哦,哈哈。

      出于一些特殊的目的,一些注册表键被分成了两个部分,主要有以下一些:

      HKEY_CLASSES_ROOT 

      HKEY_CURRENT_USER/Software/Classes

      HKEY_LOCAL_MACHINE/Software 

      HKEY_USERS/*/Software/Classes 

      HKEY_USERS/*_Classes

      注:*号表示匹配所有

 

      简单来说32位程序在访问这些键的时候,会访问到下一级的Wow6432Node子键上去(自动定位,由WOW64机制来完成),譬如访问HKEY_LOCAL_MACHINE/Software/safe的时候,会重定向后访问到HKEY_LOCAL_MACHINE/Software/Wow6432Node/safe,当然64位程序的访问不受影响,此过程对用户透明。

      代码编写:其实注册表的重定向控制比文件的重定向控制简单很多,认识下面两个宏就可以了。

            #define KEY_WOW64_32KEY         (0x0200)

            #define KEY_WOW64_64KEY         (0x0100)

         (来之winnt.h)

 

      对于注册表创建和打开的两个API(RegCreateKeyEx和RegOpenKeyEx)都有一个参数是关于打开的注册表句柄的权限的,使用分32程序和64位程序,假设原有访问权限为KEY_ALL_ACCESS:

      1、32位程序,如果不修改权限组值,则访问的是重定向后的注册表键值,而如果把权限设置为KEY_ALL_ACCESS | KEY_WOW64_64KEY,则明确指定了可以访问64位的注册表。

      2、64位程序,如果不修改权限值,则访问的是64位的注册表的原注册表值,如果把权限值设置为KEY_ALL_ACCESS | KEY_WOW64_32KEY,则明确指定了去访问32位的注册表键值。

 

      P.S.总之上面提到的一些键值,不同的系统也许有区别,建议写代码的时候多测试。而且HKEY_LOCAL_MACHINE/Software/下有些项是32位和64位共享的也就是只有一份拷贝,详情可以见http://support.microsoft.com/kb/896459/en-us 另外就是关于在x64下注册表的反射,这个对于兼容32位程序是非常重要的,也是可以通过API来控制指定键的反射的开启和关闭的,不过这不是这里讨论的重点。


    下面谈谈x64系统下文件的重定向:
    x64下文件的重定向依然是WOW64具体执行细节的一部分,跟注册表重定向一样同样是为了将32为程序和64位程序分开。所谓文件重定向通俗点讲就是你去访问某些文件夹的文件的时候,会被定位到其他文件夹下面的文件去,而且这一切依然对用户透明。主要有以下一些文件夹会被重定向:
    %Systemroot%/System32

    %ProgramFiles%
    当一个32位程序在默认情况下去访问%Systemroot%/System32时,会被定位到%Systemroot%/Syswow64文件夹下面。

    要关闭和开启(x64下文件重定向默认是开启的)文件的重定向,需要了解三个API:
        Wow64EnableWow64FsRedirection
        Wow64DisableWow64FsRedirection
        Wow64RevertWow64FsRedirection

    不过MSDN说了Wow64EnableWow64FsRedirection不好云云,自己看:
    The Wow64EnableWow64FsRedirection function enables or disables file system redirection for the calling thread.
This function may not work reliably when there are nested calls. Therefore, this function has been replaced by the Wow64DisableWow64FsRedirection and Wow64RevertWow64FsRedirection functions.
BOOLEAN Wow64EnableWow64FsRedirection(
  BOOLEAN Wow64FsEnableRedirection
);

    所以我们就使用Wow64DisableWow64FsRedirection和Wow64RevertWow64FsRedirection,这两个函数在Kernel32.dll里面,当然32位的这个DLL是没有这两个函数的,因此需要从dll中导出来使用。   

    另外%ProgramFiles%这个环境变量并不受这两个API的影响,而只跟应用程序本身是否是32还是64位有关,当你使用ExpandEnvironmentStrings来展开%ProgramFiles%时,如果是32位程序,则返回的路径是C:/Program Files (x86),假设你的系统安装在c盘。而如果是64位程序,则返回C:/Program Files。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值