在64位的Windows系统下运行32位的C#程序如何控制重定向
2024-08-22
55
前言
在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);
本文地址:https://www.cfnotes.com/archives/144
更新于:3个月前赞一波!3
相关文章
- 【说站】java程序编好了怎么运行
- 【说站】java程序怎么运行
- LinkWeChat开源系统
- 每一个程序员,都希望能成为分布式系统架构师
- 【说站】python程序的执行原理
- 游戏陪玩系统语音聊天系统商业版源码安装教程
- WinToUSB | 把Windows塞进U盘里即插即用
- 【说站】python系统内置方法如何获取
- 【说站】python os怎样处理系统文件
- 10个技巧优化PHP程序Laravel 5框架
- 系统架构7个非功能性需求
- windows桌面应用GUI框架选择及其优缺点
- jwt 小程序接口鉴权 【firebase 6.x】
- mac 系统 homebrew 管理 PHP
- 微信小程序用户隐私保护协议填写范本
- 小程序中商家入驻提醒、新订单提醒
- 微信小程序中的支付宝支付
- TP6.0 空控制器: 健壮系统服务
- Web网页版Windows源码
- uniapp 微信小程序 控制台警告和错误处理
文章评论
评论问答