Здравствуйте, Аноним, Вы писали:
А>Подскажите, как в файловом фильтре, например при обработке IRP_MJ_CREATE определить серийник флешки подключенной через usb, к которой происходит обращение ? А>Спасибо.
Как определить в IRP_MJ_CREATE не скажу. Да и надо ли каждый раз делать это при обработке каждого IRP_MJ_CREATE? Не проще ли сделать это в момент IRP_MN_MOUNT_VOLUME, а потом просто сохранить полученный серийный номер в своём deviceExtension?
Если я не ошибаюсь, то обычно InstanceId у device object, созданного драйвером USBSTOR, совпадает с серийным номером флэшки. То есть нужно получить этот самый device object, а потом узнать его InstanceId.
Когда приходит пакет IRP_MN_MOUNT_VOLUME, то можно получить device object тома:
Не забудьте потом вызвать ObDereferenceObject, когда полученный объект больше не будет нужен.
Потом надо убедиться, что это USB-устройство. Сделать это можно примерно так:
Тут три проверки. Первую проверку можно убрать, так как сейчас USBSTOR не поддерживает запрос на DevicePropertyBusTypeGuid. У меня, по крайней мере, ни разу не получалось его выполнить с успехом для USB-дисков. Обычно срабатывает вторая проверка. Но нужно иметь в виду, что проверка довольно грубая. Третья проверка на то, является ли устройство Removable. Я не уверен, что проверка на 100% точная.
Теперь надо получить InstanceId. Кода для этого я тут не приведу. Но можно попробовать послать устройству пакет IRP_MN_QUERY_ID/BusQueryInstanceID.
Надеюсь, местные гуру поправят или уточнят меня, если я где-то ошибаюсь.
серийный номер usb-устройства
От:
Аноним
Дата:
02.07.10 17:43
Оценка:
Подскажите, как в файловом фильтре, например при обработке IRP_MJ_CREATE определить серийник флешки подключенной через usb, к которой происходит обращение ?
Спасибо.
Re: серийный номер usb-устройства
От:
Аноним
Дата:
08.07.10 13:46
Оценка:
выяснил что серийник хранится в USB_StringDescriptor
каким образом можно этот USB_StringDescriptor получить ?
Здравствуйте, Аноним, Вы писали:
А>Подскажите, как в файловом фильтре, например при обработке IRP_MJ_CREATE определить серийник флешки подключенной через usb, к которой происходит обращение ? А>Спасибо.
а у вас фильтр или минифильтр? правильно вам посоветовали что это надо делать не в IRP_MJ_CREATE
в минифильтре — InstanceSetup
в фильтре — смотри выше
Здравствуйте, Alexey Frolov, Вы писали:
AF>а у вас фильтр или минифильтр? правильно вам посоветовали что это надо делать не в IRP_MJ_CREATE
у меня фильтр. вернее два фильтра — один файловый, второй wdm.
с файловым, спасибо, ясно.
а как быть с wdm фильтром ? т.е. нужно получать серийник для любого подключаемого usb устройства.
это надо делать в AddDevice или в обработчике IRP_MN_START_DEVICE ?
и как в этом случае получить USB_StringDescriptor ?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Alexey Frolov, Вы писали:
AF>>а у вас фильтр или минифильтр? правильно вам посоветовали что это надо делать не в IRP_MJ_CREATE А>у меня фильтр. вернее два фильтра — один файловый, второй wdm. А>с файловым, спасибо, ясно. А>а как быть с wdm фильтром ? т.е. нужно получать серийник для любого подключаемого usb устройства. А>это надо делать в AddDevice или в обработчике IRP_MN_START_DEVICE ? А>и как в этом случае получить USB_StringDescriptor ?
Я бы делал в AddDevice, можно отправить запрос IOCTL_INTERNAL_USB_SUBMIT_URB (URB_CONTROL_DESCRIPTOR_REQUEST)
получить USB_DEVICE_DESCRIPTOR и оттуда серийник, как отправить запрос — пройдитесь поиском по форуму по IOCTL_INTERNAL_USB_SUBMIT_URB
Здравствуйте, Аноним, Вы писали:
А>а как быть с wdm фильтром ? т.е. нужно получать серийник для любого подключаемого usb устройства. А>это надо делать в AddDevice или в обработчике IRP_MN_START_DEVICE ? А>и как в этом случае получить USB_StringDescriptor ?
А можно поинтересоваться, как ваш фильтр будет подключаться ко всем подключаемым USB-устройствам?
Re[4]: серийный номер usb-устройства
От:
Аноним
Дата:
09.07.10 10:59
Оценка:
Здравствуйте, Alexey Frolov, Вы писали:
AF>Я бы делал в AddDevice, можно отправить запрос IOCTL_INTERNAL_USB_SUBMIT_URB (URB_CONTROL_DESCRIPTOR_REQUEST) AF>получить USB_DEVICE_DESCRIPTOR и оттуда серийник, как отправить запрос — пройдитесь поиском по форуму по IOCTL_INTERNAL_USB_SUBMIT_URB
в USB_DEVICE_DESCRIPTOR не серийник, а индекс строки содержащей серийник в USB_StringDescriptor
для нее наверное надо запросить USB_STRING_DESCRIPTOR_TYPE. попробую
Re[4]: серийный номер usb-устройства
От:
Аноним
Дата:
09.07.10 12:26
Оценка:
Здравствуйте, dimb82, Вы писали:
D>А можно поинтересоваться, как ваш фильтр будет подключаться ко всем подключаемым USB-устройствам?
D>>А можно поинтересоваться, как ваш фильтр будет подключаться ко всем подключаемым USB-устройствам? А>я его прописываю как нижний фильтр для класса usb
Это который Universal Serial Bus controllers? А такой фильтр цепляется к устройствам отличным от USB хост-контроллера? Или ко всем child PDO тоже цепляется?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Alexey Frolov, Вы писали:
AF>>Я бы делал в AddDevice, можно отправить запрос IOCTL_INTERNAL_USB_SUBMIT_URB (URB_CONTROL_DESCRIPTOR_REQUEST) AF>>получить USB_DEVICE_DESCRIPTOR и оттуда серийник, как отправить запрос — пройдитесь поиском по форуму по IOCTL_INTERNAL_USB_SUBMIT_URB
А>в USB_DEVICE_DESCRIPTOR не серийник, а индекс строки содержащей серийник в USB_StringDescriptor А>для нее наверное надо запросить USB_STRING_DESCRIPTOR_TYPE. попробую
да, совершенно верно, вторым запросом получите USB_STRING_DESCRIPTOR c нужным индексом
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, dimb82, Вы писали:
D>>А можно поинтересоваться, как ваш фильтр будет подключаться ко всем подключаемым USB-устройствам?
А>я его прописываю как нижний фильтр для класса usb
не будет работать для некотрых USB устройств типа images/web_video — хотя они чистые USB.
Re[6]: серийный номер usb-устройства
От:
Аноним
Дата:
12.07.10 04:47
Оценка:
Здравствуйте, Alexey Frolov, Вы писали:
А>>в USB_DEVICE_DESCRIPTOR не серийник, а индекс строки содержащей серийник в USB_StringDescriptor А>>для нее наверное надо запросить USB_STRING_DESCRIPTOR_TYPE. попробую
AF>да, совершенно верно, вторым запросом получите USB_STRING_DESCRIPTOR c нужным индексом
не получается. пробовал для флешки.
получаю USB_DEVICE_DESCRIPTOR в нем iSerialNumber = 0 (продукт и вендор ид правильные)
получаю USB_STRING_DESCRIPTOR, ошибок нет, но ничего похожего на серийник не видно, сравнивал со строкой из диспетчера устройств->контроллеры usb->запоминающие устройство для usb->свойства->сведения->код экземпляра (у меня там usb\vid_0457&pid_0151\c950d47504e28e)
первый байт USB_STRING_DESCRIPTOR — длина (у меня 4), второй — тип (у меня 3), дальше должен идти серийник, но его там нет.
в чем может быть дело ?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Alexey Frolov, Вы писали:
А>>>в USB_DEVICE_DESCRIPTOR не серийник, а индекс строки содержащей серийник в USB_StringDescriptor А>>>для нее наверное надо запросить USB_STRING_DESCRIPTOR_TYPE. попробую
AF>>да, совершенно верно, вторым запросом получите USB_STRING_DESCRIPTOR c нужным индексом
А>не получается. пробовал для флешки. А>получаю USB_DEVICE_DESCRIPTOR в нем iSerialNumber = 0 (продукт и вендор ид правильные) А>получаю USB_STRING_DESCRIPTOR, ошибок нет, но ничего похожего на серийник не видно, сравнивал со строкой из диспетчера устройств->контроллеры usb->запоминающие устройство для usb->свойства->сведения->код экземпляра (у меня там usb\vid_0457&pid_0151\c950d47504e28e) А>первый байт USB_STRING_DESCRIPTOR — длина (у меня 4), второй — тип (у меня 3), дальше должен идти серийник, но его там нет. А>в чем может быть дело ?
сходу не скажу, может код покажете?
Re[8]: серийный номер usb-устройства
От:
Аноним
Дата:
12.07.10 14:56
Оценка:
Здравствуйте, Alexey Frolov, Вы писали:
AF>сходу не скажу, может код покажете?
typedef struct _USB_STRING_DESCRIPTOR {
UCHAR bLength ;
UCHAR bDescriptorType ;
WCHAR bString[1] ;
} USB_STRING_DESCRIPTOR, *PUSB_STRING_DESCRIPTOR
Members
bLength
Specifies the length, in bytes, of the descriptor.
bDescriptorType
Specifies the descriptor type. Must always be USB_STRING_DESCRIPTOR_TYPE.
bString
Pointer to a client-allocated buffer that contains, on return from the host controller driver, a Unicode string with the requested string descriptor.
по идее первый символ серийника сюда влезет, но не факт что железка его вернет, скорее всего в статусе получите что буфер маленький
вам нужно выделить буфер под строку побольше, если слепить на коленке то что то вроде
Здравствуйте, Аноним, Вы писали:
А>первый байт USB_STRING_DESCRIPTOR — длина (у меня 4), второй — тип (у меня 3), дальше должен идти серийник, но его там нет. А>в чем может быть дело ?
Дальше вычитываем весь дискриптор полностью — устройство должно предложить набор поддерживаемых языков
04 — bLength
03 — bDescriptorType
04 09 — wLangId (English)
могут быть еще, но длина будет другой
дальше вычитываем дискриптор на выбранном языке (index = 0, type = 03, langid = 0х0409)
22 — bLength
03 — bDescriptorType
ну дальше читаем весь дискриптор польностью.
Приблизительно такой алгоритм вычитывания стринг дискринтора.
Вообще можно взять любой USB монитор и посмотреть как usbstor.sys вычитывает дискриптор флешки.
Re[8]: серийный номер usb-устройства
От:
Аноним
Дата:
13.07.10 04:25
Оценка:
Здравствуйте, _f_b_i_, Вы писали:
___>Дальше вычитываем весь дискриптор полностью — устройство должно предложить набор поддерживаемых языков
___>04 — bLength ___>03 — bDescriptorType ___>04 09 — wLangId (English) ___>могут быть еще, но длина будет другой
___>дальше вычитываем дискриптор на выбранном языке (index = 0, type = 03, langid = 0х0409) ___>22 — bLength ___>03 — bDescriptorType
___>ну дальше читаем весь дискриптор польностью.
что значит "вычитываем" ?
это новый запрос надо послать ? как он формируется ? как узнать, что еще не все данные прочитаны ?
у меня все вызовы возвращают 0, т.е. никто не говорит, что буфер слишком мал
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, _f_b_i_, Вы писали:
___>>ну дальше читаем весь дискриптор польностью.
А>что значит "вычитываем" ?
Вычитываем значит что читаем дискриптор (как и любой другой дискриптор USB устройства за два этапа)
1-й этап выделяем память и читаем заголовок USB_STRING_DESCRIPTOR, причем index дискриптора всегда = 0
UCHAR bLength ;
UCHAR bDescriptorType ;
2-й этап выделяем столько памяти сколько вернулось в bLength и читаем еще раз.
После этого получаем массив языков стринговые дискрипторы которых будут возвращатся устройством.
3-й этап выбираем нужный язык и читаем стринговый дискриптор еще раз. При этом index дискриптора берем из USB_DEVICE_DESCRIPTOR,
а LangId заполняем значением (значениями) который получили на этапе 2.
4-й этап выделяем память в bLength байт и читаем дискриптор польностью. На этот раз получишь тот дискриптор который нужен.
Re[10]: серийный номер usb-устройства
От:
Аноним
Дата:
13.07.10 06:52
Оценка:
Здравствуйте, _f_b_i_, Вы писали:
извиняюсь не понял.
первый раз я передаю в качестве буфера USB_STRING_DESCRIPTOR sd = {0}
получаю:
db sd
04 03 09 04 ...
т.е. длина 4 байта 4, но sizeof(sd) тоже равен 4 байта
если теперь в качестве буфера передать sd заполненный на первом вызове (т.е. с установленным langid), то ни чего не меняется
причем iSerialNumber у меня равен 0
т.е. мне нужен первый элемент массива стринг дескрипторов ?
Re[11]: серийный номер usb-устройства
От:
Аноним
Дата:
13.07.10 07:30
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, _f_b_i_, Вы писали:
почти разобрался, теперь дескриптор получаю, но не могу предварительно получить его длину
1. index=0, langid=0, в качестве буфера &sd
получаю length = 4, lengid = 0x409
2. index=0, langid=0x409, в качестве буфера &sd
получаю length = 4, lengid = 0x409
3. index=0, langid=0x409, в качестве буфера 108 байт
получаю серийник
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, _f_b_i_, Вы писали:
А>почти разобрался, теперь дескриптор получаю, но не могу предварительно получить его длину А>1. index=0, langid=0, в качестве буфера &sd А>получаю length = 4, lengid = 0x409 А>2. index=0, langid=0x409, в качестве буфера &sd А>получаю length = 4, lengid = 0x409 А>3. index=0, langid=0x409, в качестве буфера 108 байт А>получаю серийник
Гы... в качестве буфера &sd можно использовать ТОЛЬКО для вычитывания заголовка и все.
Тоесть:
1. index=0, langid=0, size = sizeof (sd) минус вот тот WCHAR[1], buf = &sd; В результате 04 03
2. index=0, langid=0, size = bLength, buf = ExAllocatePool(); В результате 04 03 04 09
3. index=0х0409, langid=из дискриптора, size = sizeof (sd) — WCHAR[1], buf = &sd; 6с 03 (тут должны быть твои 108 байт)
4. index=0х0409, langid=из дискриптора, size = bLength, buf = ExAllocatePool(); В результате 6с 03 .. .. ..
Здравствуйте, _f_b_i_, Вы писали:
___>Тоесть:
___>1. index=0, langid=0, size = sizeof (sd) минус вот тот WCHAR[1], buf = &sd; В результате 04 03 ___>2. index=0, langid=0, size = bLength, buf = ExAllocatePool(); В результате 04 03 04 09 ___>3. index=0х0409, langid=из дискриптора, size = sizeof (sd) — WCHAR[1], buf = &sd; 6с 03 (тут должны быть твои 108 байт) ___>4. index=0х0409, langid=из дискриптора, size = bLength, buf = ExAllocatePool(); В результате 6с 03 .. .. ..
Опечатался.. конечно же
index=из дискриптора, langid=0х0409
Кстати, строго говоря не у каждого девайса есть серийный номер. Если в дискрипторе устройства записан нолик, то серийника нет.
И еще раз, чтобы лучше понять как все происходит, советую поставить какой то USB Monitor и посмотреть в живую на поряток отправки URB запросов к девайсу
по время вычитывания String дискрипторов.
Re[2]: серийный номер usb-устройства
От:
Аноним
Дата:
19.12.11 13:51
Оценка:
Здравствуйте, dimb82, Вы писали:
Я все сделал как Вы описали но почемуто у меня серийник = 0
Серийник у флешки точно есть.
Проблема получить из драйвера файловой системи. Из под драйвера USB я получаю серийник безпроблем.
Уже бьюсь 2 недели ничего не получается.
Может подскажете вчем может быть проблема?
D>Здравствуйте, Аноним, Вы писали:
А>>Подскажите, как в файловом фильтре, например при обработке IRP_MJ_CREATE определить серийник флешки подключенной через usb, к которой происходит обращение ? А>>Спасибо.
D>Как определить в IRP_MJ_CREATE не скажу. Да и надо ли каждый раз делать это при обработке каждого IRP_MJ_CREATE? Не проще ли сделать это в момент IRP_MN_MOUNT_VOLUME, а потом просто сохранить полученный серийный номер в своём deviceExtension?
D>Если я не ошибаюсь, то обычно InstanceId у device object, созданного драйвером USBSTOR, совпадает с серийным номером флэшки. То есть нужно получить этот самый device object, а потом узнать его InstanceId.
D>Когда приходит пакет IRP_MN_MOUNT_VOLUME, то можно получить device object тома:
D>
D>Не забудьте потом вызвать ObDereferenceObject, когда полученный объект больше не будет нужен. D>Потом надо убедиться, что это USB-устройство. Сделать это можно примерно так:
D>
D>Тут три проверки. Первую проверку можно убрать, так как сейчас USBSTOR не поддерживает запрос на DevicePropertyBusTypeGuid. У меня, по крайней мере, ни разу не получалось его выполнить с успехом для USB-дисков. Обычно срабатывает вторая проверка. Но нужно иметь в виду, что проверка довольно грубая. Третья проверка на то, является ли устройство Removable. Я не уверен, что проверка на 100% точная.
D>Теперь надо получить InstanceId. Кода для этого я тут не приведу. Но можно попробовать послать устройству пакет IRP_MN_QUERY_ID/BusQueryInstanceID.
D>Надеюсь, местные гуру поправят или уточнят меня, если я где-то ошибаюсь.
Что именно не получается? На каком этапе получаете ошибку?
А>Я все сделал как Вы описали но почемуто у меня серийник = 0 А>Серийник у флешки точно есть. А>Проблема получить из драйвера файловой системи. Из под драйвера USB я получаю серийник безпроблем. А>Уже бьюсь 2 недели ничего не получается. А>Может подскажете вчем может быть проблема?