Windows 如何确定哪些驱动器(卷)显示在“中”;“安全拆除硬件”;对话
我有一个监视文件系统事件的应用程序。这需要目标卷的永久打开句柄。这对于系统引导驱动器和其他固定设备来说是很好的,但如果我们处理托管在可移动设备(如eSATA、USB、Firewire、iSCSI等)上的卷,这是非常不可取的,因为用户可能随时都想拔出这些设备,但打开的手柄将阻止“安全删除硬件”的成功 理想情况下,我希望防止我的应用程序锁定到任何其父级可能出现在“安全删除硬件”中作为默认值的卷上。问题是,似乎没有一种记录在案的方法来确定哪些设备出现了,哪些设备没有。我错过什么了吗?有人有线索吗 请注意,可以查询设备的总线类型,这几乎可以帮我完成工作:Windows 如何确定哪些驱动器(卷)显示在“中”;“安全拆除硬件”;对话,windows,winapi,storage,wdk,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的BustypeSta,但操作系统将后者识别为必须在“安全删除”对话框中显示的内容。您可以监听设备事件,以了解何时应关闭句柄: 请注意,对于固定设备,您也需要这样做,否则,您打开的句柄可能会阻止chkdsk之类的东西运行(为此,您需要侦听锁定/卸载事件)
-scott设备是否显示在“安全删除”中并不取决于它是什么设备,而是取决于用于安装它的安装标志。我不确定Windows如何决定使用什么标志,但这不是我的重点。我的观点是,您应该能够枚举设备主装载点的装载标志,并检查是否设置了可移动标志。这可能会让您开始。@margnus1-GetDriveType将提供上述枚举中可用信息的子集,它肯定不会为esata/sata设置可移动/固定标志。但是关于标志。。。您将我推向SetupDiGetDeviceRegistryProperty,它似乎能够提供“可移动”、“支持弹出”等功能。这可能就是它!一些进一步的研究表明,我的问题实际上是这个(名称不太恰当)条目的重复: