.NET File.Exists 在 Windows\System32\Drivers 文件夹中不起作用?

2024-04-29

该过程已提升,并且我确保 VS 调试器中的路径是正确的(我使用 Environment.GetFolderPath(Environment.SpecialFolder.System) 而不是对其进行硬编码),但 File.Exists 仍然返回 false。

我需要这个的原因是确保安装一些第三方驱动程序的解决方法,因为它们的注册表设置在卸载时不会被删除。

我知道写入是通过虚拟化重定向的,但是检查文件是否存在也是如此吗?


是的,虚拟化发生在非常低​​的水平。 File.Exists 方法基本上调用 Win32 CreateFile 方法并检查错误。 CreateFile 由 WOW 子系统重定向。

您可以在通话前暂时禁用虚拟化。

[DllImport( "kernel32", CharSet=CharSet.Unicode, SetLastError=true )]
public static extern bool Wow64DisableWow64FsRedirection( ref IntPtr oldValue );

[DllImport( "kernel32", CharSet=CharSet.Unicode, SetLastError=true )]
public static extern bool Wow64RevertWow64FsRedirection( IntPtr oldValue );

当然,为了完成,您必须在虚拟化打开和关闭的情况下检查文件是否存在。这同样适用于检查注册表项。

public static bool FileExists( string path )
{
    if( File.Exists( path ) ) return true;
    IntPtr oldValue = IntPtr.Zero;
    try
    {
        if( Environment.GetEnvironmentVariable( "PROCESSOR_ARCHITEW6432" ) == null )
            return false;

        Wow64DisableWow64FsRedirection( ref oldValue );
        if( File.Exists( path ) ) return true;

        return false;
    }
    finally
    {
        if( oldValue != IntPtr.Zero )
            Wow64RevertWow64FsRedirection( ref oldValue );            
    }   
}

Update:您可能还需要在禁用 WOW 重定向之前检查操作系统版本,因为早期版本的 XP(我认为是 SP2 之前的版本)不会公开这些方法。

