Программное различение USB-флоппи-дисковода и USB-флеш-накопителя в Windows

Есть ли в Windows (XP-7) надежный способ программного различения USB-флоппи-дисководов и USB-флеш-накопителей на C ++?

В настоящий момент я использую WMI для получения обновлений при появлении нового Win32_LogicalDisk экземпляров обнаруживаются, а затем используются атрибут DriveType объекта LogicalDisk для определения базового типа. Это работает довольно хорошо, за исключением того, что и гибкие диски, и USB-устройства флэш-памяти имеют тип DriveType DRIVE_REMOVABLE, поэтому, чтобы отличить их (дискета от флэш-памяти), я использую _ 3_, чтобы выяснить, поддерживает ли устройство горячее подключение, и работал над принципом, который означал, что это был флэш-накопитель, а не дискета. Опять же, я думаю, что это работает довольно хорошо (хотя и немного неэффективно, используя как WDK API, так и WMI для получения информации) в случае внутренних дисководов гибких дисков, но, к сожалению, USB-дисководы гибких дисков также часто подключаются в горячем режиме, поэтому есть Я не вижу четкого способа отличить флеш-накопители от USB-флоппи-дисководов. Я знаю, что есть свойства, которые могут работать, например, проверка того, сопоставлен ли он с зарезервированными дисками A: или B (редактирование: актуально только в том случае, если на машине определенно есть дисковод гибких дисков - см. MS-KB: Как изменить присвоение букв дисков в Windows XP), или глядя на описание, но я бы действительно хотелось что то более надежное.

Извините за долгое объяснение, но просто хочу внести ясность! Спасибо


person user82116    schedule 25.11.2009    source источник
comment
A: и B: зарезервированы для дискет? Источник?   -  person MSalters    schedule 26.11.2009
comment
Я получил это из MS-KB: Как изменить присвоение букв дисков в Windows XP и ее как они это формулируют, но, как это также указывает, если на машине нет дисковода для гибких дисков, то они могут использоваться для других дисководов, так что, возможно, это неправильное название и, конечно, не указывает на то, что дисковод является дисководом для гибких дисков. или нет. Я перефразирую вопрос, чтобы было немного понятнее.   -  person user82116    schedule 26.11.2009
comment
Ах, это с точки зрения пользователя, когда вы вручную меняете буклеты. Тогда это имеет смысл, подумал я с точки зрения ОС.   -  person MSalters    schedule 26.11.2009


Ответы (4)


Вы пробовали Win32_LogicalDisk.MediaType? В нем есть специальные перечисления для гибких дисков. Обязательно попробуйте, когда в дисководе нет диска.

person Hans Passant    schedule 25.11.2009
comment
В случае, если кому-то еще это нужно, мое тестирование показало, что он правильно возвращает приблизительный тип носителя (безусловно, достаточно хороший для USB-дискеты и флэш-накопителя), когда нет носителя, но это не гарантируется - из docs: Win32_LogicalDisk.Media Type: Тип текущего носителя на логическом диске. Это значение будет одним из значений перечисления MEDIA_TYPE, определенного в Winioctl.h. Значение может быть неточным для съемных дисков, если в данный момент в дисководе нет носителя. - person user82116; 30.11.2009
comment
Конечно, ситуация без носителя на накопителе означает, что это носитель для загрузки, а, следовательно, не USB-накопитель. - person MSalters; 02.02.2010
comment
Смотрите мой ответ ниже. Кроме того, многие флэш-диски USB начинают объявлять себя съемными носителями и запускаются без носителя в приводе (и будут сигнализировать о вставленном носителе, как только они будут готовы принять команды) - person Boris; 02.12.2012

На уровне USB нет возможности отличить обычный диск на ключе от USB-дискеты. Это означает, что сами окна не могут достоверно сказать, что к чему.

Вот несколько советов, которые вы можете собрать: Дискеты должны: a. Иметь протокол массового хранения CBI / CB b. SCSI UFI

НО в мире USB-устройств каждый делает то, что хочет. Единственная проверка: "Работает ли на windows". А Windows просто проверяет размер: если это USB-устройство со съемным носителем и обычными дискетами, оно будет считать его дискетой.

Ничего не скажешь о "настоящей" дискете, но с подключенным USB однозначного пути нет.

person Boris    schedule 26.11.2009

Вы можете использовать атрибут Size (USB> 1,4 МБ), вряд ли в ближайшее время есть шанс встретить флешку на 1,4 МБ.

person Shay Erlichmen    schedule 25.11.2009
comment
Лучше сделайте это 2,88 МБ, хотя я считаю, что формат гибких дисков был редкостью за пределами Японии. - person MSalters; 26.11.2009
comment
Я не знаю, если все Zip-накопители (поддерживающие до 750 МБ) также не считаются гибкими. - person Shay Erlichmen; 26.11.2009

Очевидное свойство для проверки - IOCTL_DISK_GET_DRIVE_GEOMETRY. Это дает вам (среди прочего) MEDIA_TYPE. Все, что угодно, кроме RemovableMedia и FixedMedia, является дискетой.

person MSalters    schedule 26.11.2009