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