хи многоуважаемый олл. разрабатываю снифер, основаный на TDI. драйвер должен пересылать данные попакетно юзермодному приложению. вопрос таков - какой способ коммуникации kernel-mode<->user-mode по-вашему наиболее приемлем?
lilkiddd, в принципе зависить от задачи, но мне нравится метод основанный на событиях, т.е у кернела и у юзера есть шаренный евент, юзер на нём ждёт, а кернел сигналит, тогда юзер посылает кэтээль код, типа, запросить данные о событии и немедленно возвращается с этими данными. Когда же юзеру нужно чё-нить послать в кернел, то это просто кэтээль код.
у меня была мысль создавать двусвязный список в драйвере (один элемент = один сетевой пакет) и отдавать юзермоду из irp_mj_read элемент этого списка. правда, у меня есть некоторые сомнения по поводу синхронизации функции обработки пакетов и хэндлера irp_mj_read. как считаешь, жизнеспособная система?
Есть еще и такой вариант. Программа опрашивает по таймеру драйвер через DeviceIoControl. Драйвер получает размер буфера и сунет туда все, что влезет.
В исходниках к DDK имеется пример драйвера и приложения, которые используют общее событие. Там реализовано два варианта взаимодействия. Глянь в папочке WinDDK\src\general\event.
2FED, там где говорит Forever всё очень хорошо описано. Вообще в сэмплах DDK много полезного. Ещё на OSR много хорошего материала, например в filter_driver_discussion_paper.pdf в конце есть раздел user/kernel communications, тож можно почитать. P.S: И так к слову, вот тут http://www.microsoft.com/whdc/driver/kernel/MP_issues.mspx интересная дока по smp программированию.
steelfactor По ссылке что то непонятное просит регистрации Forever ok обезательно посмотрю dead_body Действительно чото думал что нет, а оказалось есть http://wasm.ru/article.php?article=drvw2k14
lilkiddd, из моего опыта, лучший метод это в user mode сделать ReadFile() или DeviceIOControl(), а в драйвере ты получишь IRP. Эти IRP можно вернуть сразу а можно позже. User mode может ждать (blocking call) а может делать всё асинхронно (overlapped IO).
s0larian, проблема такого подхода в том что нужно предусматривать отмену IRP, т.е вести cancel-safe queue, юзать CsqXXX, заводить отдельный поток и т.д. Иначе если вдруг твой драйвер выгрузится, а у него будут pending IRP, то вылезет BSOD. Хотя для драйверов, не поддерживающих выгрузку можно наверное и не париться по этому поводу.
Sheph, ессно нужен cancel safe queue. Штука простая, есть в xp и 2k/ddk. Потока не нужно. Кста, это самая стандартная модель. lilkiddd, с https всё сложнее. Посмотри ethereal.