Pesquisar qual unidade corresponde ao qual dispositivo de armazenamento em massa USB no WinXP
-
06-09-2019 - |
Pergunta
Eu tenho várias unidades USB conectado a um computador WinXP SP3, e eu preciso distingui-los programaticamente - Eu preciso encontrar o que de letra de unidade corresponde ao qual dispositivo (neste caso, um dispositivo ~ um volume). Eu posso obter os seus IDs de volume e letras de unidade usando mountvol
, procurando algo como isto:
C:\WINDOWS\> mountvol
\\?\Volume{bdb681b2-1ddf-11dd-bf71-806d6172696f}\
C:\
\\?\Volume{6a8784f8-7406-11dd-a8c3-001e8c829b67}\
A:\
Além disso, usando devcon ou o Gerenciador de dispositivos, posso ver os IDs de dispositivos:
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
No entanto, eu não encontrei uma maneira de vincular o ID do dispositivo e do volume ID / carta, como o diálogo "Remover hardware com segurança" faz (portanto, I supor que é possível):
(fonte: piskvor.org )
Como você pode ver, estes são os mesmos dispositivos que vejo em devcon eo mesmo volume que mountvol vê; mas até agora eu não encontrei a ligação entre eles.
Eu encontrei alguns relacionados questions , mas aqueles parecem usar a abordagem "tudo o que você encontrar primeiro é o dispositivo USB", o que não é muito útil no meu caso, uma vez que haverá vários dispositivos semelhantes (mesmo fornecedor, muitas vezes mesmo tipo de produto) conectados.
Editar:
@ MSalters ' resposta parece promissor: No XP, HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices
tem valores REG_BINARY
\DosDevices\x:
(onde x
é [AZ]); o comentário é o nome do dispositivo correcto (UTF-16) (por exemplo
\DosDevices\A:
= "\??\STORAGE#RemovableMedia#7&190c24e5&0&RM#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}\"
, o que corresponde a
STORAGE\REMOVABLEMEDIA\7&190C24E5&0&RM
visto acima na lista de dispositivos).
Vai ver se esse é o caminho a percorrer.
Solução
É uma questão não-trivial. Não há nenhuma API oficial para ele, tanto quanto eu posso dizer. Então, você precisa de uma API não documentada: o registro. HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices
contém entradas para as duas letras de unidade e IDs de volume. Se você olhar para os dados reais, você vai descobrir que ele identifica a unidade. Olhe para os dados binários como uma seqüência de caracteres Unicode. Ele irá apontar-lhe HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ENUM\
. No entanto, XP e Vista diferem em exatamente o que subchaves são referenciados lá, e como. (Vista é mais fácil, de modo a tentar que o primeiro).
Outras dicas
Há uma API oficial para fazer isso. Veja este exemplo: http://www.codeproject.com/KB/system/RemoveDriveByLetter.aspx
O princípio é que cada volume de armazenamento no Windows é atribuído um número global. Primeiro, você pergunte ao seu carro para seu número (por abertura "\ X:" e enviar um pedido IOCTL_STORAGE_GET_DEVICE_NUMBER
). Segundo, você passar por cima de todos os dispositivos de disco e peça a cada um para seu número (abrindo-o, através de um caminho diferente, então você não pode simplesmente string de comparar).
Depois de encontrar um dispositivo de disco transportar o mesmo número que você consultado seu disco, você sabe que tem um vencedor.