Как получить серийный номер USB-диска по его букве?

Тема в разделе "WASM.NT.KERNEL", создана пользователем grossmehanik, 26 май 2007.

  1. grossmehanik

    grossmehanik New Member

    Публикаций:
    0
    Регистрация:
    26 май 2007
    Сообщения:
    4
    Всем доброго времени суток.

    Не подскажете ли, как решить следующую задачу?
    Имеется legacy-драйвер, работающий в Windows 2000. Драйверу передаётся имя диска (диск на USB Flash), нужно определить производителя и серийный номер флешки (серийный номер у флешки заведомо есть).

    На данный момент: драйвер раскрывает символьную ссылку и получает имя диска типа \Device\Harddisk4\DP(1)0-0+7, получает DeviceObject и FileObject через IoGetDeviceObjectPointer... а дальше начинаются сложности (для меня, поскольку за драйверы взялся недавно). IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER - не работает в Windows 2000. IOCTL_STORAGE_QUERY_PROPERTY - возвращает VendorId, ProductId и ProductRevision, но SerialNumber пустой (кстати для IDE-дисков номер выдаётся - если кому надо решить такую задачу). IOCTL_INTERNAL_USB_SUBMIT_URB с USB_DEVICE_DESCRIPTOR_TYPE (для последующего USB_STRING_DESCRIPTOR_TYPE) - выдаёт STATUS_NOT_SUPPORTED.

    Прежде чем написать, внимательно просмотрел этот форум и форумы на схожие темы, однако полученная информация не помогла решить задачу. Если есть описание её решения - где его найти? (Просьба не предлагать абстрактные направления типа "читай MSDN" или "поищи у Walter Oney").
     
  2. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Если не секрет в каком виде вы получаете VendorId и ProductId??? В виде цифр (01fe) или в виде (Flash Disk, ну или что то типа того)???
     
  3. grossmehanik

    grossmehanik New Member

    Публикаций:
    0
    Регистрация:
    26 май 2007
    Сообщения:
    4
    В виде строк.
     
  4. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Устраивает??? Если нет, то информацию можно получить у DeviceObject-а от usbhub (в цифровом виде имеется ввиду, там же можно получить и серийный номер) А вот как связать стек устройств в единую цепочку, пока и для меня загадка......((((
     
  5. grossmehanik

    grossmehanik New Member

    Публикаций:
    0
    Регистрация:
    26 май 2007
    Сообщения:
    4
    Не устраивает. Нужно получить и серийный номер флешки, а он, как было сказано, пустой в этом запросе.

    От хаба можно получить нужную информацию посредством IOCTL_USB_GET_NODE_CONNECTION_INFORMATION, но:
    1) как получить правильный хаб (их может быть несколько) именно для данной флешки?
    2) как определить номер ноды флешки для указания его в ConnectionIndex при запросе хабу?
     
  6. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Здесь можно так сказать идти от обратного.....;)) Ловить момент подключения флэшки и запоминать соответствующий DeviceObject от хаба., от него и узнавать всю инфу об устройстве
     
  7. grossmehanik

    grossmehanik New Member

    Публикаций:
    0
    Регистрация:
    26 май 2007
    Сообщения:
    4
    Нет возможности. Драйвер запускается когда флешка уже подключена.
     
  8. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Поидее можно было бы просто ребутнуть ее))))) Но потом проследить весь стек устройств всеравно сложно (точнее у меня пока это не получилось). Ну а если нельзя ребутить то тогда хз.
     
  9. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    IoRegisterPlugAndPlayNotification с флагом PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES

    Делал в обратном порядке. Для подключенной флешки через стек PnP определял и кэшировал точки монтирования (DEVICE_OBJECT для партишна). Далее все просто - по запросу смотрим кэш и выдаем DEVICE_OBJECT для флешки, к ней строим URB.
    В принципе никто не мешает пойти в обратную сторону: открываем девайс партишна, через Vpb переходим к DO файловой системы, далее через списки чайлдов и сиблингов можно спуститься по стеку к fdo девайса. Самый простой способ определить алгоритм - в WinDbg заюзать !devnode и пройтись по стеку
     
  10. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Если можно чуть по подробнее..... ну а если еще и вырезки из исходников приложишь то ваще МЕГАРЕСПЕКТ!!!! ;)) В принципе не важно сверху вниз или снизу вверх, главное связать DEVICE_OBJECT от хаба и DEVICE_OBJECT от диска (disk.sys)
     
  11. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    devobj - указатель на DO для флешки (в PnPNotify обработчике получаем имя и референсим его). Тогда:

    devnode = devobj->DeviceObjectExtension->AttachedTo->DeviceObjectExtension->DeviceNode будет пнпшным devnod`ом для первого партишна на флешке.

    Дальше пусть devnode1 = devnode->FirstChild, тогда циклом по devnode1->NextSibling пока != NULL перечисляем все маунт-пойнты для флешки (ссылка на devnode для точки монтирования будет devnode1->FirstChild). В devnode есть ссылка на DeviceObject, но смещение различно для разных версий виндов (по сервис-пакам не различается). DeviceObject для devnode1->FirstChild будет DO для точки монтирования, т.е. объектом mountmgr.

    Про Vpb в предыдущем посте я что-то не то сказал, он здесь не нужен. В обратную сторону не пробовал спускаться, но по аналогии, думаю, все пройдет.
     
  12. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Спасибо вам большое, за разжеванный ответ!!!!! Попробую.......
     
  13. ams007

    ams007 New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2007
    Сообщения:
    86
    Может и поздно, но все же: кто тебе сказал, что у флешки обязательно д.б. серийный номер. у подавляющего большинства флех до 2006 его нет))) да и у новых тоже такое бывает))
     
  14. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    [bold]asm007[/bold]
    Если он нулевой, это не значит, что его нет :)
    Раньше было рекомендовано заполнять это поле и все вендоры дружно на рекомендацию клали. Сейчас стали требовать, поэтому можно вполне полагаться на то, что поле заполнено, и просто посылать на фиг все девайсы с нулевым с/н
     
  15. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Хочу еще раз поднять эту тему.
    Все это верно. Но есть одно НО!!! это схема работает только если на usb флэшке файловая система FAT. На больших usb дисках идет ф.с. NTFS. Здесь добавляется драйвер ftdisk (драйвер повышения отказоустройчивости). И теперь если раньше devnode выглядел
    Код (Text):
    1. kd> !DevNode 8119ff28 1
    2. DevNode 0x8119ff28 for PDO 0x811afe90
    3.   Parent 0x811a0d48   Sibling 0000000000   Child 0x8116ad68
    4.   InstancePath is "USB\Vid_0c76&Pid_0005\6&38c5a47&0&1"
    5.   ServiceName is "USBSTOR"
    6.   Flags (0x00040458)  DNF_PROCESSED, DNF_ENUMERATED,
    7.                       DNF_ADDED, DNF_NO_RESOURCE_REQUIRED,
    8.                       DNF_STARTED
    9.   CapabilityFlags (0x00000010)  Removable
    10.   DevNode 0x8116ad68 for PDO 0x8117aed0
    11.     Parent 0x8119ff28   Sibling 0000000000   Child 0x811c8aa8
    12.     InstancePath is "USBSTOR\Disk&Ven_JetFlash&Prod_TS128MJF2A&Rev_1.00\7&311ad6ac&0"
    13.     ServiceName is "disk"
    14.     Flags (0x00040458)  DNF_PROCESSED, DNF_ENUMERATED,
    15.                         DNF_ADDED, DNF_NO_RESOURCE_REQUIRED,
    16.                         DNF_STARTED
    17.     DevNode 0x811c8aa8 for PDO 0x8119bd90
    18.       Parent 0x8116ad68   Sibling 0000000000   Child 0000000000
    19.       InstancePath is "STORAGE\RemovableMedia\8&2aa6674d&0&RM"
    20.       TargetDeviceNotify List - f 0xe24f0c88  b 0xe24f0c88
    21.       Flags (0x00040458)  DNF_PROCESSED, DNF_ENUMERATED,
    22.                           DNF_ADDED, DNF_NO_RESOURCE_REQUIRED,
    23.                           DNF_STARTED
    24.       CapabilityFlags (0x00000180)  SilentInstall, RawDeviceOK
    то с NTFS будет тоже самое но без последнего узла. Вообщем суть вопроса в следующем: драйвер ftdisk является своего рода прослойкой между драйвером файловой системы и драйвером disk.sys, как можно связать между собой драйвера ftdisk и disk? может кто знает или есть какие то предположения, заранее спасибо!
     
  16. HCode

    HCode New Member

    Публикаций:
    0
    Регистрация:
    21 янв 2006
    Сообщения:
    72
    Угу.