Здравствуйте. Есть несколько вопросов по обработке IRP. Я думаю вопросы простые поэтому выпишу сразу все. Ни кто не знает как пропустить IRP дальше по стеку устройств? Когда этот код не будет работать правильно? В каких случаях нужно устанавливать свою процедуру завершения? Как завершить IRP? Как заменить данные в IRP, если это например IRP_MJ_READ? Для лучшего понимания приведите пожалуйста код.
r0m4n Чтобы полно ответить на все вопросы, надо половину книги сюда переписать. Есть разные варианты и обстоятельства создания, отправки IRP, установки процедуры завершения, освобождения IRP. Думаю, есть смысл прочитать Programming Windows Driver Model, написанную Walter'ом Oney. Книга довольно старая (и некоторые вещи там описаны неправильно), но общее представление дает. Книга довольно легко находится в .chm формате, вроде есть перевод на русский язык. Ну или купить в крайнем случае .
Ок, спасибо, книжку еле нашёл,посмотрю. Откровенно говоря глаза уже на лоб лезут от всяких книженций итп, хочется простых и гениальных ответов. : ) Если всёже в природе существуют еще более короткие ответы на мои вопросы, добро пожаловать.
В обработчике MJ-запроса: Код (Text): PDEVICE_OBJECT pLowerDevObj = ...; IoSkipCurrentIrpStackLocation (pIrp); return IoCallDriver (pLowerDevObj, pIrp); Чуть более подробно есть здесь. Вышеприведённый код всегда будет работать правильно. Когда нужно получить результат работы целевого (нижележащего) драйвера и только после этого выполнить какие-либо действия. Или когда нужно реализовать синхронную обработку запроса в случае, если целевой (нижележащий) драйвер принудительно обрабатывает все запросы в асинхронном режиме. Ещё информация есть здесь. Воспользуйся функцией IoCompleteRequest(), более подробно здесь. Зависит от того, какой механизм передачи данных поддерживает устройство (твоё или нижележащего драйвера). От этого зависит, какой буфер использовать для записи данных - системный (буферизация) или указанный вызывающим кодом (прямой ввод/вывод через MDL). Более подробно здесь. Правда, не совсем понятно, что значит "заменить"? Если имеется в виду замена данных уже после того, как нижележащий драйвер заполнил буфер, тогда придётся поставить функцию завершения и выполнить указанные манипуляции с буфером там. Например, здесь, ажно две статьи. Ещё советую изучить этот раздел.
x64 Не всегда запросы можно отправлять устройству. В частности из за изменения power или во время аттача детача устройства ему еще нельзя отправлять IRP запросы(IRP_MJ_READ, IRP_MJ_WRITE).
Да, но пусть этим рулит нижележащий драйвер, фильтру-то что? Конкретнее? Например, в исходнике kbfilter я не нашёл никакой особой обработки Power-запросов. Единственное, что там PoStartNextPowerIrp() ещё вызвать надо перед этим, да, об этом я забыл упомянуть, но в остальном - ничего особенного. И это тоже верно, но во время аттача всё синхронизировано, этим рулит флаг инициализации девайса, который указывает, что устройству нельзя слать запросы и который сбрасывается в момент, когда девайс фильтра готов к приёму и обработке запросов. При удалении устройства из стека действительно нужно отсоединиться от стека, т.е. от нижележащего девайса, а при обработке других PnP-запросов нужно ещё и другие всякие телодвижения совершать, но я не думаю, что нужно расписывать сейчас эти тонкости все, автору WDM-модель ещё изучать и изучать.
x64 Пост #6 kbfilter - это ключевой момент. фильтер. И хотел добавить: в WDK много бажных семплов с особенности с PnP . Много раз видел BSOD название не помню (это очевидно было в DDK ) . Были обсуждения крявых семплов но сейчас линков нет, так как дравами не занимаюсь (Нет работы ). В целом да, но опять таки если это не фильтер , то драйвер устройства должен сам синхронизировать ... и вызовы IoSkipCurrentIrpStackLocation будут доступны в не скольких диспатчерах ... Но в целом согласен ТС надо почитать ...