阅读:3041回复:1
请教IoSetCancelRoutine的相关问题
我的程序如下
case IOCTL_TEST: { KdPrint(("IOCTL_TEST!\n")); KdPrint(("Irp:%x\n",Irp)); if (fdo->CurrentIrp != NULL) { info=0; status=STATUS_UNSUCCESSFUL; KdPrint(("the previous IRP have not completed!\n")); break; } fdo->CurrentIrp = Irp; KdPrint(("CurrentIrp:%x\n",fdo->CurrentIrp)); IoSetCancelRoutine(Irp, CancelIrpRoutine);//运行到这里,系统崩溃!!! IoMarkIrpPending(Irp); return STATUS_PENDING; break; } CancelIrpRoutine的实现如下 VOID CancelIrpRoutine( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { // KdPrint(("starting cancel irp\n")); PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension; KIRQL oldIrql=Irp->CancelIrql; KeAcquireSpinLock(&pdx->cancelLock,&oldIrql); Irp->IoStatus.Status = STATUS_CANCELLED; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); KeReleaseSpinLock(&pdx->cancelLock,oldIrql); // KdPrint(("end cancel irp\n")); } 用core dump看,总是别的驱动死机,而不是我编写的驱动的问题! |
|
|
沙发#
发布于:2007-10-19 18:06
是你驱动影响的吧?IoCompleteRequest 是不是在setCompleterotin之后了?
|
|
|