IoBuildDeviceIoControlRequest的内核事件对象是否可以在本地作用域中分配

我是司机开发的新手。 我有一个基本的问题。

在编写WDM设备驱动程序时,可以调用IoBuildDeviceIoControlRequest / IoBuildSynchronousFsdRequest来分配一个同步IRP以传递给另一个目标驱动程序。 基本要求之一是我们必须在调用这些函数之前分配一个事件对象。 而且,当目标驱动程序完成IRP时,我们必须确保这个事件对象仍然可用

我们真的可以从调用IoBuildDeviceIoControlRequest / IoBuildSynchronousFsdRequest的函数的本地范围真的分配该事件对象吗? 即从内核堆栈而不是从非分页池。 许多示例代码只是从本地作用域和内核堆栈中分配事件对象。 但是如果在目标驱动程序仍在处理IRP的情况下调用驱动程序,那么会不会有问题呢?

所以,如果我有这个权利,你分配你的事件(堆栈),建立IRP,发出它,然后等待事件,所有在一个函数?

栈是否被分页取决于你传递给KeWaitForSingleObject()的wait-mode参数。 用户模式意味着你很高兴被分页的堆栈。 coreelMode意味着堆栈不被允许被分页。

我记得,IRP完成例程运行在DISPATCH_LEVEL,这就是为什么你需要保证事件被分页。这些例程将设置事件,所以你知道IRP已经完成,但在DISPATCH_LEVEL,页面调页-out页面不能发生(NT内核设计的结果); 你改为蓝屏。