2009-11-25 15 views
7

En Windows (XP-7), ¿existe una forma confiable de diferenciar programáticamente entre unidades de disquete USB y unidades flash USB en C++?Diferenciación programática entre unidad de disquete USB y unidad flash USB en Windows

Por el momento, estoy usando WMI para obtener actualizaciones cuando se detectan nuevas instancias Win32_LogicalDisk y luego uso el atributo DriveType del objeto LogicalDisk para descubrir un tipo básico. Esto funciona bastante bien, excepto que las unidades de disquete y unidades flash USB son de DriveType DRIVE_REMOVABLE, por lo que para diferenciar entre ellas (disquete o flash), estoy usando la interfaz IOCTL_STORAGE_GET_HOTPLUG_INFO para averiguar si el dispositivo es hotpluggable, y estaba funcionando en el principal, eso significaba que era una unidad flash y no un disquete. De nuevo, creo que esto funciona bastante bien (aunque es un poco ineficiente, usando tanto WDK API como WMI para obtener información) en el caso de unidades de disquete internas, pero desafortunadamente las unidades de disquetes USB también se calientan mucho la mayoría de las veces, por lo que hay no hay una manera clara de diferenciar entre las unidades de disquete flash y USB, que puedo ver. Sé que hay propiedades que pueden funcionar, como verificar si está mapeada a las unidades reservadas A: o B (editar: solo relevante si la máquina definitivamente tiene una disquetera - ver MS-KB: How to change drive letter assignments in Windows XP), o mirar la descripción, pero yo Realmente me gustaría algo un poco más confiable.

Disculpa por la larga explicación, ¡pero solo quería ser claro! Gracias

+1

A: y B: ¿están reservados para disquetes? ¿Fuente? – MSalters

+1

Lo obtuve de [MS-KB: Cómo cambiar las asignaciones de letras de unidad en Windows XP] (http://support.microsoft.com/kb/307844), y es la forma en que lo dicen, pero como también lo señala , si la máquina no tiene una unidad de disquete, entonces pueden usarse para otras unidades, por lo que podría decirse que es un nombre inapropiado, y ciertamente no indica que la unidad sea una unidad de disquete o no. Reescribiré la pregunta para que quede un poco más clara. – user82116

+0

Ah, eso es desde el punto de vista del usuario, cuando está cambiando manualmente las letras de unidad. Tiene sentido entonces, estaba pensando desde un punto de vista del sistema operativo. – MSalters

Respuesta

5

¿Has probado Win32_LogicalDisk.MediaType? Tiene enumeraciones específicas para disquetes. Asegúrese de probarlo cuando no haya ningún disco en la unidad.

+0

En caso de que alguien más lo necesite, mi prueba encontró que devuelve correctamente un tipo de medio aproximado (ciertamente lo suficientemente bueno para disquete USB vs. unidad flash) cuando no hay medios presentes, pero esto no está garantizado - de los [documentos] (http://msdn.microsoft.com/en-us/library/aa394173%28VS.85%29.aspx): "Win32_LogicalDisk.Media Type: Tipo de medio actualmente presente en la unidad lógica. Este valor será uno de los valores de la enumeración MEDIA_TYPE definidos en Winioctl.h. El valor puede no ser exacto para unidades extraíbles si actualmente no hay medios en la unidad. " – user82116

+0

Por supuesto, la situación "sin medios en la unidad" implica que se trata de una unidad de carga de medios y, por lo tanto, no es una unidad flash USB. – MSalters

+0

Ver mi respuesta a continuación. Además, muchos discos flash usb comenzarán a declararse como "medios extraíbles" y comenzarán por "sin medios en la unidad" (y señalarán los medios insertados una vez que estén listos para aceptar comandos) – Boris

4

Puede usar el atributo Tamaño (USB> 1.4MB), no es como si hubiera alguna posibilidad de encontrar una unidad flash de 1.4MB pronto.

+0

Mejor hacer que 2.88 MB, aunque creo que el formato de disquete era poco común fuera de Japón. – MSalters

+0

No lo hago si toda la unidad Zip (que admite hasta 750 MB) tampoco se considera disquete. –

5

En el nivel de USB, no hay forma de diferenciar entre un Disk on Key convencional y un USB-Floppy. Lo que significa windows en sí mismo, no puede decir confiablemente qué es qué.

Hay algunos consejos que puede recopilar: Los disquetes deben: a. Tiene un protocolo de almacenamiento masivo CBI/CB b. SCSI UFI

PERO, en el mundo de los dispositivos USB, todos hacen lo que quieran. La única prueba es: "Funciona en Windows". Y Windows simplemente verifica el tamaño, si es un dispositivo USB con medios extraíbles y con tamaños de disquetes convencionales, lo considerará un disquete.

No se puede decir sobre el disquete "real", pero con el USB conectado, no hay una manera definitiva.

3

La propiedad obvia para comprobar sería IOCTL_DISK_GET_DRIVE_GEOMETRY. Esto te lleva (entre otras cosas) a MEDIA_TYPE. Cualquier cosa menos RemovableMedia y FixedMedia es un disquete.

Cuestiones relacionadas