发现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分段来处理。