x64系统的判断和x64下文件和注册表访问的重定向(3)

16 篇文章 0 订阅
15 篇文章 0 订阅

转载自:http://blog.csdn.net/magictong/article/details/5895482


    下面谈谈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中导出来使用。

    直接上代码算了。

    KWow64FsRedrt.h

[cpp]  view plain copy
  1. /* ------------------------------------------------------------------------- 
  2. //  文件名     :   KWow64FsRedrt.h 
  3. //  创建者     :   magicTong 
  4. //  创建时间    :   2010-9-19 19:23:07 
  5. //  功能描述    :    
  6. // 
  7. //  $Id: $ 
  8. // -----------------------------------------------------------------------*/  
  9. #ifndef __KWOW64FSREDRT_H__  
  10. #define __KWOW64FSREDRT_H__  
  11.   
  12. // -------------------------------------------------------------------------  
  13.   
  14. class KWow64FsRedrt  
  15. {  
  16. public:  
  17.     KWow64FsRedrt();  
  18.     ~KWow64FsRedrt();  
  19.   
  20.     BOOL Init();  
  21.     BOOL Open();  
  22.     BOOL Close();  
  23.   
  24. private:  
  25.     typedef BOOL (__stdcall *WOW64DISABLEWOW64FSREDIRECTION)(PVOID*);  
  26.     typedef BOOL (__stdcall *WOW64REVERTWOW64FSREDIRECTION)(PVOID);   
  27.   
  28.   
  29.     WOW64DISABLEWOW64FSREDIRECTION  m_pfWow64DisableWow64FsRedirection;  
  30.     WOW64REVERTWOW64FSREDIRECTION  m_pfWow64RevertWow64FsRedirection;  
  31.     PVOID               m_pOldValue;  
  32.     BOOL                m_bCloseRedirection;  
  33.     HMODULE         m_hModKrl;  
  34. };  
  35. // -------------------------------------------------------------------------  
  36. // $Log: $  
  37.   
  38. #endif /* __KWOW64FSREDRT_H__ */  

    KWow64FsRedrt.cpp

