雷达智富

首页 > 内容 > 程序笔记 > 正文

程序笔记

在64位的Windows系统下运行32位的C#程序如何控制重定向

2024-08-22 55

前言

在64位的Windows操作系统中,为了兼容32位程序的运行,并且让32位程序在64位的操作系统中不仅能操作关键文件文夹和关键的注册表,并且又要避免与64位程序的冲突,64位的操作系统采取了重定向机制。
image

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); 

本文地址:https://www.cfnotes.com/archives/144

更新于:3个月前
赞一波!3

文章评论

评论问答