目录
1.windows的system32文件夹与syswow64文件夹
一.介绍一些必要概念
1.windows的system32文件夹与syswow64文件夹
64位操作系统:
syswow64文件夹中保存的是32位程序
system32文件夹中保存的是64位程序
32位操作系统:
略
2.PE文件如何确定它的位数
直接用记事本或者notepad++打开exe文件(dll文件),会有很多乱码,不要头疼,接下来只需要在第二段中找到PE两个字母,在其后的不远出会出现d? 或者L。若是d,则证明该程序是64位;若是L,则证明是32位。
3.关闭文件系统重定位的必要性
在使用32位程序访问system32文件夹中的程序时如果直接使用路径访问,那么操作系统将会自动将的访问路径重新定位到syswow64文件夹。如果不关闭,将会造成目标与实际要访问的结果不一致。
二.代码
#include <afx.h>
#include <Windows.h>
#include <tchar.h>
#include <Shlwapi.h>
#pragma comment(lib, "Shlwapi.lib")
#pragma comment(lib, "Kernel32.lib")
int main()
{
PVOID value;
//关重定位
DisableWow64FsRedirection(value);
return 0;
}
bool DisableWow64FsRedirection(PVOID& value)
{
using fp_Wow64DisableWow64FsRedirection = BOOL(WINAPI*)(LPVOID*);
//如果是64位返回TRUE
auto IsWind64 = []() -> bool
{
SYSTEM_INFO si;
GetNativeSystemInfo(&si);
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
return true;
return false;
};
//不是64位直接返回32位没有重定位逻辑
if (!IsWind64()) return TRUE;
BOOL bRet = FALSE;
const auto Wow64DisableWow64FsRedirection = (fp_Wow64DisableWow64FsRedirection)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "Wow64DisableWow64FsRedirection");
if (Wow64DisableWow64FsRedirection)
{
return Wow64DisableWow64FsRedirection(&value);
}
return FALSE;
}
bool RevertWow64FsRedirection(PVOID& value)
{
using fp_Wow64RevertWow64FsRedirection = BOOL(WINAPI*)(LPVOID*);
//如果是64位返回TRUE
auto IsWind64 = []() -> bool
{
SYSTEM_INFO si;
GetNativeSystemInfo(&si);
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
return true;
return false;
};
//不是64位直接返回32位没有重定位逻辑
if (!IsWind64()) return TRUE;
BOOL bRet = FALSE;
const auto Wow64RevertWow64FsRedirection = (fp_Wow64RevertWow64FsRedirection)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "Wow64RevertWow64FsRedirection");
if (Wow64RevertWow64FsRedirection)
{
return Wow64RevertWow64FsRedirection(&value);
}
return FALSE;
}