Я столкнулся с проблемой написания фаервола. На данный момент реализован простейший вариант — когда пакеты фильтруются внутри NDIS hook драйвера по правилам установленным из приложения. Но хочется расширить функиональность — реализовать передачу данных из драйвера в приложение, и обработку их там. Погуглив и почитав форумы пришёл к выводу — что реализовывать это надо через объекты "события" и разделяемую память. Попутно самостоятельной реализации — хотелось бы посмотреть работающие примеры, желательно на Си / Си++ и узнать про тонкости который меня ожидают.
Здравствуйте, Andrey.Katkov, Вы писали:
AK>Доброго времени суток!
AK>Попутно самостоятельной реализации — хотелось бы посмотреть работающие примеры, желательно на Си / Си++ и узнать про тонкости который меня ожидают.
AK>На данный момент реализован простейший вариант — когда пакеты фильтруются внутри NDIS hook драйвера по правилам установленным из приложения.
hook — это означает банальный перехват обработчиков протоколов и адаптеров или это вы просто ошиблись в терминологии?
AK>Но хочется расширить функиональность — реализовать передачу данных из драйвера в приложение, и обработку их там. Погуглив и почитав форумы пришёл к выводу — что реализовывать это надо через объекты "события" и разделяемую память.
Здравствуйте, Andrey.Katkov,
AK> Но хочется расширить функиональность — реализовать передачу данных из драйвера в приложение, и обработку их там. Погуглив и почитав форумы пришёл к выводу — что реализовывать это надо через объекты "события" и разделяемую память. Попутно самостоятельной реализации — хотелось бы посмотреть работающие примеры, желательно на Си / Си++ и узнать про тонкости который меня ожидают.
--
Вот статья на эту тему в последнем выпуске NT Insider: "A Common Topic Explained — Sharing Memory Between Drivers and Applications".
C уважением,
Геннадий Майко.
Re[2]: Обмен данными между драйвером и приложением
Я вполне мог по неопытности ошибиться в терминологии. Сейчас у меня есть драйвер который регистрирует call-back функцию, по возвращаемому значению которой пакет либо отправляется дальше — либо не отправляется...
Re[2]: Обмен данными между драйвером и приложением
Здравствуйте, Andrey.Katkov, Вы писали:
AK>Погуглив и почитав форумы пришёл к выводу — что реализовывать это надо через объекты "события" и разделяемую память. Попутно самостоятельной реализации — хотелось бы посмотреть работающие примеры, желательно на Си / Си++ и узнать про тонкости который меня ожидают.
Разделяемая память в этом случае может стать узким местом (ведь к ней нужно синхронизировать доступ, ждать пока придет ответ на предыдущий запрос, прежде чем посылать новый). Так что посмотрите в сторону inverted calls. Поищите здесь в форуме или на osronline, например, описание этого способа.
AK>Событие g_hEventPacketResived устанавливается, а на ожидании одного события или события на выбор — BSOD.
По-первых, давайте договоримся, что все упоминания о BSoD'ах вы будете сопровождать анализом crash-дампа (команда "analyze -v" в WinDbg), ибо гадание "где что могло упасть" мне лично не очень нравится.
Во-вторых, попробуйте почитать документацию по KeWaitForSingleObject() более внимательно, в частности про время ожидания и уровни IRQL, — может быть где-то здесь ошибка?
Добавлю свои пять копеек, я бы сделал через события, но данные передавал бы через IRP. Так проще сделать многопоточное приложение. А вообще если траффик пойдет через юзер моде, то жди тормозов на гигабитной сетке, даже если ничего с данными делать не будешь, а просто пробросишь через юзер моде.
Здравствуйте, Andrey.Katkov, Вы писали:
AK>пакеты фильтруются внутри NDIS hook драйвера по правилам установленным из приложения
Это можно сделать на уровне NDIS.
AK> Но хочется расширить функиональность — реализовать передачу данных из драйвера в приложение, и обработку их там.
А вот этого, к сожалению, не получится. NDIS работает на DISPATCH_LEVEL и организовать ожидание принятого решения там не получится.
Здравствуйте, Andrey.Katkov, Вы писали:
AK>Я столкнулся с проблемой написания фаервола. На данный момент реализован простейший вариант — когда пакеты фильтруются внутри NDIS hook драйвера по правилам установленным из приложения. Но хочется расширить функиональность — реализовать передачу данных из драйвера в приложение, и обработку их там. Погуглив и почитав форумы пришёл к выводу — что реализовывать это надо через объекты "события" и разделяемую память.
На мой взгляд, возиться с памятью, разделяемой между драйвером и user space, имеет смысл только если речь идет о быстрой пересылке больших объемов данных. Что в данном случае явно не так.
Самый простой и прямолинейный способ наладить общение с драйвером — создать в драйвере управляющий device object (NdisMRegisterDeivce() для NDIS'овский драйверов), открыть устройство из user space, и общаться с драйвером посредством ReadFile/WriteFile/DeviceIoControl.