更新2:添加了 64 位操作系统检查。所有 64 位版本的操作系统都实现了这些方法,如果在 64 位操作系统上运行,您只需禁用 sate。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET File.Exists 在 Windows\System32\Drivers 文件夹中不起作用? 的相关文章

  • wcf json网络服务

    创建 JSON Web 服务的最佳方法是什么 我们还有另一个使用 Java 的团队 他们坚持使用 JSON 完成所有通信 我更喜欢使用 WCF 而不是任何第三方框架 我找到了这个博客 http www west wind com weblo
  • 抓取内存中的 .net 进程

    我正在尝试保护我用 C 编写的中小型 MMO 但我们遇到了一些黑客问题 我想知道是否有一种方法可以获取当前位于内存中而不是磁盘上的进程的副本 我们在游戏中有一个非常安全的算法 但是它无法阻止人们修改游戏的内存版本 有什么办法可以做到这一点吗
  • 为什么 RestSharp 反序列化两个日期的方式不同?

    我有一个返回此值的休息调用 使用 Chrome 中的 Advance Rest Client 进行测试 MyObject 22 0 ID 123456 UTC1 2013 04 19T03 12 32Z UTC2 2013 04 19T03
  • 为什么 .NET 异步等待文件复制比同步 File.Copy() 调用消耗更多 CPU?

    为什么下面的代码会产生 public static class Program public static void Main params string args var sourceFileName C Users ehoua Desk
  • 在 C# 中实现动态代理的最佳方法是什么?

    我需要在 C 中创建动态代理 我希望这个类包装另一个类 并采用它的公共接口 转发对这些函数的调用 class MyRootClass public virtual void Foo Console Out WriteLine Foo int
  • 中继命令和无参数执行方法

    我目前正在学习 WPF 和 MVVM 我想我已经了解了大部分内容及其工作原理 但我在使用 RelayCommand 或 DelegateCommand 时遇到了一些我不明白的问题 我认为这与代表的工作方式有关 请注意 下面的代码目前仅处于测
  • Sencha Touch 和远程服务器上的身份验证

    我希望收到您关于使用 PhoneGap 和 Sencha Touch 的应用程序以及带有 Active Directory 的 NET 服务器的身份验证机制的反馈 因此 我们需要在移动设备上存储用户凭据 以便用户每次希望使用该应用程序时都不
  • 如何检测Windows版本是否合法? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我对获取版本信息不感兴趣 我想做的就是确保我的应用程序只能在合法版本的 Windows 上运行 而不是在盗版版本上运行 Windows 使
  • 从基础创建 Uri,不带尾部斜杠和相关部分

    我的 Uri 构造函数有问题 基本路径是否以斜杠结尾的结果会有所不同 var baseWithSlash new Uri c Temp var baseNoSlash new Uri c Temp var relative MyApp va
  • C# 中单个 & 符号的第二个含义是什么?

    我在 C 中使用了单个与号 来表示 检查second条件语句即使第一个是false 但以下似乎是不同的意思 of 总而言之 谁能解释一下如何i 1在下面的例子中有效吗 List
  • FullCalendar Asp.Net WebForms

    我正在尝试实施全日历 https i stack imgur com wmhGx png在我的 ASP NET 上WebForms项目 我见过一些实现此目的的示例 但没有任何运气 因为它们是针对我不习惯的 MVC 的 My Events数据
  • 对 URL 进行编码 C#

    所以我有一个看起来像这样的 URL http www test com folder1 id 3 但基本上 当他们单击按钮时 我想在 URL 栏中显示与该 id 关联的值的名称 例如 id 3 是名为 Rollex 的手表 所以我想要读取
  • WPF 中的屏幕分辨率问题?

    我将在 WPF 中使用以下代码检测分辨率 double height System Windows SystemParameters PrimaryScreenHeight double width System Windows Syste
  • 使用 ContractNamespace 属性设置 WCF DataContract 命名空间

    在设计我的服务时 我决定要自定义出现在生成的 WSDL 中的名称空间 对于数据合同 我遇到了合约命名空间 http msdn microsoft com en us library system runtime serialization
  • ASP.NET Core 与现有的 IoC 容器和环境?

    我想运行ASP NET 核心网络堆栈以及MVC在已托管现有应用程序的 Windows 服务环境中 以便为其提供前端 该应用程序使用 Autofac 来处理 DI 问题 这很好 因为它已经有一个扩展Microsoft Extensions D
  • SSL/TLS/HTTPS 站点在 C#/.NET WebBrowser 控件中非常慢,但在 Internet Explorer 中则很好

    背景 我正在修改自动维基浏览器 http en wikipedia org wiki Wikipedia AutoWikiBrowser使用托管在安全服务器上的 MediaWiki 站点 我允许用户通过 C 应用程序中的 WebBrowse
  • 2D morton 码编码/解码 64 位

    如何将给定 x y 的莫顿代码 z 顺序 编码 解码为 32 位无符号整数 生成 64 位莫顿代码 反之亦然 我确实有 xy2d 和 d2xy 但仅适用于 16 位宽的坐标 产生 32 位莫顿数 在网上查了很多 但没有找到 请帮忙 如果您可
  • 使用 WF 的多线程应用程序的错误处理模式?

    我正在写一个又长又详细的问题 但只是放弃了它 转而选择一个更简单的问题 但我在这里找不到答案 应用程序简要说明 我有一个 WPF 应用程序 它生成多个线程 每个线程执行自己的 WF 处理线程和 WF 中的错误 允许用户从 GUI 端进行交互
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • 如何引用解决方案之外的项目?

    我有一个 Visual Studio C 解决方案 其中包含一些项目 其中一个项目需要引用另一个不属于解决方案的项目 一开始我引用了dll

随机推荐