草庐IT

c# - 在 Windows XP 中快速检测固定 IDE 驱动器的移除

coder 2023-11-11 原文

问题

我们公司生产运行 Windows XP(准确地说是 Windows XPe)的专用设备。我们面临的一项严格的法律要求是,我们必须快速检测何时移除了固定 IDE 驱动器。几秒钟之内很快。

有问题的驱动器是 IDE 驱动器。它们还通过 EWF(增强型写入过滤器)层进行软件保护以防止写入。 EWF 层位于文件系统之下,保护磁盘免受写入。如果您在受 EWF 保护的卷上更改或写入某些内容,实际更改仅发生在内存层中(但文件系统不知道这一点)。

问题是 Windows 本身似乎没有注意到固定驱动器的移除。您可以将驱动器从机器中取出,Windows Explorer 将很乐意让您浏览目录,甚至可以打开文件(如果它们碰巧仍缓存在内存中)。多亏了 EWF 层,我什至可以将文件写入丢失的驱动器。

我需要一个干净的纯软件解决方案。理想情况下在 C#/.Net 1.1 中,但我对使用 pinvoke 或 C++ 没有问题。


我不能做的事情

  • 不,我无法用新硬件改造数千台设备。
  • 不,我们不能仅仅使用强力胶驱动器来满足法律要求。
  • 不,由于 EWF 层,正常的文件写入/读取不会检测到这种情况。
  • 不,我们不能关闭 EWF 层。
  • 不,我不能忽视法律要求,即使它们很愚蠢。
  • 不,我无法像检测 USB 或其他可移动驱动器那样检测固定驱动器的移除。这些是固定驱动器。
  • 不,我不会使用 WMI (Windows Management Instrumentation)。我们的机器上没有安装它。
  • 不,我不能使用 1.1 之后的 .Net 版本。它不适合我们的小型驱动器。 (但如果更高版本的 .Net 中存在简单的解决方案,我也许可以将其移植回 1.1。)

目前尴尬的解决方案

我对我们当前的解决方案不满意。我正在寻找更优雅、更高效的东西。

我目前正在做的事情涉及两个线程。

线程 A 轮询驱动器。它首先使用 Kernel32.dll 在驱动器上创建一个特殊文件:

Kernel32.CreateFile(
    filename,
    File_Access.GenericRead | File_Access.GenericWrite,
    File_Share.Read | File_Share.Write,
    IntPtr.Zero,
    CreationDisposition.CreateAlways,
    CreateFileFlagsAndAttributes.File_Attribute_Hidden | CreateFileFlagsAndAttributes.File_Attribute_System,
    IntPtr.Zero);

然后它通过调用轮询驱动器

Kernel32.FlushFileBuffers(fileHandle);

如果驱动器已被移除,则线程 A 将挂起很长时间,然后返回错误代码。

线程 B 轮询线程 A。

如果线程 B 发现线程 A 已锁定(一段时间内未更新特殊变量),则线程 B 会引发驱动器已被移除的事件。


我当前的解决方案有效,但我不喜欢它。如果有人知道更清洁的纯软件解决方案,我将不胜感激。

最佳答案

如果您拔出一个固定的 IDE 驱动器,系统不会死机,这让我感到震惊和惊讶。就像,真的很震惊。但是,嘿...

你确定不能只用强力胶解决这个问题吗? :)

首先,Windows 没有注意到的原因是因为设备删除通知必须来自总线驱动程序。在这种情况下,IDE 总线不支持我们所说的“意外删除”,因此没有人会被告知磁盘已拔出。我怀疑通信刚刚开始超时,这就是为什么您的同花顺技巧起作用的原因。

但不确定您是否会想出任何更清洁的解决方案。如果您真的、真的需要它并且可以将它限制在特定版本的 XP 上,那么有人可能能够分析这里涉及的驱动程序并利用一条可以让您更快获得结果的路径。但显然 Windows 中没有任何架构来处理这个问题,所以这就像真正的工作。

-斯科特

关于c# - 在 Windows XP 中快速检测固定 IDE 驱动器的移除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3727717/

有关c# - 在 Windows XP 中快速检测固定 IDE 驱动器的移除的更多相关文章

  1. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  2. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  3. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  4. ruby-on-rails - 如何在 Ruby on Rails 中实现由 JSF 2.0 (Primefaces) 驱动的 UI 魔法 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道ruby​​onrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim

  5. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  6. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  7. ruby - 在 Ruby 中将整数格式化为固定长度的字符串 - 2

    有没有一种简单的方法可以将给定的整数格式化为具有固定长度和前导零的字符串?#convertnumberstostringsoffixedlength3[1,12,123,1234].map{|e|???}=>["001","012","123","234"]我找到了解决方案,但也许还有更聪明的方法。format('%03d',e)[-3..-1] 最佳答案 如何使用%1000而不是进行字符串操作来获取最后三位数字?[1,12,123,1234].map{|e|format('%03d',e%1000)}更新:根据theTinMan的

  8. ruby - 检测由 RSpec、Ruby 运行的代码 - 2

    我想知道我的代码是否在rspec下运行。这可能吗?原因是我正在加载一些错误记录器,这些记录器在测试期间会被故意错误(expect{x}.toraise_error)弄得乱七八糟。我查看了我的ENV变量,没有(明显的)测试环境变量的迹象。 最佳答案 在spec_helper.rb的开头添加:ENV['RACK_ENV']='test'现在您可以在代码中检查RACK_ENV是否经过测试。 关于ruby-检测由RSpec、Ruby运行的代码,我们在StackOverflow上找到一个类似的问题

  9. ruby - 使用 Ruby Daemons gem 检测停止 - 2

    我正在使用rubydaemongem。想知道如何向停止操作添加一些额外的步骤?希望我能检测到停止被调用,并向其添加一些额外的代码。任何人都知道我如何才能做到这一点? 最佳答案 查看守护程序gem代码,它似乎没有用于此目的的明显扩展点。但是,我想知道(在守护进程中)您是否可以捕获守护进程在发生“停止”时发送的KILL/TERM信号...?trap("TERM")do#executeyourextracodehereend或者你可以安装一个at_exit钩子(Hook):-at_exitdo#executeyourextracodehe

  10. ruby - 如何以表格格式快速打印 Ruby 哈希值? - 2

    有没有办法快速将表格格式的ruby​​哈希打印到文件中?如:keyAkeyBkeyC...1232343451253474456...其中散列的值是不同大小的数组。还是使用双循环是唯一的方法?谢谢 最佳答案 试试我写的这个gem(在表中打印散列、ruby对象、ActiveRecord对象):http://github.com/arches/table_print 关于ruby-如何以表格格式快速打印Ruby哈希值?,我们在StackOverflow上找到一个类似的问题:

随机推荐