Encuentra qué unidad corresponde a cada dispositivo de almacenamiento masivo USB en Windows XP

StackOverflow https://stackoverflow.com/questions/733206

Pregunta

Tengo varias unidades USB conectados a un ordenador WinXP SP3, y necesito distinguirlos programáticamente - Tengo que encontrar la letra de unidad se corresponde con el dispositivo (en este caso, un dispositivo ~ un volumen). Puedo conseguir sus identificadores de volumen y letras de unidad mediante mountvol, buscando algo como esto:

C:\WINDOWS\> mountvol
\\?\Volume{bdb681b2-1ddf-11dd-bf71-806d6172696f}\
    C:\

\\?\Volume{6a8784f8-7406-11dd-a8c3-001e8c829b67}\
    A:\

Además, el uso devcon o el administrador de dispositivos, que se pueden ver los ID de dispositivo:

C:\WINDOWS\> devcon resources *STOR*
STORAGE\REMOVABLEMEDIA\7&190C24E5&0&RM
    Name: Generic volume
STORAGE\VOLUME\1&30A96598&0&SIGNATURED84ED84EOFFSET7E00LENGTH2543150400
    Name: Generic volume
USBSTOR\DISK&VEN_KINGSTON&PROD_DATATRAVELER2.0&REV_1.00\0803240752536&0
    Name: Kingston DataTraveler2.0 USB Device

Sin embargo, no he encontrado una forma de vincular el ID de dispositivo y el ID de volumen / carta, al igual que el cuadro de diálogo "Quitar hardware con seguridad" hace (por lo tanto, supongo que es posible):

volumen genérico - A:
(fuente: piskvor.org )

Como se puede ver, estos son los mismos dispositivos que veo en devcon y el mismo volumen que mountvol ve; pero hasta ahora no he encontrado el vínculo entre ellos.

He encontrado algunos relacionados questions , pero los que parecen utilizar el enfoque de "lo que encuentre primero es el dispositivo USB", lo cual no es muy útil en mi caso, ya que habrá varios dispositivos similares (mismo proveedor, a menudo mismo tipo de producto) conectados.


Editar:

@ respuesta MSalters ' parece prometedor: En XP, HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices tiene valores REG_BINARY \DosDevices\x: (donde x es [AZ]); el comentario es (UTF-16) el nombre del dispositivo correcto (por ejemplo
\DosDevices\A: = "\??\STORAGE#RemovableMedia#7&190c24e5&0&RM#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}\", que corresponde a
STORAGE\REMOVABLEMEDIA\7&190C24E5&0&RM visto anteriormente en la lista de dispositivos).

A ver si ese es el camino a seguir.

¿Fue útil?

Solución

Es una cuestión trivial. No existe una API oficial para ello, por lo que yo puedo decir. Por lo tanto, necesita una API no documentada: el registro. HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices contiene entradas para las dos letras de unidad y los ID de volumen. Si nos fijamos en los datos reales, encontrará que identifica la unidad. Mira los datos binarios como una cadena Unicode. Se señalará que HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ENUM\. Sin embargo, XP y Vista difieren en exactamente lo subclaves se hace referencia allí, y cómo. (Vista es más fácil, por lo que tratar en primer lugar).

Otros consejos

Hay una API oficial para hacer esto. Vea este ejemplo: http://www.codeproject.com/KB/system/RemoveDriveByLetter.aspx

El principio es que cada volumen de almacenamiento en Windows se le asigna un número mundial. En primer lugar, le pide a su coche por su número (abriendo "\ X:" y el envío de una solicitud IOCTL_STORAGE_GET_DEVICE_NUMBER). En segundo lugar, usted se pasa de todos los dispositivos de disco y pedir a cada uno por su número (abriéndolo, a través de un camino diferente, por lo que puede no sólo cadena de comparar).

Una vez que encuentre un dispositivo de disco que lleva el mismo número que usted se dirigió a su coche, usted sabe que tiene un ganador.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top