Работа с IRP.

Тема в разделе "WASM.NT.KERNEL", создана пользователем r0m4n, 1 ноя 2011.

  1. r0m4n

    r0m4n New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2011
    Сообщения:
    9
    Здравствуйте.
    Есть несколько вопросов по обработке IRP.
    Я думаю вопросы простые поэтому выпишу сразу все.

    Ни кто не знает как пропустить IRP дальше по стеку устройств?

    Когда этот код не будет работать правильно?

    В каких случаях нужно устанавливать свою процедуру завершения?

    Как завершить IRP?

    Как заменить данные в IRP, если это например IRP_MJ_READ?

    Для лучшего понимания приведите пожалуйста код.
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    r0m4n
    Чтобы полно ответить на все вопросы, надо половину книги сюда переписать. Есть разные варианты и обстоятельства создания, отправки IRP, установки процедуры завершения, освобождения IRP. Думаю, есть смысл прочитать Programming Windows Driver Model, написанную Walter'ом Oney. Книга довольно старая (и некоторые вещи там описаны неправильно), но общее представление дает. Книга довольно легко находится в .chm формате, вроде есть перевод на русский язык. Ну или купить в крайнем случае :).
     
  3. r0m4n

    r0m4n New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2011
    Сообщения:
    9
    Ок, спасибо, книжку еле нашёл,посмотрю.
    Откровенно говоря глаза уже на лоб лезут от всяких книженций итп, хочется простых и гениальных ответов. : )
    Если всёже в природе существуют еще более короткие ответы на мои вопросы, добро пожаловать.
     
  4. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    В обработчике MJ-запроса:
    Код (Text):
    1. PDEVICE_OBJECT pLowerDevObj = ...;
    2. IoSkipCurrentIrpStackLocation (pIrp);
    3. return IoCallDriver (pLowerDevObj, pIrp);
    Чуть более подробно есть здесь.

    Вышеприведённый код всегда будет работать правильно.

    Когда нужно получить результат работы целевого (нижележащего) драйвера и только после этого выполнить какие-либо действия. Или когда нужно реализовать синхронную обработку запроса в случае, если целевой (нижележащий) драйвер принудительно обрабатывает все запросы в асинхронном режиме. Ещё информация есть здесь.

    Воспользуйся функцией IoCompleteRequest(), более подробно здесь.

    Зависит от того, какой механизм передачи данных поддерживает устройство (твоё или нижележащего драйвера). От этого зависит, какой буфер использовать для записи данных - системный (буферизация) или указанный вызывающим кодом (прямой ввод/вывод через MDL). Более подробно здесь. Правда, не совсем понятно, что значит "заменить"? Если имеется в виду замена данных уже после того, как нижележащий драйвер заполнил буфер, тогда придётся поставить функцию завершения и выполнить указанные манипуляции с буфером там.

    Например, здесь, ажно две статьи. Ещё советую изучить этот раздел.
     
  5. r0m4n

    r0m4n New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2011
    Сообщения:
    9
    Отлично!
    То что нужно. Спасибо.
     
  6. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Не всегда, это касает PnP устройств . Из Аттач\деттач. Но на фильтрах вроде всегда верен будет.
     
  7. x64

    x64 New Member

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

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    x64
    Не всегда запросы можно отправлять устройству. В частности из за изменения power или во время аттача детача устройства ему еще нельзя отправлять IRP запросы(IRP_MJ_READ, IRP_MJ_WRITE).
     
  9. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Да, но пусть этим рулит нижележащий драйвер, фильтру-то что?

    Конкретнее? Например, в исходнике kbfilter я не нашёл никакой особой обработки Power-запросов. Единственное, что там PoStartNextPowerIrp() ещё вызвать надо перед этим, да, об этом я забыл упомянуть, но в остальном - ничего особенного.

    И это тоже верно, но во время аттача всё синхронизировано, этим рулит флаг инициализации девайса, который указывает, что устройству нельзя слать запросы и который сбрасывается в момент, когда девайс фильтра готов к приёму и обработке запросов. При удалении устройства из стека действительно нужно отсоединиться от стека, т.е. от нижележащего девайса, а при обработке других PnP-запросов нужно ещё и другие всякие телодвижения совершать, но я не думаю, что нужно расписывать сейчас эти тонкости все, автору WDM-модель ещё изучать и изучать.
     
  10. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    x64
    Пост #6
    kbfilter - это ключевой момент. фильтер. И хотел добавить: в WDK много бажных семплов с особенности с PnP . Много раз видел BSOD название не помню (это очевидно было в DDK ) . Были обсуждения крявых семплов но сейчас линков нет, так как дравами не занимаюсь (Нет работы ).


    В целом да, но опять таки если это не фильтер , то драйвер устройства должен сам синхронизировать ... и вызовы IoSkipCurrentIrpStackLocation будут доступны в не скольких диспатчерах ...

    Но в целом согласен ТС надо почитать ...
     
  11. wanamingo

    wanamingo New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2011
    Сообщения:
    1
    Её можно скачать здесь http://www.zip-host.ru/file63106