fanzi
驱动小牛
驱动小牛
  • 注册日期2004-12-09
  • 最后登录2013-12-19
  • 粉丝1
  • 关注0
  • 积分1004分
  • 威望754点
  • 贡献值0点
  • 好评度93点
  • 原创分0分
  • 专家分0分
阅读:2867回复:1

请教IoSetCancelRoutine的相关问题

楼主#
更多 发布于:2007-10-16 14:17
我的程序如下
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看,总是别的驱动死机,而不是我编写的驱动的问题!
张帆的内核学习论坛 http://bbs.kerneldev.com
fooegg
驱动小牛
驱动小牛
  • 注册日期2007-08-25
  • 最后登录2008-08-31
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望111点
  • 贡献值0点
  • 好评度110点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-10-19 18:06
是你驱动影响的吧?IoCompleteRequest 是不是在setCompleterotin之后了?
毛主席夸我水灌得好
游客

返回顶部