如何确定“安全删除硬件”对话框中显示的驱动器(卷)?

时间:2011-04-24 21:06:01

标签: windows winapi storage wdk

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

1 个答案:

答案 0 :(得分:0)

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

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

请注意,您也需要这个用于固定设备,否则您的打开句柄可能会阻止chkdsk运行(因为您需要监听锁定/卸载事件)。

-scott