我是司机发展的新手。我有一个基本问题。
在编写WDM设备驱动程序时,可以调用 IoBuildDeviceIoControlRequest / IoBuildSynchronousFsdRequest 来分配要传递给另一个目标驱动程序的同步IRP。基本要求之一是我们必须在调用这些函数之前分配事件对象。 并且,我们必须确保在目标驱动程序完成IRP 时此事件对象仍然可用。
我们真的可以从调用 IoBuildDeviceIoControlRequest / IoBuildSynchronousFsdRequest 的函数的本地范围中分配该事件对象吗?即从内核堆栈而不是从非分页池。许多示例代码只是从本地作用域分配事件对象,因此也就是内核堆栈。但是如果我们的调用驱动程序在目标驱动程序仍在处理我们的IRP时被分页,那么实际上会出现问题吗?
答案 0 :(得分:1)
所以,如果我有这个权利,你分配你的事件(在堆栈外),构建IRP,发出它,然后等待事件,所有这一切都在一个函数中?
堆栈是否被分页取决于您传递给KeWaitForSingleObject()的wait-mode参数。 UserMode意味着您对堆栈的分页感到高兴。 KernelMode意味着不允许对堆栈进行分页。
我想想我记得IRP完成例程在DISPATCH_LEVEL运行,这就是你需要保证事件被分页的原因。这些例程将设置事件,所以你知道IRP已经完成,但在DISPATCH_LEVEL,分页页面的分页不会发生(NT内核设计的结果);你改为蓝屏。