Может ли объект события ядра для IoBuildDeviceIoControlRequest выделяться в локальной области действия - PullRequest
1 голос
/ 22 апреля 2011

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

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

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

1 Ответ

1 голос
/ 22 апреля 2011

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

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

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

...