Question

J'ai plusieurs disques USB connectés à un ordinateur Windows XP SP3, et je dois leur dire à part programatically - Je dois trouver que la lettre de lecteur correspond à quel périphérique (dans ce cas, un dispositif ~ un volume). Je peux obtenir leur carte d'identité de volume et des lettres de lecteur en utilisant mountvol, regardant quelque chose comme ceci:

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

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

En outre, en utilisant devcon ou le Gestionnaire de périphériques, je peux voir les ID de périphérique:

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

Cependant, je ne l'ai pas trouvé un moyen de relier l'ID et le volume ID / lettre, comme la boîte de dialogue « Retirer le périphérique en toute sécurité » ne (donc je suppose qu'il est possible):


(source: piskvor.org )

Comme vous pouvez le voir, ce sont les mêmes dispositifs que je vois dans devcon et le même volume que mountvol voit; mais jusqu'à présent, je ne l'ai pas trouvé le lien entre eux.

Je l'ai trouvé un peu liées questions , mais ceux qui semblent utiliser l'approche « tout ce que vous trouvez premier est votre périphérique USB », ce qui est pas très utile dans mon cas, car il y aura plusieurs dispositifs similaires (même fournisseur, souvent même type de produit) connectés.


Edit:

@ MSalters réponse « semble prometteur: sur XP, HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices a des valeurs de REG_BINARY \DosDevices\x: (où x est [AZ]); le commentaire est nom (UTF-16) du dispositif approprié (par exemple
\DosDevices\A: = « \??\STORAGE#RemovableMedia#7&190c24e5&0&RM#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}\", ce qui correspond à
STORAGE\REMOVABLEMEDIA\7&190C24E5&0&RM vu plus haut dans la liste des périphériques).

Nous verrons si c'est le chemin à parcourir.

Était-ce utile?

La solution

Il est une question non triviale. Il n'y a pas d'API officielle pour elle, pour autant que je peux dire. , Vous avez besoin d'une API non documentée: le Registre. HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices contient des entrées pour les lettres de lecteur et les ID de volume. Si vous regardez les données réelles, vous trouverez qu'il identifie le lecteur. Regardez les données binaires sous forme de chaîne Unicode. Il pointera vous HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ENUM\. Cependant, XP et Vista diffèrent exactement ce qui y sont référencées sous-clés, et comment. (Vista est plus facile, essayez donc la première).

Autres conseils

Il y a une API officielle pour ce faire. Voir cet exemple: http://www.codeproject.com/KB/system/RemoveDriveByLetter.aspx

Le principe est que chaque volume de stockage sous Windows est attribué un numéro global. Tout d'abord, vous demandez à votre lecteur pour son numéro (en ouvrant « \ X: » et l'envoi d'une demande de IOCTL_STORAGE_GET_DEVICE_NUMBER). En second lieu, vous allez sur tous les périphériques de disque et demander à chacun pour son numéro (en l'ouvrant, par un chemin différent, de sorte que vous ne pouvez pas comparer chaîne de).

Une fois que vous trouvez un dispositif de disque portant le même numéro que vous interrogé votre lecteur, vous savez que vous avez un gagnant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top