1

我是驱动程序开发的新手。我有一个基本问题。

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

我们真的可以从调用IoBuildDeviceIoControlRequest/IoBuildSynchronousFsdRequest的函数的本地范围分配该事件对象吗?即来自内核堆栈而不是来自非分页池。许多示例代码只是从本地范围分配事件对象,因此从内核堆栈中分配。但是,如果我们的调用驱动程序在目标驱动程序仍在处理我们的 IRP 时被分页,实际上会有问题吗?

4

1 回答 1

1

所以,如果我做对了,你分配你的事件(离开堆栈),构建 IRP,发出它,然后等待事件,所有这些都在一个函数中?

堆栈是否被分页取决于您传递给 KeWaitForSingleObject() 的等待模式参数。UserMode 意味着您很高兴堆栈被分页。KernelMode 表示不允许对堆栈进行分页。

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

于 2011-04-22T09:38:39.803 回答