阅读:1692回复:0
关于自建IRP使用的一点心得
在写Windows上的WDM驱动程序时通常需要自建IRP,然后用它来跟更低层的驱动程序通信。下面我就我碰到的关于自建IRP的一个问题,以及一些心得作一下描述。
1)IoAllocateIrp的使用 IoAllocateIrp的第一个参数是指定需要分配给这个IRP的STACK_LOCATTION的长度。通常我们取我们的设备对象直接下层的设备对象的STACK_LOCATION的长度,而没有给我们的设备对象保留空间。如果这样做,那么在自建IRP的完成例程中,你将不能使用参数指定设备对象,因为它是NULL。所以如果在完成例程中想访问我们的设备对象,必须把设备对象的地址在设置完成例程时传进去。 还有一种做法就是在调用IoAllocateIrp 时,指定的STACK长度是下层设备对象的stack长度+1,然后把当前stack location指针向前走一个,然后把设备对象填进去。 2)自建IRP的完成例程 在通常的IRP完成例程里面我们都会以STATUS_SUCCESS或者STATUS_CANCELED返回,但是在自建的IRP的完成例程里面我个人认为最后都用STATUS_MORE_PROCESSING_REQUIRED返回。因为当返回STATUS_MORE_PROCESSING_REQUIRED时,完成例程回卷过程结束,控制权返回给当前设备对象的驱动程序。这是我们可以做很多事情了,可以释放这个IRP,也可以继续使用这个IRP。 欢迎讨论 |
|