0

我有一个监视文件系统事件的应用程序。这需要目标卷的永久打开句柄。这对于系统引导驱动器和其他固定设备之类的东西很好,但如果我们正在处理托管在可移动设备(如 eSATA、USB、Firewire、iSCSI 等)上的卷,则非常不可取,因为用户可能希望随时拔掉这些时间,但打开的句柄将阻止“安全删除硬件”成功。

理想情况下,我想防止我的应用程序锁定到其父级可能默认出现在“安全删除硬件”中的任何卷上。问题是,似乎没有记录在案的方法来确定哪些设备出现在那里,哪些设备没有。我错过了什么吗?有人有线索吗?

请注意,可以查询设备的总线类型,这几乎可以为我完成工作:

typedef enum _STORAGE_BUS_TYPE {
  BusTypeUnknown             = 0x00,
  BusTypeScsi                = 0x1,
  BusTypeAtapi               = 0x2,
  BusTypeAta                 = 0x3,
  BusType1394                = 0x4,
  BusTypeSsa                 = 0x5,
  BusTypeFibre               = 0x6,
  BusTypeUsb                 = 0x7,
  BusTypeRAID                = 0x8,
  BusTypeiScsi               = 0x9,
  BusTypeSas                 = 0xA,
  BusTypeSata                = 0xB,
  BusTypeSd                  = 0xC,
  BusTypeMmc                 = 0xD,
  BusTypeVirtual             = 0xE,
  BusTypeFileBackedVirtual   = 0xF,
  BusTypeMax                 = 0x10,
  BusTypeMaxReserved         = 0x7F 
} STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE;

然而,IOCTL 为 SATA 和 eSATA 返回 BusTypeSata - 但操作系统将后者识别为必须在“安全删除”对话框中显示的内容。

4

1 回答 1

0

您可以侦听设备事件以了解何时应该关闭句柄:

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

请注意,对于固定设备,您也需要此功能,否则您打开的句柄可能会阻止诸如 chkdsk 之类的东西运行(因为您需要监听锁定/卸载事件)。

-斯科特

于 2011-07-05T15:18:50.370 回答