Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: USB driver filter  (Прочитано 41791 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
AlexCasual
Помогающий

by
Offline Offline

« : 06-03-2012 19:49 » 

Может кто-нибудь поделиться примерами/соображениями по написанию драйвера-фильтра usb-устройств с возможностью блокировки записи/чтения?
Можно ли отличить какое именно устройство подключено к usb - камера,флешка?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 06-03-2012 20:54 » 

1. примеров готовых нет. общих - у майкрософта:
WinDDK\7600.16385.1\src\usb\osrusbfx2\umdf\filter\
XPDDK\src\wdm\usb\filter
...

2. эээ.... туго соображаю. а вы куда хотите фильтр поставить? и как?) на все устройства разом?)
флешка через класс mass storage идет, если не путаю, может там лучше запрещать. как камера - не знаю.
цель то какая?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
AlexCasual
Помогающий

by
Offline Offline

« Ответ #2 : 07-03-2012 07:38 » 

Хочу мониторить все usb устройства с целью определения типа устройства (камера,флэшка и т.д.) и запрета записи/чтения на них.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 07-03-2012 08:11 » 

для мониторинга наверное можно без фильтра обойтись
пример C:\DDK\6001.18001\src\usb\usbview\
начните с этого...

фильтр - в версии DDK 2003  предлагают для USB - использовать пример фильтров из "toaster".
C:\DDK\6001.18001\src\general\toaster\filter\
там есть примеры фильтров: buslower, busupper, claslower, clasupper, devlower, devupper.

Добавлено через 1 минуту и 33 секунды:
возможно, вам стоит в строну верхнего фильтра шины смотреть...
но сам не занимался - точнее не скажу.
« Последнее редактирование: 07-03-2012 08:13 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
AlexCasual
Помогающий

by
Offline Offline

« Ответ #4 : 13-03-2012 06:31 » 

Для отмены запроса,посылаемого драйверу,можно ли отменить его в верхнем фильтре для данного драйвера вот таким образом :

Код:
...
irp->IoStatus.Status = STATUS_ACCESS_DENIED;
irp->IoStatus.Information = 0;
IoCompleteRequest(irp, IO_NO_INCREMENT);
return status;
...
?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 13-03-2012 07:47 » 

да вроде можно)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
AlexCasual
Помогающий

by
Offline Offline

« Ответ #6 : 20-03-2012 14:21 » 

Короче проблему решить не удалось...
При установке фильтра как UpperFilter,он виден в DeviceTree во всех USB устройствах (attached device),логирую все запросы на создание/удаление USB,но при записи/чтении с флэш-накопителя не приходят ВООБЩЕ никакие запросы...
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 20-03-2012 18:59 » 

 тема "usb фильтр" на RSDN
Цитата
Windows Driver Model (WDM) clients of the Universal Serial Bus (USB) driver stack communicate to the USB driver stack, by submitting an IRP with major code IRP_MJ_INTERNAL_DEVICE_CONTROL, and a minor code corresponding to an IOCTL value.
ну и нижнего уровня фильтр видимо нужен
« Последнее редактирование: 20-03-2012 19:01 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
AlexCasual
Помогающий

by
Offline Offline

« Ответ #8 : 20-03-2012 19:35 » 

Вот мой DriverEntry() :

Код:
NTSTATUS
DriverEntry(
    __in PDRIVER_OBJECT  DriverObject,
    __in PUNICODE_STRING RegistryPath
    )
{
    NTSTATUS          status = STATUS_SUCCESS;
    INT               ulIndex;
    PDRIVER_DISPATCH  *dispatch;

    UNREFERENCED_PARAMETER (RegistryPath);

    for (ulIndex = 0, dispatch = DriverObject->MajorFunction; ulIndex <= IRP_MJ_MAXIMUM_FUNCTION; ulIndex++, dispatch++)
   {
        *dispatch = FilterPass;
    }

    DriverObject->MajorFunction[IRP_MJ_PNP]            = FilterDispatchPnp;
    DriverObject->MajorFunction[IRP_MJ_POWER]          = FilterDispatchPower;
    DriverObject->DriverExtension->AddDevice           = FilterAddDevice;
    DriverObject->DriverUnload                         = FilterUnload;


    return status;
}

