fxllsw
驱动牛犊
驱动牛犊
  • 注册日期2010-02-01
  • 最后登录2010-07-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望61点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1919回复:2

关于StartIo例程的问题

楼主#
更多 发布于:2010-04-28 20:47
问各位驱动大牛一个关于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处理啊,怎么在取消例程中直接
结束了呢?
Pegram
论坛版主
论坛版主
  • 注册日期2005-12-03
  • 最后登录2013-08-23
  • 粉丝13
  • 关注5
  • 积分1333分
  • 威望4717点
  • 贡献值1点
  • 好评度78点
  • 原创分0分
  • 专家分2分
沙发#
发布于:2010-05-01 21:59
哪里有取消例程??
《寒江独钓》与《竹林蹊径》的合作作者。精通USB开发,设计了CY001 USB驱动套件(http://bbs.driverdevelop.com/read.php?tid-119314.html)。
fxllsw
驱动牛犊
驱动牛犊
  • 注册日期2010-02-01
  • 最后登录2010-07-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望61点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-05-04 23:51
已经明白了。
游客

返回顶部