Программно дифференцирование между USB Floppy Drive и USB Flash Drive в Windows
Вопрос
В Windows (XP-7) есть ли надежный способ программного дифференциации между USB-дисководами и USB-флэш-накопителями в C ++?
На данный момент я использую WMI, чтобы получить обновления, когда новые Win32_LogicalDisk
Обнаружены экземпляры, а затем с использованием атрибута DriveType объекта LogicalDisk для выяснения основного типа. Это работает довольно хорошо, за исключением того, что гибкие диски и USB -флэш -накопители оба из DriveType DRIVE_REMOVABLE
, чтобы различать эти (гибкие и вспышки), я использую IOCTL_STORAGE_GET_HOTPLUG_INFO
Интерфейс, чтобы выяснить, является ли устройство горячее, и работал над принципалом, что это означало, что это был флэш -накопитель, а не дискета. Опять же, я думаю, что это работает довольно хорошо (если немного неэффективно, используя как WDK API, так и WMI для получения информации) в случае внутренних дискет Нет четкого способа различения между Flash и USB -гибкими дисками, которые я вижу. Я знаю, что есть свойства, которые май Работа, например, проверка, нанес ли он сопоставлен с зарезервированными дисками A: или B (редактировать: ТОЛЬКО УДИВАЕТСЯ, только если у машины определенно есть гибкий диск - см. MS-KB: как изменить назначения букв с диска в Windows XP), или глядя на описание, но я бы очень хотел что -то более надежное.
Извините за длительное объяснение, но просто хотел прояснить! Спасибо
Решение
Вы пробовали win32_logicaldisk.mediatype? У него есть особые перечисления для дисководов. Убедитесь, что вы попробуете, когда в драйве нет диска.
Другие советы
На уровне USB нет способа различить обычный диск на ключе и USB-флоппи. Что означает сами Windows, не может достоверно сказать, что есть.
Есть несколько подсказок, которые вы можете собрать: флопы должны: a. Иметь протокол массового хранения CBI/CB B. Scsi ufi
Но в мире USB -устройств все делают все, что хотят. Единственный тест: «работает ли он на Windows». И Windows просто проверяет размер, если это USB-устройство со съемным средним набором и с обычными гибкими размерами, оно считает его гибкой.
Не могу сказать о «настоящем» дискете, но с прикрепленным USB нет определенного способа.
Вы можете использовать атрибут Size (USB> 1,4 МБ), не так, как в ближайшее время есть шанс встретиться с 1,4 МБ.
Очевидное свойство для проверки будет IOCTL_DISK_GET_DRIVE_GEOMETRY
. Анкет Это заставляет вас (среди прочего) MEDIA_TYPE
. Анкет Все, кроме RemovableMedia
а также FixedMedia
это дискета.