В FilterPass() я просто вывожу через DebugPrint() код MajorFunction и пропускаю IRP ниже по стэку...
Но при записи/чтении с флэшки мне не приходит НИ ЕДИНОГО сообщения в FilterPass()...
В чём-то жёстко туплю,но не могу понять в чём...

PS:при установке как LowerFilter - картина не меняется за исключением того,что теперь сыпятся в FilterPass() запросы с кодом 0xF,что является "фуфлом"...
« Последнее редактирование: 20-03-2012 19:46 от AlexCasual » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 20-03-2012 20:02 » 

#define IRP_MJ_INTERNAL_DEVICE_CONTROL  0x0f
внимательнее надо быть) это как раз нужный вам ....

PS я вам в предыдущем посте ссылку на ветку обсуждения на RSDN выложил. там все есть)
« Последнее редактирование: 20-03-2012 20:07 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
AlexCasual
Помогающий

by
Offline Offline

« Ответ #10 : 21-03-2012 06:07 » 

Да,за ссылку огромное спасибо.
Но вот только case мой не фильтрует 0xF почему-то...
Код:
NTSTATUS
FilterPass (
    PDEVICE_OBJECT DeviceObject,
    PIRP Irp
    )
{
    PDEVICE_EXTENSION           deviceExtension;
    NTSTATUS    status;
   
PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);

DebugPrint(("FILTER_PASS CODE : 0x%x \n",irpStack->MajorFunction));

switch (irpStack->MajorFunction)
{
case IRP_MJ_INTERNAL_DEVICE_CONTROL:
DebugPrint(("IRP_MJ_INTERNAL_DEVICE_CONTROL\n"));            <--- не выводится это сообщение при irpStack->MajorFunction = 0xF
break;

case IRP_MJ_DEVICE_CONTROL:
DebugPrint(("IRP_MJ_DEVICE_CONTROL\n"));
break;

case IRP_MJ_READ:
DebugPrint(("IRP_MJ_READ\n"));
break;

case IRP_MJ_WRITE:
DebugPrint(("IRP_MJ_WRITE\n"));
break;
}
...............
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 21-03-2012 06:50 » 

с виду вроде все должно... А черт его знает...
проверьте  на тестах, или по ассемблерному листингу.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
AlexCasual
Помогающий

by
Offline Offline

« Ответ #12 : 21-03-2012 10:45 » 

Ochkarik, да была небольшая ошибка в коде.
Теперь при установке фильтра как LowerFilters на класс USB устройств получаю сообщения IRP_MJ_INTERNAL_DEVICE_CONTROL с кодом IOCTL_INTERNAL_USB_SUBMIT_URB...
Только вот всё равно не понимаю почему так происходит,почему в UpperFilters  я не получаю никаких сообщений?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 21-03-2012 11:07 » 

а почему вы считаете, что должны их там получать???
не, картинка не под делу была)
http://msdn.microsoft.com/en-us/library/windows/hardware/ff552547(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/hardware/hh439632(v=vs.85).aspx
« Последнее редактирование: 21-03-2012 11:16 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
AlexCasual
Помогающий

by
Offline Offline

« Ответ #14 : 21-03-2012 11:28 » 

Ochkarik, ну как я понимаю,когда я сажу фильтр как UpperFilter на USBSTOR.SYS,то я как минимум должен получать запросы от DISK.SYS или нет?
И ещё,-получается,что USBSTOR.SYS не передаёт дальше по стэку запросы на USBHUB.SYS (имеется в виду чтение/запись данных)?
« Последнее редактирование: 21-03-2012 13:52 от AlexCasual » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 21-03-2012 13:55 » 

найдите утилитку под названием devicetree.exe  от OSR, раньше она в состав DDK входила.
там ручками можно пощупать - кто к чему приатачен.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
AlexCasual
Помогающий

by
Offline Offline

« Ответ #16 : 21-03-2012 14:55 » new

