学习windwos驱动(IO模型)

本文介绍了Windows驱动中的IO管理,特别是IRP如何转换为WDFREQUEST,以及WDFIOTARGET对象的角色。WDFIOTARGET作为IO目标,封装DEVICE_OBJECT并允许多对一的关系,解决了不同驱动间发送命令的问题。它还涉及同步、异步请求、超时管理和IO请求的生命周期控制。

IO管理器将IO请求封装成IRP结构体发往内核驱动。
WDF能够判断成IRP请求是直接在框架内部处理,还是调用WDF驱动注册过的事件回调,交回驱动处理。如果调用事件回调,就必须将IRP封装成框架请求,也就是WDFREQUEST对象。
一般情况,WDF驱动不直接操作IRP。

IO目标对象叫做WDFIOTARGET。
WDFIOTARGET封装了DEVICE_OBJECT,它跟WDFDEVICE对象不同的是:只唯一的WDFDEVICE对象与WDM设备对象关联,因为框架不允许多个WDFDEVICE对象对应于同一个WDM设备对象——因为无法从DEVICE_OBJECT对象反推出WDFDEVICE对象,采用一一对应不会导致管理上混乱。

目标对象的内部逻辑

WDFDEVICE和DEVICE_OBJECT对象的一一对应的不足是无法实现在另一个WDF驱动(Driver2)里发送命令给当前驱动(Driver1)的设备对象(WdfDevice)。
Driver1是设备对象WDFDEVICE的拥有者,WDFDEVICE封装了DEVICE_OBJECT,框架不允许Driver2也拥有一个等效的设备对象WEFDEVICE,不存在另一个封装了DEVICE_OBJECT的WEFDEVICE。
框架对象不能在驱动间传递。
引入WDFIOTARGET对象,是为了当别的驱动程序或本驱动程序的其它地方(如设备里存在多个设备栈)要发送命令到这个设备对象时,可以通过远程WDFIOTARGET对象来完成。
有一个队列与WDFIOTARGET相关联。
IO目标对象作为上层设施,对来自各个方向的请求分类和管理。

概括一下知识点:
框架设备对象WDFDEVICE是对底层设备对象的封装,并唯一。
IO目标对象是框架设备对象WDFDEVICE的封装,可以多个目标对象对应于同一个设备对象。
框架为WEFDEVICE对象创建唯一的本地目标对象。
每个目标对象有一个内部队列,发送目标对象的IO请求都

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值