Эффективное общение драйвера с юзермодом

Тема в разделе "WASM.NT.KERNEL", создана пользователем JustAGuest, 18 янв 2010.

  1. JustAGuest

    JustAGuest New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2009
    Сообщения:
    33
    Всем здравствуйте!

    Товарищи, сам я в драйверах новичок и только начал заниматься, оттого хочу посоветоваться со знающими.
    Пишу простой контент-фильтр, перехват решил производить через NDIS IM.

    Вопрос:
    На вход в драйвер льется трафик, судьбу содержимого каждого пакета решает юзермодное приложение.
    Как лучше организовать их (драйвера и приложения) сотрудничество?
    Стоит ли делать ожидание в драйвере или следует отдать пакет приложению, не передавая его дальше по цепочке, а завершить его, но приложение само при необходимости "даст ему ход"?
    Чувствутю, второй вариант гораздо лучше.
    Может какие еще есть варианты, более корректные?


    Заранее очень благодарен!
     
  2. ams007

    ams007 New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2007
    Сообщения:
    86
    Как лучше - это уже вопрос религии. Вам сейчас, возможно, приведут в пример множество вариантов, и большинство из них будут правильными. Также все зависит от конкретной постановки задачи. Если вы еще не читали книжку У. Они "Windows Driver Model"(лично мне она не очень - наверно надо было читать оригинал, а не перевод) - почитайте, возможно, что многие вопросы отпадут сами собой.

    ЗЫ: ну и собств. мое, единственно верное :)) мнение: если задача должна решаться в реальном времени, то на тот момент, когда ваш фильтр "увидит" пакет - он уже должен знать признаки, по которым необходимо предпринять какие-то шаги, и собств. - предпринять эти шаги :)) . Т.о. следует предположить, что ваш юзермод должен лишь выполнять конфигурацию работы фильтра и, скажем с исп. именован. объекта синхронизации, должен быть оповещен о каких-либо аспектах работы фильтра и/или параметрах фильтруемых данных.
     
  3. JustAGuest

    JustAGuest New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2009
    Сообщения:
    33
    Т.е. вы имеете ввиду перенос всей логики фильтрования на сторону драйвера.
    Нет, это не подходит. Причин много, некоторые из них:
    - контент-фильтр - сам по себе достаточно сложный модуль, имеющий кучу алгоритмов определения "неугодных" данных и анлиза трафика, баз данных (например фильтр жаргонных слов) и т.п.;
    - предполагается периодическое внесение изменений в основной код фильтрования.
    Потому речь идет о создании драйвера - поставщика трафика. Разбор же трафика должен проводиться в юзермоде.

    Так что рад был "услышать" те самые "множество вариантов" :)
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Вариантов можно предложить уйму, как уже верно заметили.
    Вот несколько, первое, что пришло на ум:
    - передача пакета в LPC-порт и ожидание ответа с решением, юзермодное приложение является сервером.
    - передача пакета в Pipe и ожилание ответа с решением, юзермодное приложение является сервером.
    - доставка APC потоку юзермодного приложения (поток в юзермоде вечно делает for(;;) SleepEx(INFINITE,TRUE);), приложение должно заранее передать в драйвер поток, в который нужно доставлять APC, и адрес APC Routine режима пользователя. пакет передается в структуре, адрес структуры - в параметре APC. решение записывается в ту же структуру. драйвер ждет на определенном Event'е, который сигналит APC Routine при завершени.
    - создание нового потока в юзермодном приложении, пакет передается в структуре, адрес структуры - в параметре потока, решение записывается в ту же структуру. драйвер ждет на объекте потока.
    ...

    Я бы честно выбрал вариант с LPC. Он прямо предназначен для обмена сообщениями.
     
  5. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Недокументировано.

    Хороший вариант, так обычно и делаю.

    Слишком большой оверхед, imho.

    Недокументировано и, насколько я помню, имеет ограничение на размер сообщения.
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Недокументировано, да. Но лучше всего подходит.
    Есть вариант LPC с шаред мемори, если размер больше допустимого размера обычного сообщения.

    Разве пайпы недокументированы? По-моему, в них можно писать из ядра обычным ZwWriteFile. А в юзермоде создание сервера документировано в мсдн.
     
  7. Folk Acid

    Folk Acid New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2005
    Сообщения:
    432
    Адрес:
    Ukraine
    Вопрос - бред. Юзермодное приложение при анализе пакетов от драйвера использует WinAPI?
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    LPC очень медленно. В сторону драйвера(кпл 3->0) перейти просто(шлюзы различные), вот назад уже сложнее, потомучно поток ядерный и не может нормально в юзермод перейти(например стека нет пользовательского, да и на ядерный нужно возвращаться). APC нормальное решение(для пользовательского потока быстродействие очень смутное понятие), лучше конечно шадова механизм калбэков использовать(или подобную реализацию), только недостаток заключается в вероятности сбоя, например поток может не вернуться в ядро(если например вызов в контексте произвольного потока). Стоит перенести весь критический по времени функционал в ядро.
     
  9. wasm_test

    wasm_test wasm test user

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

    Зависит от того, насколько часто будут приходить пакеты. Это может быть и совершенно некритично.
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Great
    Если есть в сурцах венды значит документировано.
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А я думал под документацией считается официальная документация. Все остальное может быть изменено в последующих версиях без уведомления
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ах да, можно еще сделать механизм аналогичный тому, как win32k получает нажатия от клавиатуры и мыши.
    Создать девайс, юзермодное приложение в цикле читает из него, а драйвер завершает IRP только при возникновении события.

    JustAGuest
    Достаточно тебе вариантов?
     
  13. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Да, с этой точки зрения да, просто в ядре пайпы это как чёрный ящик, тупо читать/писать можно и всё. К слову, пайпы по производительности почти одинаково с Ioctl-ами обычными будут.
     
  14. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Это утверждение может быть корректно только там, где иначе никак.
     
  15. JustAGuest

    JustAGuest New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2009
    Сообщения:
    33
    Спасибо, товарищи! Думаю остановиться на варианте с APC.
     
  16. JustAGuest

    JustAGuest New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2009
    Сообщения:
    33
    Great
    Хотя с твоим вариантов АРС, возникает такой вопрос: как драйвер поведет себя в случае если вердикт по пакету еще не получен, но пришел уже следующий пакет? Возможно ли тут рентабельность?
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ну APC ставятся в очередь. И исполняться будут в порядке помещения в очередь. Все пакеты будут обработаны юзермодным рабочим потоком в порядке их получения
     
  18. luckysundog

    luckysundog New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2008
    Сообщения:
    106
    а не слишком ли сложно для анализа траффика в реальном времени?
     
  19. luckysundog

    luckysundog New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2008
    Сообщения:
    106
    поподробнее можно про второй вариант? мне кажется, что он во-первых не корректен, а во-вторых придется завершать вообще ВСЕ пакеты, а потом большинство из них отправлять заново. где тут выигрыш в скорости? смысл в этом есть только если часть логики фильтра перенести в драйвер и передавать в юзермодное приложение только подозрительные пакеты.

    вопрос к тем, кто уже имеет опыт в написании таких фильтров: это вообще корректно завершать пакеты, а потом их заново отправлять, или тут есть подводные камни?
     
  20. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Насчёт NDIS IM конкретно не скажу, но у тебя должна же быть какая-то очередь? В обычных I/O-based фильтрах каждому потоку в каждый момент времени соответствует один запрос, и таким образом, проблемы не возникает. Т.е. пришёл запрос в фильтр, положили его в очередь, создали событие для этого запроса и ждём результатов, здесь же, в этом же потоке. Но в NDIS IM такого нет и быть не может, не тот уровень уже. Ну у тебя пакеты же куда-то приходят, какой-то колбек вызывается при этом? Вот в этом колбеке кладёшь пакет в очередь, сигналишь приложение через APC и возвращаешь управление. Ждать результатов от приложения в этом колбеке нельзя, ибо тогда есть вероятность, что на больших скоростях часть пакетов будет теряться при переполнении внутренних буферов tcp/ip стека и поэтому здесь ты должен предусмотреть такой размер очереди, который компенсирует временные издержки на взаимодействие с приложением. Ну а приложение по сигналу начинает выгребать пакеты и для каждого пакета сигналить драйверу, что с ним делать. Как-то так.

    Какая ещё рентабельность? Может быть реентерабельность всё таки, не?