Определение буквы диска для USB-storage через VendorID и ProductID

Тема в разделе "WASM.WIN32", создана пользователем AKhranovskiy, 8 ноя 2010.

  1. AKhranovskiy

    AKhranovskiy New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2010
    Сообщения:
    4
    День добрый.

    Имеется список USB-устройств, полученный через SetupAPI и DeviceIOControl перечислением по всем хабам и портам.
    Для каждого устройства имеется его DevicePath (из DeviceDescriptor) и vid/pid. Нужно определить какая буква назначена данному устройству (если оно storage).

    Либо получить некий путь к устройству, который позволит открывать файлы на нем.
     
  2. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Если к примеру есть DEV_BROADCAST_VOLUME (полученная по WM_DEVICECHANGE/DBT_DEVICEARRIVAL), то:
    Код (Text):
    1. //Буква диска по битовой маске
    2. inline char FirstDriveFromMask (ULONG unitmask)
    3. {
    4.  char i;
    5.  for (i = 0; i < 26; ++i)
    6.  {
    7.     if (unitmask & 0x1)
    8.     break;
    9.     unitmask = unitmask >> 1;
    10.  }
    11.  return (i + 'A');
    12. }
     
  3. AKhranovskiy

    AKhranovskiy New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2010
    Сообщения:
    4
    В том то и дело, что список уже есть. Поэтому DEV_BROADCAST_VOLUME использовать нельзя.
     
  4. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Пробуйте при событии подключения нотификатор
     
  5. AKhranovskiy

    AKhranovskiy New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2010
    Сообщения:
    4
    Я повторюсь. Список устройств УЖЕ есть. нужно пройтись по нему и ассоциировать каждое volume/storage устройство с буквой диска или любой другой строкой, которую можно использовать для открытия файлов на этом устройстве.
     
  6. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    NtQueryObject на мысль не наводит?
     
  7. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    AKhranovskiy
    Сопоставление устройства может быть произведено по DeviceNumber (STORAGE_DEVICE_NUMBER).
    1)С одной стороны оно может быть найдено запросом IOCTL_STORAGE_GET_DEVICE_NUMBER через DeviceIoControl - назовем эту функцию GetDeviceNumber (CreateFile-DeviceIoControl).

    2)С другой сторону - при энумерации USB-устройств средствами setupapi
    (SetupDiGetClassDevs-SetupDiEnumDeviceInterfaces-SetupDiGetDeviceInterfaceDetail-GetDeviceNumber).

    В 1) случае вы перебираете подключенные диске (c,d,e) - а 2 пункт - то же, что у вас в #1 написано - и ищите соответствие DeviceNumber(1) и DeviceNumber(2).
     
  8. AKhranovskiy

    AKhranovskiy New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2010
    Сообщения:
    4
    2 gorodon.
    Большое спасибо. Я уже так сделал. Видно, других вариантов нет :)