[c-sharp]  view plain copy
  1. /* ------------------------------------------------------------------------- 
  2. //  文件名     :   KWow64FsRedrt.cpp 
  3. //  创建者     :   magicTong 
  4. //  创建时间    :   2010-9-19 19:23:01 
  5. //  功能描述    :    
  6. // 
  7. //  $Id: $ 
  8. // -----------------------------------------------------------------------*/  
  9.  
  10. #include "stdafx.h"  
  11. #include "KWow64FsRedrt.h"  
  12.   
  13. // -------------------------------------------------------------------------  
  14.   
  15. KWow64FsRedrt::KWow64FsRedrt()  
  16. {  
  17.     m_pfWow64DisableWow64FsRedirection = NULL;  
  18.     m_pfWow64RevertWow64FsRedirection = NULL;  
  19.     m_pOldValue = NULL;  
  20.     m_bCloseRedirection = FALSE;  
  21.     m_hModKrl = NULL;  
  22. }  
  23.   
  24. KWow64FsRedrt::~KWow64FsRedrt()  
  25. {  
  26.     if (m_hModKrl)  
  27.     {  
  28.         FreeLibrary(m_hModKrl);  
  29.         m_hModKrl = NULL;  
  30.     }  
  31. }  
  32.   
  33. // -------------------------------------------------------------------------  
  34. // 函数       : KWow64FsRedrt::init  
  35. // 功能       : 初始化,从Kernel32拿到函数指针  
  36. // 返回值  : BOOL   
  37. // 附注       : 如果初始化失败,建议不要进行open和close操作  
  38. // -------------------------------------------------------------------------  
  39. BOOL KWow64FsRedrt::Init()  
  40. {  
  41.     BOOL bRet = FALSE;  
  42.     m_hModKrl  =  LoadLibrary(TEXT("Kernel32.dll"));  
  43.     if (!m_hModKrl)  
  44.     {  
  45.         goto Exit0;  
  46.     }  
  47.   
  48.     m_pfWow64DisableWow64FsRedirection  =  (WOW64DISABLEWOW64FSREDIRECTION)GetProcAddress(m_hModKrl, "Wow64DisableWow64FsRedirection");   
  49.     m_pfWow64RevertWow64FsRedirection  =    (WOW64REVERTWOW64FSREDIRECTION) GetProcAddress(m_hModKrl, "Wow64RevertWow64FsRedirection");  
  50.   
  51.     if (!m_pfWow64DisableWow64FsRedirection || !m_pfWow64RevertWow64FsRedirection)  
  52.     {  
  53.         goto Exit0;  
  54.     }  
  55.   
  56.     bRet = TRUE;  
  57. Exit0:  
  58.     return bRet;  
  59. }  
  60.   
  61. // -------------------------------------------------------------------------  
  62. // 函数       : KWow64FsRedrt::Close  
  63. // 功能       : 关闭文件重定向  
  64. // 返回值  : BOOL   
  65. // 附注       :   
  66. // -------------------------------------------------------------------------  
  67. BOOL KWow64FsRedrt::Close()  
  68. {  
  69.     int bRet = 0;  
  70.   
  71.     if (m_bCloseRedirection)  
  72.     {  
  73.         return TRUE;  
  74.     }  
  75.   
  76.     if (!m_pfWow64DisableWow64FsRedirection)  
  77.         return FALSE;  
  78.   
  79.     bRet = m_pfWow64DisableWow64FsRedirection(&m_pOldValue);  
  80.     if (bRet)  
  81.     {  
  82.         m_bCloseRedirection = TRUE;  
  83.         return TRUE;  
  84.     }  
  85.   
  86.     return FALSE;  
  87. }  
  88.   
  89. // -------------------------------------------------------------------------  
  90. // 函数       : KWow64FsRedrt::Open  
  91. // 功能       : 打开文件重定向  
  92. // 返回值  : BOOL   
  93. // 附注       :   
  94. // -------------------------------------------------------------------------  
  95. BOOL KWow64FsRedrt::Open()  
  96. {  
  97.     BOOL bRet = 0;  
  98.   
  99.     if (!m_bCloseRedirection)  
  100.     {  
  101.         return TRUE;  
  102.     }  
  103.   
  104.     if (!m_pfWow64RevertWow64FsRedirection)  
  105.         return FALSE;  
  106.   
  107.     bRet = m_pfWow64RevertWow64FsRedirection(m_pOldValue);  
  108.     if (bRet)  
  109.     {  
  110.         m_bCloseRedirection = FALSE;  
  111.         return TRUE;  
  112.     }  
  113.     return FALSE;  
  114. }  
  115. // -------------------------------------------------------------------------  
  116. // $Log: $  

    测试代码:

[cpp]  view plain copy
  1. KWow64FsRedrt wow64Redrt;  
  2.     wow64Redrt.Init();  
  3.     wow64Redrt.Close();  
  4.     HANDLE hFile = CreateFile(TEXT("c://windows//system32//z_magictong.exe"),  
  5.                                             GENERIC_READ,  
  6.                                             FILE_SHARE_READ,  
  7.                                             NULL,  
  8.                                             OPEN_EXISTING,  
  9.                                             FILE_ATTRIBUTE_NORMAL,  
  10.                                             NULL);  
  11.     memset(szInfo, 0, sizeof szInfo);  
  12.     ::wsprintf(szInfo, TEXT("关闭了重定向 File Handle: %d"), hFile);  
  13.     MessageBox(szInfo, TEXT("Handle"), MB_OK);  
  14.   
  15.     wow64Redrt.Open();  
  16.   
  17.     hFile = CreateFile(TEXT("c://windows//system32//z_magictong.exe"),  
  18.         GENERIC_READ,  
  19.         FILE_SHARE_READ,  
  20.         NULL,  
  21.         OPEN_EXISTING,  
  22.         FILE_ATTRIBUTE_NORMAL,  
  23.         NULL);  
  24.     memset(szInfo, 0, sizeof szInfo);  
  25.     ::wsprintf(szInfo, TEXT("开启了重定向 File Handle: %d"), hFile);  
  26.     MessageBox(szInfo, TEXT("Handle"), MB_OK);  

 

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

 

[end]


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值