阅读:1919回复:2
关于StartIo例程的问题
问各位驱动大牛一个关于StartIo例程的问题。
在驱动程序中提供了取消例程,代码如下: VOID OnCancelIRP( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { KdPrint(("Enter CancelReadIRP\n")); if (Irp==DeviceObject->CurrentIrp) { //表明当前正在改由StartIo处理 //但StartIo并没有获取cancel自旋锁之前 //这时候需要 KIRQL oldirql = Irp->CancelIrql; //释放Cancel自旋锁 IoReleaseCancelSpinLock(Irp->CancelIrql); IoStartNextPacket(DeviceObject,TRUE); KeLowerIrql(oldirql); }else { //从设备队列中将该IRP抽取出来 KeRemoveEntryDeviceQueue(&DeviceObject->DeviceQueue,&Irp->Tail.Overlay.DeviceQueueEntry); //释放Cancel自旋锁 IoReleaseCancelSpinLock(Irp->CancelIrql); } //设置完成状态为STATUS_CANCELLED Irp->IoStatus.Status = STATUS_CANCELLED; Irp->IoStatus.Information = 0; // bytes xfered IoCompleteRequest( Irp, IO_NO_INCREMENT ); KdPrint(("Leave CancelReadIRP\n")); } 在判断该历程为正在由StartIo处理的例程时,使用IoStartNextPacket(DeviceObject,TRUE)取出队列中下一个Irp,到这里我认为应该退出程序了啊。 不然的话,取消例程继续往下执行,就到了把IRP状态设置为STATUS_CANCELLED这里了,但是这个IRP正在由StartIo处理啊,怎么在取消例程中直接 结束了呢? |
|
沙发#
发布于:2010-05-01 21:59
哪里有取消例程??
|
|
|
板凳#
发布于:2010-05-04 23:51
已经明白了。
|
|