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 odpowiadaSTORAGE\REMOVABLEMEDIA\7&190C24E5&0&RM
widoczne powyżej na liście urządzeń).
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).
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ę.
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