Ochkarik, в ссылке,которую ты мне скинул (http://msdn.microsoft.com/en-us/library/windows/hardware/hh439632(v=vs.85).aspx) написано :

The IRP is created by Disk.sys, which is the function driver in the device stack for the My USB Storage Device node. Disk.sys passes the IRP down the device stack to Usbstor.sys.

Что-то не укладывается всё это в моей слабенькой голове...
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 21-03-2012 15:02 » 

что не укладывается, что одно функциональное устройство в процессе своей работы может инициировать IRP запросы к другим функциональным устройствам в другом стеке?

Добавлено через 5 часов, 50 минут и 27 секунд:
ЗЫ стеки то разные. просто на картинке зависимости отобразили, но это не значит что один конктерный IRP идет по функциональным устройствам всех перечисленных дров.
« Последнее редактирование: 21-03-2012 20:52 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
AlexCasual
Помогающий

by
Offline Offline

« Ответ #18 : 22-03-2012 07:44 » 

Ochkarik, но всё же смущает строчка :

The IRP is created by Disk.sys, which is the function driver in the device stack for the My USB Storage Device node. Disk.sys passes the IRP down the device stack to Usbstor.sys.

Как же тогда узнать от кого конкретно пришёл IRP?

И вот такой ещё вопрос - AddDevice однозначно вызывается для каждого подключаемого к шине устройства,соответсвенно,в своём фильтре в  функции AddDevice я вывожу через DebugPrint название драйвера к стэку которого аттачусь,но получаю только "\Driver\usbhub" :

Код:
NTSTATUS
FilterAddDevice(
    __in PDRIVER_OBJECT DriverObject,
    __in PDEVICE_OBJECT PhysicalDeviceObject
    )
{
   ........

    PAGED_CODE ();

if(PhysicalDeviceObject->DriverObject->DriverName.Length > 0)
{
DebugPrint(("ATTACH TO DRIVER : %wZ\n",&PhysicalDeviceObject->DriverObject->DriverName)); <----- "\Driver\usbhub"
}
  .......
}
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 22-03-2012 11:10 » 

английский знаю хреново, но по-моему вольный перевод такой:
IRP создается функциональным устройством (драйвера Disk.sys) расположенном в стеке "My USB Storage Device" (но это не значит что IRP запущен на обработку в этом стеке, оно там только географически создано).
Этот IRP отправляется на обработку в стек "USB Mass Storage Device" путем его отправки физическому устройству PDO (это - корень стека "My USB Storage Device", созданный Usbstor.sys).

PDO из "My USB Storage Device" и FDO из "USB Mass Storage Device" рождается одним драйвером Usbstor.sys поэтому они там сами разбираются что делать с запрошенным IRP. Может PDO Usbstor-а генерирует новые запросы IRP в стеке "USB Mass Storage Device", может как-то пересылает. Факт в том, что это уже другой стек, поэтому вы эти IRP увидите только если у вас второй фильтр стоит в другом стеке.

кажется так...

PDO (Usbstor.sys) создано функциональным устройством (FDO) расположенным в "USB Mass Storage Device" (Usbstor.sys)

PS ответ на второй вопрос вытекает из ответа на первый) получается что вы ставите фильтр в стек "USB Mass Storage Device", корень которого (PDO) которого создается драйвером \Driver\usbhub.
это (PhysicalDeviceObject->DriverObject->DriverName) имя драйвера а не имя PDO устройства!

Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
AlexCasual
Помогающий

by
Offline Offline

« Ответ #20 : 22-03-2012 15:10 » 

Ochkarik, но я же нахожусь в стэке "USB Mass Storage Device" или нет?Блин,голова кругом от всех этих PDO и FDO...

Или получается так,что я сижу над FDO,созданным Usbstor.sys в стэке "USB Mass Storage Device",а DISK.SYS отправляет запрос PDO,который создан Usbstor.sys,но находящийся в стэке "My USB Storage Device",т.е. стэке DISK.SYS - и поэтому не получаю данные IRP?

Фууухххх....
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 22-03-2012 21:43 » 

если Upper Filter - то над FDO. если Lower - то под FDO.
вот тут на примере PCI шины и устройств на ней.
http://msdn.microsoft.com/en-us/library/windows/hardware/ff554721(v=vs.85).aspx

всегда структура древовидная: шина, на которой висят отдельные девайсы.

что до вопроса.. Usbstor.sys в данной точке какие функции должен иметь? обрабатывать запросы обращения к дисковому устройству сверху,  переводить их в формат шины USB (а запросы USB передаются в IRP_MJ_INTERNAL_DEVICE_CONTROL) и отправлять вниз.
то есть нижний фильтр будет ловить IRP_MJ_INTERNAL_DEVICE_CONTROL.
а вот верхний естественно их не увидит. верхний - должен ловить то что отправляется от Disk.sys через PDO usbstor.sys... и формат их будет соответствующий(какой не знаю)))... и кстати еще могут  быть FastIO запросы... но тут я не копал  никогда)

