|
阅读:3143回复: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之后了?
|
|
|