文件系统重定向程序

%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、Wow64EnableWow64FsRedirectionWow64RevertWow64FsRedirection 函数来控制 WOW64 文件系统重定向程序。 禁用文件系统重定向会影响调用线程执行的所有文件操作,因此仅当单个 CreateFile 调用需要时才禁用它,并在函数返回后立即重新启用。 长时间禁用文件系统重定向可能会阻止 32 位应用程序加载系统 DLL,从而导致应用程序失败。

32 位应用程序可以通过将 %windir%\Sysnative 替换为 %windir%\System32 来访问本机系统目录。 WOW64 将 Sysnative 识别为用于指示文件系统不应重定向访问的特殊别名。 此机制灵活且易于使用,因此,建议使用此机制绕过文件系统重定向。 请注意,64 位应用程序不能使用 Sysnative 别名,因为它是虚拟目录,而不是实际目录。

Windows Server 2003 和 Windows XP: 从 Windows Vista 开始添加 Sysnative 别名。