кажется так)
кстати вообще попробуйте поставить сразу оба фильтра и верхний и нижний) а результаты посмотрите в одном логе) увидите какой  IRP  запрос приходит сверху,  и как снизу выходит эти самые  IRP_MJ_INTERNAL_DEVICE_CONTROL...
« Последнее редактирование: 22-03-2012 21:45 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
AlexCasual
Помогающий

by
Offline Offline

« Ответ #22 : 23-03-2012 10:15 » 

USBSTOR.sys создаёт два устройства,к одному присоединяется девайс драйвера DISK.sys,а ко второму присоединяется мой UpperFilter...Но почему фильтр не присоединяется к девайсу  DISK.sys?
Я чего-то серьёзно не догоняю в строении стэка девайсов...
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 23-03-2012 10:28 » 

inf фильтра как выглядит?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
AlexCasual
Помогающий

by
Offline Offline

« Ответ #24 : 23-03-2012 11:40 » 

В аттаче.
Основной вопрос - почему я не сажусь в стэк девайса USBSTOR,который получает запросы от DISK.SYS?

* usbstor.inf (30.62 Кб - загружено 953 раз.)
« Последнее редактирование: 23-03-2012 11:50 от AlexCasual » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #25 : 23-03-2012 11:46 » 

ща посмотрим...

Добавлено через 2 минуты и 43 секунды:
нет, все равно:
"что это?"
 Не может быть...

Добавлено через 2 часа, 53 минуты и 19 секунд:
C:\DDK\6001.18001\src\general\toaster\filter\
там есть примеры фильтров: buslower, busupper, claslower, clasupper, devlower, devupper.
« Последнее редактирование: 23-03-2012 14:47 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
AlexCasual
Помогающий

by
Offline Offline

« Ответ #26 : 23-03-2012 20:19 » 

Последний вопрос :

когда я UpperFilter,то я сижу в стэке PDO,созданного usbhub.sys,а usbstor.sys отправляет сформированный URB в это PDO,но почему я не получаю URB в этом случае?Ведь запрос должен пройти через меня,или я совсем не верно понимаю смысл device stack?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #27 : 24-03-2012 00:45 » 

когда вы UpperFilter - чего? тот inf который вы выложили... там единственная строка касающаяся фильтра это:
[USBSTOR_CBI_NR.DelReg]
HKR,,"LowerFilters"
и означает она удаление из реестра ссылки на использование нижнего фильтра перед установкой USBSTOR, если он там вдруг был прописан...

PS как вы свой фильтр вообще устанавливаете?

PPS если предположить.. что вы все таки в том стеке в каком описываете... то:
запрос IRP идет сверху. сначала проходит UpperFilter потом FDO, потом  LowerFilter, потом доходит до PDO.
но в общем случае: любое из этих устройств может не пускать пришедший IRP вниз по стеку а например создать два новых IRP и пустить их вниз. а потом  на основе того как те обработаются нижними устройствами - сигнализировать о завершении "исходного" IRP. тогда IRP пришедший в сверху и IRP идущий в низ по стеку - могут быть совершенно разными.
я понятно намекаю?)

и второй раз намекаю, что помимо IRP есть механизм FastIO для ускоренного обмена запросами в стеке TCP/IP и некоторых дисковых операций... с ним я особо не знаком,  но возможно! простой фильтр его не увидит. тут надо покопать чтоб разобраться)
« Последнее редактирование: 24-03-2012 00:58 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
AlexCasual
Помогающий

by
Offline Offline

« Ответ #28 : 26-03-2012 08:22 » 

Отредактировал usbstor.inf,для добавления своего фильтра к usb mass storage, в аттаче вид реестра после установки флэшки.
Вроде всё правильно,фильтр присутствует в UpperFilters.но драйвер фильтра не вызывается...
Есть какие-нибудь идеи?

* 2.PNG (151.62 Кб - загружено 1076 раз.)
* 1.PNG (124.15 Кб - загружено 1082 раз.)
« Последнее редактирование: 26-03-2012 12:17 от AlexCasual » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #29 : 30-03-2012 07:04 » 

не вызывается или не грузится?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines