在Windows中以编程方式区分USB软盘驱动器和USB闪存驱动器 在Windows(XP7)上,C++中有一种可靠的方式区分USB软盘驱动器和USB闪存驱动器吗?

在Windows中以编程方式区分USB软盘驱动器和USB闪存驱动器 在Windows(XP7)上,C++中有一种可靠的方式区分USB软盘驱动器和USB闪存驱动器吗?,c++,wmi,usb,wdk,floppy,C++,Wmi,Usb,Wdk,Floppy,目前,我正在使用WMI在检测到新实例时获取更新,然后使用LogicalDisk对象的DriveType属性确定基本类型。这工作得很好,除了软盘驱动器和USB闪存驱动器都是DriveTypeDRIVE\u REMOVABLE,所以为了区分它们(软盘和闪存),我使用接口来确定设备是否可热插拔,并根据原理工作,这意味着它是闪存驱动器而不是软盘。同样,我认为这在内部软驱的情况下非常有效(如果效率有点低,使用WDK API和WMI来获取信息),但不幸的是,USB软驱在很多时候也是可热插拔的,所以我可以看到

目前,我正在使用WMI在检测到新实例时获取更新,然后使用LogicalDisk对象的DriveType属性确定基本类型。这工作得很好,除了软盘驱动器和USB闪存驱动器都是DriveType
DRIVE\u REMOVABLE
,所以为了区分它们(软盘和闪存),我使用接口来确定设备是否可热插拔,并根据原理工作,这意味着它是闪存驱动器而不是软盘。同样,我认为这在内部软驱的情况下非常有效(如果效率有点低,使用WDK API和WMI来获取信息),但不幸的是,USB软驱在很多时候也是可热插拔的,所以我可以看到,没有明确的方法来区分闪存和USB软驱。我知道有些属性可能会起作用,比如检查它是否映射到保留驱动器A:或B(编辑:仅当机器确实有软盘驱动器时才相关-请参阅),或者查看描述,但我确实希望有更可靠的属性


抱歉解释得太长了,但我只是想说清楚!谢谢

您可以使用大小属性(USB>1.4MB),这并不是说很快就有可能遇到1.4MB闪存驱动器。

您是否尝试过Win32_LogicalDisk.MediaType?它具有软盘的特定枚举。确保在驱动器中没有磁盘的情况下进行尝试。

在USB级别上,无法区分传统的带钥匙磁盘和USB软盘。这意味着windows本身无法可靠地判断什么是什么

您可以收集一些提示: 软盘应: A.具有大容量存储协议CBI/CB BSCSI UFI

但是,在USB设备的世界里,每个人都可以随心所欲。唯一的测试是:“它在windows上工作吗?”。Windows只是检查大小,如果它是一个带有可移动介质集和传统软盘大小的USB设备,它会认为它是软盘。
不能说是“真正的”软盘,但是连接了USB,没有明确的方法。

要检查的明显属性是
IOCTL\u DISK\u GET\u DRIVE\u GEOMETRY
。这将使您(除其他外)获得一种
媒体类型
。除了
RemovableMedia
FixedMedia
以外的任何东西都是软盘。

a:和B:是为软盘保留的吗?来源?我是从那里得到的,这是他们的表达方式,但正如它也指出的,如果机器没有软盘驱动器,那么它们可能会被用于其他驱动器,因此可以说这是一个用词不当的说法,当然也不表示该驱动器是不是软盘驱动器。我将改写这个问题,让它更清楚。啊,这是从用户的角度来看的,当您手动更改驱动器号时。有道理的话,我是从OS的角度思考的。最好是2.88 MB,虽然我认为软盘格式在日本以外是不常见的。如果所有的ZIP驱动器(支持750MB)也不被认为是软盘,我也不认为。如果有其他人需要这个,我的测试发现它确实返回了一个近似的媒体类型。(对于USB软盘和闪存驱动器来说,这当然足够了)在没有介质的情况下,但这并不能保证,因为:“Win32_LogicalDisk.Media Type:逻辑驱动器中当前存在的媒体类型。此值将是Winioctl.h中定义的媒体类型枚举的值之一。如果驱动器中当前没有媒体,则可移动驱动器的值可能不准确。”当然,“驱动器中没有媒体”的情况“意味着它是一个介质加载驱动器,因此不是USB闪存驱动器。请参阅下面的回复。此外,许多USB闪存磁盘将开始声明自己为“可移动介质”,并以“驱动器中无介质”开始(一旦准备好接受命令,将发出插入介质的信号)