当前位置: 代码迷 >> 驱动开发 >> Cancel自旋锁 起了什么作用?该怎么处理
  详细解决方案

Cancel自旋锁 起了什么作用?该怎么处理

热度:1107   发布时间:2016-04-28 11:24:36.0
Cancel自旋锁 起了什么作用?
发现IoCancelIrp 函数中

获取了Cancel自旋锁
设置了Irp->Cancel
调用了OnCancelIo函数
但是进入了OnCancelIo函数后 立刻就释放了

还有 像

if(Irp!=DeviceObject->Current||Irp->Cancel)
{
IoReleaseCancelSpinlock(oldirql);
return;
}
else
{IoSetCancelRoutine(Irp,NULL); ①
IoReleaseCancelSpinlock(oldirql); 
}


就为了设置或判断一下Irp->Cancel ?? 

另外上面的 ①处 这段代码来自windows驱动开发技术详解 
这里的注释是 正在被startIo处理的IRP不允许调用取消例程 所以把取消例程设为null

这太奇怪了  
难道我不能取消一个很耗时的异步读取IRP ?? 比如 一个很大的硬盘复制操作 这怎可能

------解决方案--------------------
正在执行的IRP是不能被取消的,只能干等着,因为操作系统不知道在哪里处理IO,所以长时间的请求会分割成n个IRP分段来处理。