前言
在64位的Windows操作系统中,为了兼容32位程序的运行,并且让32位程序在64位的操作系统中不仅能操作关键文件文夹和关键的注册表,并且又要避免与64位程序的冲突,64位的操作系统采取了重定向机制。
32位和64位相关的系统目录
在64位的Windows操作系统中,通过WOW64的模拟器来实现运行32位的应用程序。WOW64 是一个由操作系统提供的兼容性环境,它使得 32 位应用程序能够在 Windows 64 位操作系统上运行,在系统的Windows目录(C:\Windows)下,存在System32和SysWOW64两个文件夹:
- System32文件夹下存放的是64位DLL
- SysWOW64文件夹下存放的是32位DLL
同样Program File也存在两个文件夹:
- 64位的应用程序安装后,保存在C:\Program File文件夹下
- 32位的应用程序安装后,保存在C:\Program File(X86)文件夹下
而注册表相应的也有两套。
比如SOFTWARE目录:
- 64位的应用程序注册表路径:HKEY_LOCAL_MACHINE\SOFTWARE
- 32位的应用程序注册表路径:HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node
重定向的影响
即使指定了绝对路径,如“%windir%/System32“,根据调用程序的不同,32位程序和64位程序,系统会自动重定向到相应的目录。
禁止重定向API
为什么要禁止重定向
有时候,我们在32位的程序中,希望访问到64位程序的目录,如C:\Windows\System32,如果不禁用重定向,虽然输入的目录是C:\Windows\System32但实际访问的目录会被重定向到C:\Windows\SysWow64目录。反过来,64位系统要访问32位程序的目录也是一样。
如何重定向
禁止或回复系统的重定向的解决办法是调用下面的API函数
//禁用系统重定向API
BOOL Wow64DisableWow64FsRedirection(PVOID OldValue);
//恢复系统重定向API
BOOL Wow64RevertWow64FsRedirection(PVOID OldValue);
在C#中,需要使用DllImport导入对这两个函数,代码如下:
// 关闭重定向API
[DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr);
//恢复重定向API
[DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr);
程序中调用如下:
// 关闭重定向
IntPtr oldWOW64State = new IntPtr();
Wow64DisableWow64FsRedirection(ref oldWOW64State);
......
//做完需要的操作后,恢复重定向
Wow64RevertWow64FsRedirection(oldWOW64State);
评论区