阅读:1090回复:0
【求助】看《Windows驱动开发技术详解》 上面碰到的几个问题
看《Windows驱动开发技术详解》 上面碰到的几个问题想不明白,希望高手指点,谢谢
1.书上说 IRP结构中的AssociatedIrp.SystemBuffe即是输出缓冲区地址也是输入缓冲区的地址,那如果IRP请求中即有输出地址又有输出地址怎么办?难道是分成两个IRP? 2.关于startIo例程,书上说如果派遣例程想要将IRP串行化,只要调用IoStartPacket就行了,书中给出的IoStartPacket示例代码如下: void IoStartPacket(PDEVICE_OBJECT pDevObj, PIRP pIrp, PULONG key, PDRIVER_CANCEL cancel) { //获取锁 ..... //设置取消例程 .... //设置IRP pDevObj->CurrentIrp = pIrp; //释放自锁 ... // pDevObj->DriverObject->DriverStartIo(pDevObj, pIrp); } 这里我不明白的是为什么会在IoStartPacket里面调用StartIo例程,既然StartIo例程是串行的,那就应该是不可重入的,如果由IoStartPacket来调用那是不是就会出现StartIo并行执行呢? 另外,根据书上给出的StartIo例程,在其结束时调用了函数IoStartNextPacket,而它给出的IoStartNextPacket示例子函数中又显示调用了StartIo例程,那这样不是递归调用了吗?为什么要这样做呢?我个人的理解应该是IoStartPacket只是将IRP入队列,而对于StartIo的例程的调用应该是系统发现队列不空时调用的,调用完成时将对应的IRP出队列即可,不明白为什么IoStartNextPacket也要由驱动程序自己调用。 初学驱动,理解不正之处请多多请教。 |
|