首页 > Windows驱动开发 > IRP完成例程的一点疑问

IRP完成例程的一点疑问

(对驱动的学习一直是断断续续,最近又重新开始看驱动,对完成例程和IRP以及IO堆栈有了新的认识,具体请看《IO_STACK_LOCATION与IRP的一点笔记》)
通常使用完成例程有三步:

  1. 调用IoCopyCurrentIrpStackLocationToNext()函数,把当前的IRP栈数据复制一份到下一层。
  2. 调用IoSetCompletionRoutine()函数,为IRP设置完成例程。
  3. 调用IoCallDriver()函数,把IRP传递到下一层驱动对象。

完成例程的返回值有STATUS_SUCCESS活着STATUS_MORE_PROCESSING_REQUIRED。如果返回STATUS_MORE_PROCESSING_REQUIRED,将停止会卷,本层堆栈将继续获得IRP控制权。如果完成例程返回STATUS_SUCCESS,那么需要检测IRP的PendingReturned域,如果为TRUE,则应该调用IoMarkIrpPending。WDK的解释如下:

If set to TRUE, a driver has marked the IRP pending. Each IoCompletion routine should check the value of this flag. If the flag is TRUE, and if the IoCompletion routine will not return STATUS_MORE_PROCESSING_REQUIRED, the routine should call IoMarkIrpPending to propagate the pending status to drivers above it in the device stack.

这里我是弄不太明白。为什么驱动完成例程中如果检测到Irp->PendingReturned就要IoMarkIrpPending来挂起IRP呢?如果已经进入了完成例程,表示下层驱动已经IoCompleteRequest了,此时还有必要在上层挂起IRP吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
NTSTATUS MyIoCompletion(PDEVICE_OBJECT pDevObj,
					PIRP pIrp,
					PVOID Context)
{
	if (pIrp->PendingReturned)
	{
		// 传播PENDING位
		IoMarkIrpPending(pIrp);
	}
	// 其他操作...
 
	return STATUS_SUCCESS;
}

觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> IRP完成例程的一点疑问
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



  1. 本文目前尚无任何评论.