Может ли объект события ядра для IoBuildDeviceIoControlRequest выделен в локальной области

Я новичок в разработке драйверов. У меня основной вопрос.

При написании драйверов устройств WDM можно вызвать IoBuildDeviceIoControlRequest / IoBuildSynchronousFsdRequest, чтобы выделить синхронный IRP для передачи другому целевому драйверу. Одно из основных требований - выделить объект событие перед вызовом этих функций. И мы должны убедиться, что этот объект события все еще доступен к моменту, когда целевой драйвер завершит IRP.

Можем ли мы выделить этот объект события из локальной области действия вызывающей функции IoBuildDeviceIoControlRequest / IoBuildSynchronousFsdRequest? то есть из стека ядра, а не из невыгружаемого пула. Многие примеры кодов просто выделяют объект события из локальной области видимости и, следовательно, из стека ядра. Но возникнет ли проблема, если вызывающий драйвер будет выгружен, в то время как целевой драйвер все еще обрабатывает наш IRP?


person JavaMan    schedule 22.04.2011    source источник


Ответы (1)


Итак, если у меня есть это право, вы выделяете свое событие (вне стека), создаете IRP, отправляете его, а затем ждете события, все в одной функции?

Будет ли стек выгружен или нет, зависит от аргумента режима ожидания, который вы передаете в KeWaitForSingleObject (). UserMode означает, что вы довольны тем, что стек был выгружен. KernelMode означает, что подкачка стека запрещена.

Я думаю, что я помню, что подпрограммы завершения IRP выполняются на DISPATCH_LEVEL, поэтому вам нужно гарантировать, что событие будет загружено на страницу. Эти подпрограммы будут устанавливать событие, поэтому вы знаете, что IRP завершился, но на DISPATCH_LEVEL, подкачка выгружаемых страниц невозможна (следствие конструкции ядра NT); у вас синий экран вместо этого.

person Community    schedule 22.04.2011
comment
Мне нужно исправить одну вещь. Процедура завершения IRP выполняется на любом уровне IRQL вызывающей стороны. Это может быть PASSIVE ИЛИ DISPATCH_LEVEL. И да, я имею в виду создание собственного пакета IRP в собственном коде режима ядра и выдачу его некоторым другим драйверам. По сути, все распространенные примеры кодов (книга Онея, книга Арта Бейкера) просто выделяют объект события из локальной области видимости и передают его другим драйверам. - person JavaMan; 22.04.2011
comment
Все ли ждут с KernelMode? - person ; 22.04.2011
comment
Да, они просто не объяснили этот аргумент KernelMode. - person JavaMan; 22.04.2011