Windows 如何确定哪些驱动器(卷)显示在“中”;“安全拆除硬件”;对话

Windows 如何确定哪些驱动器(卷)显示在“中”;“安全拆除硬件”;对话,windows,winapi,storage,wdk,Windows,Winapi,Storage,Wdk,我有一个监视文件系统事件的应用程序。这需要目标卷的永久打开句柄。这对于系统引导驱动器和其他固定设备来说是很好的,但如果我们处理托管在可移动设备(如eSATA、USB、Firewire、iSCSI等)上的卷,这是非常不可取的,因为用户可能随时都想拔出这些设备,但打开的手柄将阻止“安全删除硬件”的成功 理想情况下,我希望防止我的应用程序锁定到任何其父级可能出现在“安全删除硬件”中作为默认值的卷上。问题是,似乎没有一种记录在案的方法来确定哪些设备出现了,哪些设备没有。我错过什么了吗?有人有线索吗 请注

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

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

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


-scott

设备是否显示在“安全删除”中并不取决于它是什么设备,而是取决于用于安装它的安装标志。我不确定Windows如何决定使用什么标志,但这不是我的重点。我的观点是,您应该能够枚举设备主装载点的装载标志,并检查是否设置了可移动标志。这可能会让您开始。@margnus1-GetDriveType将提供上述枚举中可用信息的子集,它肯定不会为esata/sata设置可移动/固定标志。但是关于标志。。。您将我推向SetupDiGetDeviceRegistryProperty,它似乎能够提供“可移动”、“支持弹出”等功能。这可能就是它!一些进一步的研究表明,我的问题实际上是这个(名称不太恰当)条目的重复: