Znajdź, który dysk odpowiada jakiemu urządzeniu pamięci masowej USB w WinXP

Mam kilka dysków USB podłączonych do komputera WinXP SP3 i muszę je programowo odróżnić - muszę znaleźć, która litera dysku odpowiada jakiemu urządzeniu (w tym przypadku jedno urządzenie ~ jeden wolumin). Mogę uzyskać ich identyfikatory głośności i litery napędowe używając mountvol, wyglądając mniej więcej tak:

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

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

Również, używając devcon lub Menedżera urządzeń, widzę identyfikatory urządzeń:

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

Jednak nie znalazłem sposobu, aby połączyć identyfikator urządzenia i ID/litera woluminu, podobnie jak okno dialogowe "bezpiecznie usuń sprzęt" (dlatego zakładam, że jest to możliwe):

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

Jak widać, są to te same urządzenia, które widzę w devconie i ten sam wolumin, który widzi mountvol; ale jak dotąd nie znalazłem związku między nimi.

Znalazłem kilka powiązanych pytania, ale te zdają się używać podejścia " cokolwiek znajdziesz pierwszy jest Twoim Urządzenie USB", co nie jest bardzo przydatne w moim przypadku, ponieważ będzie kilka podobnych urządzeń (tego samego dostawcy, często tego samego typu produktu) podłączonych.


Edit:

@MSalters ' odpowiedź wygląda obiecująco: na XP HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices ma REG_BINARY wartości \DosDevices\x: (Gdzie x to [a-z]); komentarz to (UTF-16) Nazwa właściwego urządzenia (np.
\DosDevices\A: = "\??\STORAGE#RemovableMedia#7&190c24e5&0&RM#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}\", co odpowiada
STORAGE\REMOVABLEMEDIA\7&190C24E5&0&RM widoczne powyżej na liście urządzeń).

/ Align = "left" /
Author: Community, 2009-04-09

2 answers

To nietrywialne pytanie. Nie ma dla niego oficjalnego API, o ile mogę powiedzieć. Potrzebujesz więc nieudokumentowanego API: rejestru. HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices zawiera wpisy zarówno dla liter dysku, jak i identyfikatorów woluminów. Jeśli spojrzysz na rzeczywiste dane, zobaczysz, że identyfikują one dysk. Spójrz na dane binarne jako ciąg Unicode. Wskaże ci HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ENUM\. Jednak XP i Vista różnią się dokładnie tym, jakie podklucze są tam wymienione i jak. (Vista jest łatwiejsza, więc spróbuj najpierw).

 5
Author: MSalters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-09 08:05:30

Istnieje oficjalne API, aby to zrobić. Zobacz tę próbkę: http://www.codeproject.com/KB/system/RemoveDriveByLetter.aspx

Zasada jest taka, że każdemu woluminowi pamięci w systemie Windows przypisany jest numer globalny. Najpierw zapytasz swój dysk o jego numer (otwierając" \X: "i Wysyłając zapytanie IOCTL_STORAGE_GET_DEVICE_NUMBER). Po drugie, przejdziesz przez wszystkie urządzenia dyskowe i zapytasz każde z nich o jego numer(otwierając go, poprzez inną ścieżkę, więc nie możesz po prostu porównać łańcuchów).

Gdy znajdziesz dysk urządzenie noszące ten sam numer, co twój dysk, wiesz, że masz zwycięzcę.

 3
Author: Ilya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-25 01:34:49