檔案系統重新導向器
%windir%\System32 目錄會保留給 64 位 Windows 上的 64 位應用程式。 建立 64 位版本的 DLL 時,不會變更大部分的 DLL 檔案名,因此 32 位版本的 DLL 會儲存在不同的目錄中。 WOW64 會使用 檔案系統重新導向器來隱藏這項差異。
在大部分情況下,每當 32 位應用程式嘗試存取 %windir%\System32、%windir%\lastgood\system32 或 %windir%\regedit.exe時,就會將存取重新導向至架構特定的路徑。
注意
這些路徑僅供參考。 為了相容,應用程式不應該直接使用這些路徑。 相反地,他們應該呼叫以下所述的 API。
原始路徑 | 32 位 x86 進程的重新導向路徑 | 32 位 ARM 進程的重新導向路徑 |
---|---|---|
%windir%\System32 | %windir%\SysWOW64 | %windir%\SysArm32 |
%windir%\lastgood\system32 | %windir%\lastgood\SysWOW64 | %windir%\lastgood\SysArm32 |
%windir%\regedit.exe | %windir%\SysWOW64\regedit.exe | %windir%\ SysArm32\regedit.exe |
如果存取會導致系統顯示 UAC 提示字元,則不會發生重新導向。 相反地,會啟動要求的 64 位版本檔案。 若要避免這個問題,請指定 SysWOW64 目錄以避免重新導向,並確保存取 32 位版本的檔案,或以系統管理員許可權執行 32 位應用程式,讓 UAC 提示不會顯示。
Windows Server 2003 和 Windows XP: 不支援 UAC。
某些子目錄會豁免重新導向。 這些子目錄的存取權不會重新導向至 %windir%\SysWOW64:
- %windir%\system32\catroot
%windir%\system32\catroot2
%windir%\system32\driverstore
%windir%\system32\drivers\etc
%windir%\system32\logfiles
%windir%\system32\spool
Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP: %windir%\system32\driverstore 已重新導向。
若要擷取 32 位系統目錄的名稱,64 位應用程式應該使用GetSystemWow64Directory2函式 (Windows 10 1511 版) 或GetSystemWow64Directory 函式。
應用程式應該使用 SHGetKnownFolderPath 函式來判斷 %ProgramFiles% 目錄名稱。
Windows Server 2003 和 Windows XP: 應用程式應該使用 SHGetSpecialFolderPath 函式來判斷 %ProgramFiles% 目錄名稱。
應用程式可以使用 Wow64DisableWow64FsRedirection、 Wow64EnableWow64FsRedirection和 Wow64RevertWow64FsRedirection 函式來控制 WOW64 檔案系統重新導向器。 停用檔案系統重新導向會影響呼叫執行緒執行的所有檔案作業,因此只有在單一 CreateFile 呼叫需要時才停用,並在函式傳回之後立即重新啟用。 停用較長的檔案系統重新導向可能會防止 32 位應用程式載入系統 DLL,導致應用程式失敗。
32 位應用程式可以取代 %windir%\Sysnative for %windir%\System32 來存取原生系統目錄。 WOW64 會將 Sysnative 辨識為用來指出檔案系統不應該將存取重新導向的特殊別名。 此機制具有彈性且容易使用,因此,建議略過檔案系統重新導向的機制。 請注意,64 位應用程式無法使用 Sysnative 別名,因為它不是真正的虛擬目錄。
Windows Server 2003 和 Windows XP: 從 Windows Vista 開始新增了 Sysnative 別名。