wow64文件系统重定向 禁用怎么解决

64位系统上32位进程拷贝文件到"System32"目錄时,会被文件系统重定向到"SysWOW64"目录

要禁用这种重定向需要用到下面2个API:

}

  我的上一篇文章已经阐述了“32位程序和64位程序在64位平台上读\写注册表的区别”那么接下来将要回答上篇所留下来的一个问题:32位程序如何访问64位系统注册表(即:64位程序所访问的注册表位置)。

    ①:本机模式 64 位程序运行在纯模式下并且访问键和存储在以下注册表子键中的值:HKEY_LOCAL_MACHINE\Software

  那么要實现32为程序访问64位注册表信息,还要知道如下概念:1:文件系统转向2:注册表重定向(转向)。3:注册表反射

    ①:文件系统轉向

    32 位进程不能加载64位Dll,64位进程也不可以加载32位DllWindows的系统目录包含了所有安装的应用程序和它们的Dll文件,根据我们所述 的规则

    它应该被分为给64位应用程序的目录和给32位应用程序的目录。如果不这样我们就无法区分32位和64位的Dll文件。对于64位应用程序其 文件通常被

    C:\program files (x86)下面。如果我们用32位程序去访问%windir%\system32不管我们用硬编码还是其它的方式,系统都会自动地给我们

    转向到%windir%\syswow64下面这種转向对于每个32位应用程序默认都是打开的。但是这种转向对于我们来说并不总是需要的那么我们可以在

    C#里面调用相关的API来关閉和打开这种转向。常用的函数有3个:

    功能在C#中,我们可以利用DllImport直接调用这两个函数

    ②:注册表重定向(转向)

    若要支持的 32 位和 64 位 COM 注册和程序共存状态,WOW64 子系统提供 32 位程序使用的注册表的另一个视图在 WOW64 子系统使用注册表

    重定向截获位级别的注册表调用。注册表重定向还可以确保注册表调用被定向到在注册表中正确的分支

    注册表重定向不要求程序代码修改,和此过程是对用户透明

    ③:注册表反射

    反射使两个相同的注册表,以支持同时进行的本机和 WOW64 操作的物理副本的存在

    打开注册表的 64 位节在所有时间和注册表反射提供了一种容纳 32 位的实时方法。

  简单的了解了这些下面说一下具体的实现步驟:

    关闭64位(文件系统)的操作转向

      获得操作Key值的句柄

        关闭注册表转向(禁止特定项的注册表反射)

      获取访问的Key值

        打开注册表转向(开启特定项的注册表反射)

    开启64位(文件系统)的操作转向

 

Get64BitRegistryKey函数的三个参数分别代表:主键名(如:HKEY_LOCAL_MACHINE等),子键名Key名,返回的是Key的Value(64位系统注册表的键值)通过上面的方法就完全可以实现用32程序访问64位系统注册表(即:64位程序所访问的注册表位置)。

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信