zoukankan      html  css  js  c++  java
  • [Windows核心编程]32bit程序在64bit操作系统下处理重定向细节[1]

    这段时间,都在做Ring3层的普通32bit程序兼容64bit操作系统的代码修改,在此记录修改和学习心德。
    编程领域太广, 任何人经历有限,本人不是专家,所以我一贯原则是: 用到的时候,才去研究,在去记录。
    只要个人的基础知识扎实,吸收一些新的东西,还是蛮顺利的。


    1. 64bit操作系统的重定向机制以及目的
       在64bit操作系统中,为了无缝兼容32bit程序的运行,64bit的Windows操作系统采用重定向机制。目的是为了能让32bit程序在64bit的操作系统不仅能操作关键文件文夹和关键的注册表并且又要避免与64bit程序冲突。
      微软采用重定向机制的原理很简单,说白了就是 让关键文件/文件夹或者关键注册表有2个副本。 1个副本是给32bit程序访问,一个副本给64bit程序访问。
      
       PS: 以上不是用专业术语解释,只是用白话解释。如果觉得不够专业,可以查阅详细资料

    2. 64bit操作系统是如何控制32bit和64bit程序访问对应各自的副本?
       这个问题,就是重定向机制的核心功能。
      
       例子: 32bit程序在64bit Windows操作系统,要访问system32目录。
       在正常的情况下:  64bit Windows操作系统的重定向机制 会在内部  把 system32目录 转向 syswow64目录, 因此32bit程序对system32目录的操作,实际是对syswow64目录进行操作。
       以为由于重定向的干预,因为可以这么认为 system32目录是供给64bit程序使用的,而syswow64目录是给32bit程序使用的
       代码例子: 32bit程序中有一个代码
       deletefile('c:windowssystem32a.txt') ;
       这个代码在64bit Windows操作系统中,它只会删除syswow64目录中的a.txt文件,而不会删除system32目录的a.txt文件。  这就是重定向的干预结果。

    3. 那32bit程序要真正访问64bit程序的system32目录要如何做呢?
       微软提供一套API,可以做到上面的要求。 通过 Wow64DisableWow64FsRedirection 和 Wow64RevertWow64FsRedirection API 来配合使用

       代码例子: 32bit程序中有一个代码
       Wow64DisableWow64FsRedirection  // 关闭重定向
       deletefile('c:windowssystem32a.txt') ;
       Wow64RevertWow64FsRedirection   // 恢复重定向
       以上代码,就有效的删除了system32目录里面的a.txt文件,而不是syswow64目录中的a.txt文件。

    4. 32bit程序在64bit操作系统下不关闭重定向功能,在全盘枚举系统目录时,是否可以同时把32bit和64bit的目录都枚举出来?
       经过我测试,无法同时枚举出来,只能做2次重复扫描,第一次在打开重定向枚举出32bit的目录,然后第二次关闭重定向,在枚举64bit的目录。

    6. 既然文件目录有重定向,那么注册表有没有重定向之后的副本?
       有, 跟文件重定向一样。
       示例: 32bit程序在64bitWindows操作系统正常访问'HKEY_LOCAL_MACHINESOFTWAREClassesCLSID'
       在重定向的干预下,32bit程序被重定向访问到'HKEY_LOCAL_MACHINESOFTWAREClassesWow6432nodeCLSID'
      
       如果要真正访问'HKEY_LOCAL_MACHINESOFTWAREClassesCLSID' ,请按照 第3点的 代码示例来做。

    7. 32bit程序在64bit操作系统下不关闭重定向功能,枚举系统注册表,是否可以同时把32bit和64bit的注册信息同时枚举出来?
       经过我测试,无法同时枚举出来,只能做2次重复扫描,第一次在打开重定向枚举出32bit的注册表信息,然后第二次关闭重定向,在枚举64bit的注册表信息。

    8. 32bit程序在64bit操作系统下不关闭重定向功能,直接硬编码访问32bit副本的关键目录和关键注册表是否可行?
       经过我测试,是可以的。
       代码例子: 
       deletefile('c:windowssyswow64a.txt') ;
       以上代码就是可以直接删除syswow64目录下的a.txt文件.
       同理,注册表访问也一样适用.

  • 相关阅读:
    数据结构之双向链表的插入
    循环链表之约瑟夫 环
    循环链表
    顺序表的A-A交B
    环境变量
    java之构造函数的简单应用
    java之覆盖
    数据结构之栈的进制转换(10进制-- > 8进制 )
    数据结构链表之 一元多次多项式
    排序之简单的快速排序
  • 原文地址:https://www.cnblogs.com/qq78292959/p/3435153.html
Copyright © 2011-2022 走看看