Как подключить драйвер к стеку устройств?

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

  1. mohito

    mohito New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2007
    Сообщения:
    10
    Я новичок в написании драйверов, пробую научиться писать драйвер фильтр. Взял пример из DDK \src\general\toaster\filter - по принципу - самый простой. Не могу понять как драйвер определяет к какому PDO он подключается?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    IoGetDeviceObjectPointer вернет верхний элемент стека для нужного девайса. IoAttachDevice или IoAttachDeviceToDeviceStack подключаются к нему.
    Из DDK:
    Или можешь подключиться вручную в любое место стека с помощью корректировки AttachedDevice и DeviceObjectExtension->AttachedTo, но это уже дебри и не для новичков.
     
  3. mohito

    mohito New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2007
    Сообщения:
    10
    Это понятно, но как узнать верхний элемент КАКОГО СТЕКА получать? IoGetDeviceObjectPointe что ей передавать?
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    PUNICODE_STRING с именем девайса, чью вершину стека мы хотим получить
     
  5. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Сначала в систему устанавливается toaster\bus посредством запуска toaster\inf\bus.inf или Панель управления -> Установка оборудования. Он создает виртуальную шину, а сам является так называемым перечислителем (enumerator). Садится в корень PnP-дерева.

    toaster\inf\bus.inf
    [Models]
    "Toaster Bus Enumerator"=ToasterBus_Inst, root\busenum

    Когда к нему приходит IOCTL_BUSENUM_PLUGIN_HARDWARE (из toaster\exe\enum), он имитирует, что в его шину воткнули новый девайс, создает для него PDO и говорит PnP менеджеру, что у него на шине произошли изменения.

    IoInvalidateDeviceRelations( ..., BusRelations );

    PnP менеджер начинает шустрить в поисках драйвера, который должен рулить этим девайсом и находит toaster\func, если его inf уже был установлен или дергает пользователя, чтоб он ему указал нужный inf.

    А фильтр садится в стек если были использованы toaster\inf\toasterf.inf или связка toaster\inf\toaster.inf + toaster\inf\filter.inf, т.к. в этом случае он прописывается в реестре фильтром и PnP менеджер это увидит.

    Т.е. фильтр пассивен он просто ждет, когда PnP менеджер его загрузит и вызовет его AddDevice процедуру, где он и получит указатель на PDO.
     
  6. mohito

    mohito New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2007
    Сообщения:
    10
    Four-F

    Уф... Допустим=)... А если вместо Toaster Bus я хочу использовать USB, как мне исправить данный пример из DDK?
     
  7. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Тогда тебе лучше взять другой пример из DDK src\wdm\usb\filter
     
  8. mohito

    mohito New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2007
    Сообщения:
    10
    Я посмотрел src\wdm\usb\filter.

    NTSTATUS DriverEntry(
    IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING RegistryPath - Как формируется эта строка?
    )
    ...
    NTSTATUS VA_AddDevice(
    IN PDRIVER_OBJECT driverObj,
    IN PDEVICE_OBJECT physicalDevObj - Откуда берется этот *PDO?
    )
    Т.е. мне не понятно, как драйвер определяет что он подключается к PDO USBbus?
     
  9. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Отличный вопрос ;) Я бы сам не отказался поиметь исходник драйвера, реализующего виртуальную USB шину. Тут курить, курить и курить...
     
  10. mohito

    mohito New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2007
    Сообщения:
    10
    - к сожалению я не курю=) и хочу разобраться в этом вопросе...
    - может я не верно выразился...
    Есть некое устройство, подключаемое по USB, мне надо реализовать драйвер перехватывающий пакеты DeviceIOControl и сказать пользователю: "я их поймал"=)...
     
  11. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Замени DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] на свой и обрабатывай, потом передавай управление оригинальному.
     
  12. Folk Acid

    Folk Acid New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2005
    Сообщения:
    432
    Адрес:
    Ukraine
    Насколько я знаю, для фильтрации IRP пакетов от драйвера к драйверу не существует единого документированного способа. Для фильтрации NDIS существует один интерфейс, для драйверов файловой системы - другой. Для USB - возможно, третий.

    На ntdev.h1.ru был пример NDIS файрвола на основе фильтрации IRP пакетов с помощью перехвата точек входа в MajorFunction.
     
  13. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Да никак он не определяет! Это не его забота. PnP менеджер его грузит и дает ему этот самый PDO. Перечитай ещё раз мой первый пост в этом топике.
     
  14. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    mohito
    К твоему фильтру прийдут IRP того устройства (или класса устройств), на которое он (твой драйвер) установлен как фильтр. На что ему ставиться - как раз и указывается в inf файле (или посредством SetupAPI - "ручками" ставишь туда, куда хочешь, в зависимости от условий конкретной задачи).
    Вроде так.
    Надеюсь - поможет.
    Удачи!
     
  15. mohito

    mohito New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2007
    Сообщения:
    10
    ksu_ant - огромное спасибо, именно твой пост внес ясность в мой маленький мозг=)

    Four-F - так же спасибо за ответы... просто видимо с высоты твоего опыта, не заметны те маленькие проблемы которые могут возникать у начинающих и ставить их в тупик...

    Остальным тоже СПАСИБО=)
     
  16. quirk

    quirk New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2006
    Сообщения:
    12
    А чем собственно не устраивает вариант с заменой DispatchControl обработчика?

    Параллельно вопрос: в чем разница между перехватом пакетов через подмену DriverObject->MajorFunction[IRP_MJ_XXX] и IoAttachDevice?
     
  17. mohito

    mohito New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2007
    Сообщения:
    10
    Не устраивает тем, что надо написать драйвер фильтр.
    чем разница между перехватом пакетов через подмену DriverObject->MajorFunction[IRP_MJ_XXX] и IoAttachDevice?
    Разница хотя бы в том, что в первом случае необходимо модифицировать код чужого драйвера, а это не законно.
     
  18. quirk

    quirk New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2006
    Сообщения:
    12
    Разница хотя бы в том, что в первом случае необходимо модифицировать код чужого драйвера, а это не законно
    О чем ты? ничего не надо модифицировать и тем более творить что-то незаконное. Достаточно сделать так:
    Код (Text):
    1. IoGetDeviceObjectPointer(&deviceName, FILE_READ_ATTRIBUTES, &fileObject, &deviceObject);
    2. driverObject = (PDRIVER_OBJECT)deviceObject->DriverObject;
    3. OriginalRoutine = driverObject->MajorFunction[IRP_MJ_XXX];
    4. driverObject->MajorFunction[IRP_MJ_XXX] = FilterRoutine;
    5. ObDereferenceObject(fileObject);
     
  19. quirk

    quirk New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2006
    Сообщения:
    12
    А мой вопрос состоит в следующем: насколько я понимаю IoGetDeviceObjectPointer вернет верхнее устройство из стэка, и IoAttachDevice также цепляет к верхнему устройству, так в чем тогда разница?
     
  20. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ни в чем.