当前位置: 代码迷 >> 驱动开发 >> 《驱动开发技术详解》的有关问题
  详细解决方案

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

热度:49   发布时间:2016-04-28 10:23:35.0
《驱动开发技术详解》的问题
《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 设置回去了,为什么这里还要再设置一次呢?

------解决方案--------------------
这本书里面有些代码确实是有问题的
  相关解决方案