在Windows XP中快速检测固定IDE驱动器的删除

时间:2010-09-16 14:34:24

标签: c# .net windows

问题

我们公司生产运行Windows XP的专用设备(准确地说是Windows XPe)。我们面临的一个不折不扣的法律要求是,我们必须快速检测修复的 IDE驱动器何时被移除。很快就会在几秒钟内完成。

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

问题是Windows本身似乎没有注意到固定驱动器的移除。您可以将驱动器拉出机器,Windows资源管理器很乐意让您浏览目录,甚至打开文件,如果它们仍然在内存中缓存。由于EWF层,我甚至可以将文件写入丢失的驱动器。

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


我不能做的事

  • 不,我不能用新硬件改造成千上万的设备。
  • 不,我们不能只是超级胶合驱动器以满足法律要求。
  • 不,由于EWF层,正常的文件写入/读取将无法检测到这种情况。
  • 不,我们无法关闭EWF图层。
  • 不,我不能忽视法律要求,即使它们很愚蠢。
  • 不,我无法像USB或其他可移动驱动器那样检测固定驱动器的移除方式。这些是已修复的驱动器。
  • 不,我不能使用WMI(Windows Management Instrumentation)。它没有安装在我们的机器上。
  • 不,我不能使用.Net 1.1版本。它不适合我们的小型驱动器。 (但如果在更高版本的.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将挂起 long 时间。

主题B 轮询主题A.

如果线程B看到线程A已被锁定(暂时未更新特殊变量),则线程B会引发一个已删除驱动器的事件。


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

2 个答案:

答案 0 :(得分:1)

令我震惊和惊讶的是,如果你拿出一个固定的IDE驱动器,系统不会摔倒。就像,真的很震惊。但是,嘿......

你确定不能用超级胶水来解决这个问题吗? :)

首先,Windows没有注意到的原因是因为设备删除的通知必须来自总线驱动程序。在这种情况下,IDE总线不支持我们所谓的“惊喜删除”,因此没有人被告知磁盘已拔下。我怀疑通信刚开始超时,这就是你的冲洗技巧有效的原因。

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

-Scott

答案 1 :(得分:0)

你有没有看过这里:

http://msdn.microsoft.com/en-us/library/aa363217(VS.85).aspx

看起来像你在找什么。