gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:47:58 24 4
gpt4 key购买 nike

问题

我们公司生产运行 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com