欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

《驱动开发技术详解》的有关问题

更新时间: 2014-01-05 03:19:26 责任编辑: Author_N1

 

《驱动开发技术详解》的问题
《windows驱动开发技术详解》第9章StartIO例程,那个取消函数OnCancelIRP,有段代码不太理解:


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"));
}


调用 KeLowerIrql(oldirql); 的这段代码,是不是多余了?
之前释放Cancel自旋锁 IoReleaseCancelSpinLock(Irp->CancelIrql); 时,已经把 Irql 设置回去了,为什么这里还要再设置一次呢?
--参考方法--
这本书里面有些代码确实是有问题的
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 03:19:26
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/20772/
本文WWW.DOC100.NET DOC100.NET版权所有。