x64系統的判斷和x64下檔案和登錄檔訪問的重定向——補記
阿新 • • 發佈:2019-01-07
原來的地址
之前在(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; }