Trovare quale unità corrisponde a quale dispositivo di memoria di massa USB in WinXP
-
06-09-2019 - |
Domanda
Ho diverse unità USB collegate a un computer WinXP SP3, e ho bisogno di distinguerli programatically - Ho bisogno di trovare quale lettera di unità corrisponde a quale dispositivo (in questo caso, un dispositivo ~ un volume). Posso ottenere il loro ID di volume e le lettere di unità utilizzando mountvol
, cercando qualcosa di simile:
C:\WINDOWS\> mountvol
\\?\Volume{bdb681b2-1ddf-11dd-bf71-806d6172696f}\
C:\
\\?\Volume{6a8784f8-7406-11dd-a8c3-001e8c829b67}\
A:\
Inoltre, utilizzando devcon o Gestione periferiche, posso vedere gli ID di 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
Tuttavia, non ho trovato un modo per collegare l'ID del dispositivo e il volume ID / lettera, come la finestra di dialogo "Rimozione sicura dell'hardware" fa (quindi presumo che sia possibile):
(fonte: piskvor.org )
Come si può vedere, questi sono gli stessi dispositivi che vedo in DevCon e lo stesso volume che mountvol vede; ma finora non ho trovato il collegamento tra di loro.
Ho trovato un po 'di relativi questions , ma quelli sembrano utilizzare l'approccio "tutto ciò che si trova prima è la periferica USB", che non è molto utile nel mio caso, dal momento che ci saranno diversi dispositivi simili (stesso fornitore, spesso lo stesso tipo di prodotto) collegati.
Modifica:
@ risposta MSalters ' sembra promettente: su XP, HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices
ha valori REG_BINARY
\DosDevices\x:
(dove x
è [AZ]); il commento è (UTF-16) nome del dispositivo corretto (per esempio
\DosDevices\A:
= "\??\STORAGE#RemovableMedia#7&190c24e5&0&RM#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}\"
, che corrisponde a
STORAGE\REMOVABLEMEDIA\7&190C24E5&0&RM
visto sopra nell'elenco dei dispositivi).
Vedremo se questa è la strada da percorrere.
Soluzione
E 'una questione non banale. Non v'è alcuna API ufficiale per esso, per quanto posso dire. Quindi, è necessario un API non documentata: il Registro di sistema. HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices
contiene voci per entrambi lettere di unità e ID di volume. Se si guardano i dati effettivi, troverete che identifica l'unità. Guardare i dati binari come una stringa Unicode. Si punterà a HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ENUM\
. Tuttavia, XP e Vista si differenziano esattamente ciò che sottochiavi si fa riferimento lì, e in che modo. (Vista è più facile, in modo da provare che il primo).
Altri suggerimenti
C'è un'API ufficiale per fare questo. Vedere questo esempio: http://www.codeproject.com/KB/system/RemoveDriveByLetter.aspx
Il principio è che ogni volume di archiviazione in Windows viene assegnato un numero globale. In primo luogo, si chiede l'unità per il suo numero (con l'apertura di "\ X:" e l'invio di una richiesta IOCTL_STORAGE_GET_DEVICE_NUMBER
). In secondo luogo, si va oltre tutti i dispositivi a disco e chiedere ciascuno per il suo numero (aprendolo, attraverso un percorso diverso, in modo da poter non solo stringa-confrontare).
Una volta trovato un dispositivo a disco che trasporta lo stesso numero, come si interrogato l'unità, sai di avere un vincitore.