现在的位置: 首页 > 综合 > 正文

x64系统的判断和x64下文件和注册表访问的重定向——补记

2017年12月07日 ⁄ 综合 ⁄ 共 1450字 ⁄ 字号 评论关闭

        原来的地址

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

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

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


        之前在(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;
}


抱歉!评论已关闭.