原来的地址
之前在(3)里面讨论过%ProgramFiles%这个环境变量的指向问题,其实在x64环境下面还有两个环境变量可以使用:%ProgramFiles(x86)%和%ProgramW6432%,如果你的系统安装在C盘,那么对应关系是这样的(注32位系统只有%ProgramFiles%,这里不讨论):
%ProgramFiles% |
%ProgramFiles(x86)% |
%ProgramW6432% |
|
32位程序 |
C:\Program Files (x86) |
C:\Program Files (x86) |
C:\Program Files |
64位程序 |
C:\Program Files |
C:\Program Files (x86) |
C:\Program Files |
分享一个有意思的文件重定向问题,在Wow环境(也就是32位程序运行在64位系统下)下,通过一种特殊的Hack方式可以规避文件重定向。想象这样一种场景,如果你的32位程序在64位系统想访问C:\Windows\System32\systemlnk.lnk,它实际上会被重定向访问C:\Windows\SysWOW64\systemlnk.lnk这个文件,可能就不是你想要的结果了,解决这个问题,用(3)里面提到的关闭文件重定向的方式是可以可以解决的,另外一种方式就是这里提到的Hack方式,把C:\Windows\System32\systemlnk.lnk里面的System32换sysnative,变成C:\Windows\sysnative\systemlnk.lnk,那么就可以真正去访问C:\Windows\System32\systemlnk.lnk了,也不用去关闭文件重定向了。
注:32位系统下的32位程序和64位系统下64位程序不要用这种方式。
// -------------------------------------------------------------------------
// 函数 : KWow64FsRedrt::IsWow64Process
// 功能 : 判断是否运行在Wow模式
// 返回值 : BOOL
// 附注 : 也就是32位程序运行在64位系统,而64位程序调用这个函数返回FALSE
// -------------------------------------------------------------------------
BOOL KWow64FsRedrt::IsWow64Process()
{
BOOL bIsWow64 = FALSE;
typedef BOOL (WINAPI *PF_ISWOW64PROCESS)(HANDLE, PBOOL);
PF_ISWOW64PROCESS pfIsWow64Process = (PF_ISWOW64PROCESS)::GetProcAddress(
GetModuleHandle(_T("kernel32.dll")), "IsWow64Process");
if (pfIsWow64Process)
{
if (!pfIsWow64Process(GetCurrentProcess(), &bIsWow64))
{
// handle error
}
}
return bIsWow64;
}