您的位置:首页 > 其它

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

2013-10-30 13:21 417 查看
转载自:/article/1423219.html

下面谈谈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
plaincopy

/* -------------------------------------------------------------------------

// 文件名 : KWow64FsRedrt.h

// 创建者 : magicTong

// 创建时间 : 2010-9-19 19:23:07

// 功能描述 :

//

// $Id: $

// -----------------------------------------------------------------------*/

#ifndef __KWOW64FSREDRT_H__

#define __KWOW64FSREDRT_H__

// -------------------------------------------------------------------------

class KWow64FsRedrt

{

public:

KWow64FsRedrt();

~KWow64FsRedrt();

BOOL Init();

BOOL Open();

BOOL Close();

private:

typedef BOOL (__stdcall *WOW64DISABLEWOW64FSREDIRECTION)(PVOID*);

typedef BOOL (__stdcall *WOW64REVERTWOW64FSREDIRECTION)(PVOID);

WOW64DISABLEWOW64FSREDIRECTION m_pfWow64DisableWow64FsRedirection;

WOW64REVERTWOW64FSREDIRECTION m_pfWow64RevertWow64FsRedirection;

PVOID m_pOldValue;

BOOL m_bCloseRedirection;

HMODULE m_hModKrl;

};

// -------------------------------------------------------------------------

// $Log: $

#endif /* __KWOW64FSREDRT_H__ */

KWow64FsRedrt.cpp

[c-sharp] view
plaincopy

/* -------------------------------------------------------------------------

// 文件名 : KWow64FsRedrt.cpp

// 创建者 : magicTong

// 创建时间 : 2010-9-19 19:23:01

// 功能描述 :

//

// $Id: $

// -----------------------------------------------------------------------*/

#include "stdafx.h"

#include "KWow64FsRedrt.h"

// -------------------------------------------------------------------------

KWow64FsRedrt::KWow64FsRedrt()

{

m_pfWow64DisableWow64FsRedirection = NULL;

m_pfWow64RevertWow64FsRedirection = NULL;

m_pOldValue = NULL;

m_bCloseRedirection = FALSE;

m_hModKrl = NULL;

}

KWow64FsRedrt::~KWow64FsRedrt()

{

if (m_hModKrl)

{

FreeLibrary(m_hModKrl);

m_hModKrl = NULL;

}

}

// -------------------------------------------------------------------------

// 函数 : KWow64FsRedrt::init

// 功能 : 初始化,从Kernel32拿到函数指针

// 返回值 : BOOL

// 附注 : 如果初始化失败,建议不要进行open和close操作

// -------------------------------------------------------------------------

BOOL KWow64FsRedrt::Init()

{

BOOL bRet = FALSE;

m_hModKrl = LoadLibrary(TEXT("Kernel32.dll"));

if (!m_hModKrl)

{

goto Exit0;

}

m_pfWow64DisableWow64FsRedirection = (WOW64DISABLEWOW64FSREDIRECTION)GetProcAddress(m_hModKrl, "Wow64DisableWow64FsRedirection");

m_pfWow64RevertWow64FsRedirection = (WOW64REVERTWOW64FSREDIRECTION) GetProcAddress(m_hModKrl, "Wow64RevertWow64FsRedirection");

if (!m_pfWow64DisableWow64FsRedirection || !m_pfWow64RevertWow64FsRedirection)

{

goto Exit0;

}

bRet = TRUE;

Exit0:

return bRet;

}

// -------------------------------------------------------------------------

// 函数 : KWow64FsRedrt::Close

// 功能 : 关闭文件重定向

// 返回值 : BOOL

// 附注 :

// -------------------------------------------------------------------------

BOOL KWow64FsRedrt::Close()

{

int bRet = 0;

if (m_bCloseRedirection)

{

return TRUE;

}

if (!m_pfWow64DisableWow64FsRedirection)

return FALSE;

bRet = m_pfWow64DisableWow64FsRedirection(&m_pOldValue);

if (bRet)

{

m_bCloseRedirection = TRUE;

return TRUE;

}

return FALSE;

}

// -------------------------------------------------------------------------

// 函数 : KWow64FsRedrt::Open

// 功能 : 打开文件重定向

// 返回值 : BOOL

// 附注 :

// -------------------------------------------------------------------------

BOOL KWow64FsRedrt::Open()

{

BOOL bRet = 0;

if (!m_bCloseRedirection)

{

return TRUE;

}

if (!m_pfWow64RevertWow64FsRedirection)

return FALSE;

bRet = m_pfWow64RevertWow64FsRedirection(m_pOldValue);

if (bRet)

{

m_bCloseRedirection = FALSE;

return TRUE;

}

return FALSE;

}

// -------------------------------------------------------------------------

// $Log: $

测试代码:

[cpp] view
plaincopy

KWow64FsRedrt wow64Redrt;

wow64Redrt.Init();

wow64Redrt.Close();

HANDLE hFile = CreateFile(TEXT("c://windows//system32//z_magictong.exe"),

GENERIC_READ,

FILE_SHARE_READ,

NULL,

OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL,

NULL);

memset(szInfo, 0, sizeof szInfo);

::wsprintf(szInfo, TEXT("关闭了重定向 File Handle: %d"), hFile);

MessageBox(szInfo, TEXT("Handle"), MB_OK);

wow64Redrt.Open();

hFile = CreateFile(TEXT("c://windows//system32//z_magictong.exe"),

GENERIC_READ,

FILE_SHARE_READ,

NULL,

OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL,

NULL);

memset(szInfo, 0, sizeof szInfo);

::wsprintf(szInfo, TEXT("开启了重定向 File Handle: %d"), hFile);

MessageBox(szInfo, TEXT("Handle"), MB_OK);

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

[end]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: