Windows驱动开发WDM (7)- 异步IRP

本文介绍了Windows驱动开发中的异步IRP处理,通过对比同步IRP的局限性,阐述了异步IRP如何提高系统性能。详细讲解了caller如何通过ReadFile、WriteFile、DeviceIoControl进行异步通信,以及驱动如何通过IoMarkIrpPending和系统线程实现异步处理。同时,提供了caller测试例子和完整代码下载链接。
摘要由CSDN通过智能技术生成

同步IRP是很简单的,比如caller调用DeviceIoControll,那么DeviceIoControll的IRP会发到相应的驱动,驱动把这个IRP完成,然后caller的DeviceIoControll才返回。同步的缺点很明显,比如驱动需要花10秒处理这个IRP,那么caller就得等待10秒钟,有时候这是个浪费。这是个很常见的问题,解决方案就是采用异步的方式。

 

异步IRP

caller和驱动通信的方式主要就是3个API, ReadFile,WriteFile和DeviceIoControl。这3个函数都支持异步方式(OVERLAPPED)。当采用异步方式的时候,这3个函数会立刻返回,同时得到错误码997(io pending).这个时候caller就可以去做其他事情了,通过WaitForSingleObject等待驱动的处理返回。

如果要使用异步方式,CreateFile打开设备的时候,就需要设置一个标志FILE_FLAG_OVERLAPPED,比如:

HANDLE hDevice = CreateFile(DEVICE_NAME,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,NULL);

 

驱动实现异步方式处理

将驱动代码稍作改变,当驱动接收到caller编码请求的时候,启动一个线程,然后在IRP处理函数里面调用IoMarkIrpPending,并且返回STATUS_PENDING,这样等于IRP_MJ_DEVICE_CONTROL处理函数立刻返回。

NTSTATUS HelloWDMIOControl(IN PDEVICE_OBJECT fdo, IN PIRP Irp)
{
	KdPrint(("Enter HelloWDMIOControl\n"));

	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
	PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);


	//得到IOCTRL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值