Pesquisar qual unidade corresponde ao qual dispositivo de armazenamento em massa USB no WinXP

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

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):

Generic volume - A:
(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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top