问题
我们公司生产运行Windows XP的专用设备(准确地说是Windows XPe).我们面临的一个不折不扣的法律要求是我们必须快速检测何时删除固定的 IDE驱动器.很快就会在几秒钟内完成.
有问题的驱动器是IDE驱动器.它们还具有软件保护,不受具有EWF(增强型写过滤器)层的写入的影响.EWF层位于文件系统下,保护磁盘不受写入影响.如果在受EWF保护的卷上更改或写入某些内容,则实际更改仅在内存层中发生(但文件系统不知道这一点).
问题是Windows本身似乎没有注意到固定驱动器的移除.您可以将驱动器从计算机中取出,Windows资源管理器很乐意让您浏览目录甚至打开文件(如果它们仍然在内存中缓存).由于EWF层,我甚至可以将文件写入丢失的驱动器.
我需要一个干净的纯软件解决方案.理想情况下在C#/.Net 1.1中,但我使用pinvoke或C++没有问题.
我不能做的事情
目前尴尬的解决方案
我对目前的解决方案不满意.我正在寻找更优雅,更高效的东西.
我目前正在做的涉及两个线程.
线程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);
Run Code Online (Sandbox Code Playgroud)
然后通过调用轮询驱动器
Kernel32.FlushFileBuffers(fileHandle);
Run Code Online (Sandbox Code Playgroud)
如果驱动器已被删除,则线程A将在返回错误代码之前挂起很长时间.
线程B轮询线程A.
如果线程B看到线程A已被锁定(暂时没有更新特殊变量),则线程B引发一个已删除驱动器的事件.
我当前的解决方案有效,但我不喜欢它.如果有人知道更清洁的软件解决方案,我将不胜感激.
我感到震惊和惊讶的是,如果你拔出固定的 IDE 驱动器,系统不会崩溃。就像,真的很震惊。但是,嘿...
你确定不能用强力胶来解决这个问题吗?:)
首先,Windows 之所以没有注意到,是因为设备删除的通知必须来自总线驱动程序。在这种情况下,IDE 总线不支持我们所说的“意外删除”,因此没有人会被告知磁盘已拔出。我怀疑通信刚刚开始超时,这就是你的同花技巧起作用的原因。
但不确定您是否会想出任何更清洁的解决方案。如果您确实非常需要此功能并且可以将其限制为特定的 XP 版本,那么有人可能能够分析此处涉及的驱动程序并利用一条可以为您提供更快结果的路径。但 Windows 中显然没有任何架构可以处理这个问题,所以这就像真正的工作一样。
-斯科特