以编程方式区分Windows中的USB软盘驱动器和USB闪存驱动器

时间:2009-11-25 14:07:31

标签: c++ wmi usb wdk floppy

在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: How to change drive letter assignments in Windows XP)或者看一下描述,但我真的想要更可靠的东西。

很抱歉很长的解释,但只是想清楚!感谢

4 个答案:

答案 0 :(得分:5)

您是否尝试过Win32_LogicalDisk.MediaType?它具有特定的软盘枚举。确保在驱动器中没有磁盘时尝试使用它。

答案 1 :(得分:5)

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

您可以收集一些提示: Floppies应该: 一个。有大容量存储协议CBI / CB 湾SCSI UFI

但是,在USB设备的世界里,每个人都做他们想做的事。唯一的测试是:“它是否适用于Windows”。 Windows只是检查大小,如果它是带有可移动媒体设置和传统软盘大小的USB设备,它会认为它是一张软盘。

不能说“真正的”软盘,但附带USB,没有明确的方法。

答案 2 :(得分:4)

你可以使用尺寸属性(USB> 1.4MB),这可能不会很快有机会满足1.4MB的闪存驱动器。

答案 3 :(得分:4)

要检查的明显属性是IOCTL_DISK_GET_DRIVE_GEOMETRY。这会让你(除其他外)成为MEDIA_TYPE。除RemovableMediaFixedMedia之外的任何内容都是软盘。