2009-04-09 9 views
9

Tengo varias unidades USB conectadas a una computadora WinXP SP3, y tengo que distinguirlas programáticamente - Necesito encontrar qué letra de unidad corresponde a qué dispositivo (en este caso, un dispositivo ~ un volumen). Puedo conseguir sus identificadores de volumen y letras de unidad mediante mountvol, buscando algo como esto:Buscar qué unidad corresponde a qué dispositivo de almacenamiento masivo USB en WinXP

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, puedo 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 han 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):

Generic volume - A: http://stuff.piskvor.org/safely_remove.png

Como 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 relatedquestions, pero esos parecen utilizar el enfoque "lo que encuentres primero es tu dispositivo USB", que no es muy útil en mi caso, ya que habrá varios dispositivos similares (el mismo proveedor, a menudo el mismo tipo de producto) conectado.


Editar:

@MSalters 'respuesta parece prometedor: En XP, HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices tiene REG_BINARY valores \DosDevices\x: (donde es x [A-Z]); el comentario es (UTF-16) 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 más arriba en la lista de dispositivos).

a ver si ese es el camino a seguir.

+0

¿Alguna vez encontró la manera de hacer esto? También estoy tratando de determinar el volumen montado para un dispositivo de almacenamiento masivo USB. Gracias. –

+0

@Stephen Nutt: No, en realidad no; era demasiado complicado, había pasado demasiado tiempo cavando en él, en comparación con la tarea general; el uso de API no documentadas puede ser demasiado complicado. (Además, los cambios en la tarea general han planteado la necesidad de esto para mí) – Piskvor

+0

@Stephen Nutt: Aunque he abandonado este esfuerzo en Windows, ahora he encontrado una forma de hacerlo en Linux, si estás interesado: http://stackoverflow.com/questions/3881449/find-which-drive-corresponds-to-which-usb-mass-storage-device-in-linux – Piskvor

Respuesta

5

No es una pregunta trivial. No hay una API oficial, por lo que puedo decir. Por lo tanto, necesita una API no documentada: el registro HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices contiene entradas para las letras de unidad y las ID de volumen. en los datos reales, encontrará que identifica el disco. Mire los datos binarios como una cadena Unicode. Le indicará HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ENUM\. Sin embargo, XP y Vista difiere exactamente en qué subclaves se hace referencia allí, y cómo. (Vista es más fácil, así que intente eso primero).

+1

Esto es incorrecto. Hay una API oficial para hacerlo. Se hace usando IOCTL_STORAGE_GET_DEVICE_NUMBER. Esta es una muestra justa: http://www.codeproject.com/KB/system/RemoveDriveByLetter.aspx – Ilya

2

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

El principio es que a cada volumen de almacenamiento en Windows se le asigna un número global. Primero, solicite su número a la unidad (abriendo "\ X:" y enviando una solicitud de IOCTL_STORAGE_GET_DEVICE_NUMBER). En segundo lugar, revisa todos los dispositivos de disco y pregunta a cada uno su número (abriéndolo, a través de una ruta diferente, para que no pueda simplemente comparar cadenas).

Una vez que encuentre un dispositivo de disco con el mismo número que ha consultado su unidad, sabrá que tiene un ganador.

+0

Hmmm, ese enlace parece interesante. ¿Podría editar un breve resumen en su respuesta? Gracias. – Piskvor

Cuestiones relacionadas