首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

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

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

《驱动开发技术详解》的问题
《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 设置回去了,为什么这里还要再设置一次呢?
[解决办法]
这本书里面有些代码确实是有问题的

热点排行