1. 程式人生 > >x64系統的判斷和x64下檔案和登錄檔訪問的重定向——補記

x64系統的判斷和x64下檔案和登錄檔訪問的重定向——補記

        原來的地址

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