7

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

目前,我使用 WMI 在Win32_LogicalDisk检测到新实例时获取更新,然后使用 LogicalDisk 对象的 DriveType 属性来确定基本类型。这很好用,除了软盘驱动器和 USB 闪存驱动器都是 DriveType DRIVE_REMOVABLE,所以为了区分它们(软盘与闪存),我使用IOCTL_STORAGE_GET_HOTPLUG_INFO接口来确定设备是否可热插拔,并且正在处理意味着它是闪存驱动器而不是软盘的主体。再一次,我认为这在内部软盘驱动器的情况下非常有效(如果效率有点低,使用 WDK API 和 WMI 来获取信息),但不幸的是 USB 软盘驱动器在很多时候也是热插拔的,所以有我可以看到,没有明确的方法可以区分闪存和 USB 软盘驱动器。我知道有些属性可能会起作用,比如检查它是否映射到保留的驱动器 A: 或 B(编辑:仅当机器肯定有软盘驱动器时才相关 - 请参阅MS-KB:如何在 Windows XP 中更改驱动器号分配),或查看描述,但我真的想要更可靠的东西。

很抱歉解释太长,但只是想清楚一点!谢谢

4

4 回答 4

5

你试过 Win32_LogicalDisk.MediaType 吗?它具有针对软盘的特定枚举。确保在驱动器中没有磁盘时尝试它。

于 2009-11-25T15:44:49.410 回答
5

在 USB 级别上,无法区分传统的 Disk on Key 和 USB 软盘。这意味着 Windows 本身无法可靠地分辨出什么是什么。

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

但是,在 USB 设备的世界中,每个人都可以为所欲为。唯一的测试是:“它是否适用于 Windows”。Windows 只是检查大小,如果它是带有可移动媒体集和传统软盘大小的 USB 设备,它会认为它是软盘。

不能说“真正的”软盘,但在连接 USB 的情况下,没有明确的方法。

于 2009-11-26T08:49:12.063 回答
4

您可以使用 Size 属性(USB > 1.4MB),这并不意味着很快就会遇到 1.4MB 闪存驱动器。

于 2009-11-25T14:47:13.413 回答
4

要检查的明显属性是IOCTL_DISK_GET_DRIVE_GEOMETRY. 这让你(除其他外)一个MEDIA_TYPE. RemovableMedia除了和之外的任何东西FixedMedia都是软盘。

于 2009-11-26T10:07:55.463 回答