我有一个监视文件系统事件的应用程序。这需要目标卷的永久打开句柄。这对于系统引导驱动器和其他固定设备之类的东西很好,但如果我们正在处理托管在可移动设备(如 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 - 但操作系统将后者识别为必须在“安全删除”对话框中显示的内容。