Windows驱动开发WDM (15)- 完成例程

本文介绍了Windows驱动开发中完成例程的作用和使用方法,详细解析了如何在下层驱动异步完成IRP时,通过完成例程获取IRP完成状态。内容包括设置完成例程的步骤、IRP控制权的转移以及传播Pending位的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在的驱动大多都是分层的,既然是分层驱动,那么调用下层驱动就无可避免。调用下层驱动可以分为同步和异步两种。

1. 下层驱动同步完成irp,那么IoCallDriver返回的时候irp已经完成了。

2. 下层驱动异步完成irp,那么IoCallDriver返回的时候irp还没有完成,irp的状态是pending。

针对第二种情况,因为IoCallDriver直接返回了,那么过滤驱动怎么知道下层驱动什么时候完成了irp呢?哈哈,该轮到完成例程出场了。

 

使用完成例程需要2个步骤:

1. 增加一个完成例程,原型如下:

NTSTATUS MyIoCompletion(IN PDEVICE_OBJECT fdo, IN PIRP irp, IN PVOID context)

2. 在调用下层驱动前,调用IoSetCompletionRoutine,如:

IoSetCompletionRoutine(Irp, MyIoCompletion, NULL, TRUE, TRUE, TRUE);

 

将前面的例子http://blog.csdn.net/zj510/article/details/8332658,稍作改动,改动的是过滤驱动。

增加一个完成例程

NTSTATUS MyIoCompletion(IN PDEVICE_OBJECT fdo, IN PIRP irp, IN PVOID context)
{
	KdPrint(("Enter MyIoCompletion\n"));

	if(irp->PendingReturned)
	{
		IoMarkIrpPending(irp);
	}

	KdPrint(("Leave MyIoCompletion\n"));

	return STATUS_SUCCESS;
}

这个函数啥也没做,就打2个log。

 

设置完成例程

NTSTATUS HelloWDMIOControl(IN PDEVICE_OBJECT fdo, IN PIRP Irp)
{
	KdPrint
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值