您的位置:首页 > 其它

学习windwos驱动(IO模型)

2015-10-28 13:28 204 查看
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请求都在队列中等待,最后发送给设备对象处理。

IO目标对象的细节:

IO目标是什么?

IO目标是对IO请求将发送到的目标驱动的表述。

比如向内核驱动设备发送一个IOCTL命令,这个远程设备对象就是IOCTL命令的IO目标(IO Target)。

IO目标对象有什么作用?

可以请求以同步方式发送IO目标对象;

请求异步方式发送到IO目标对象;

为发送到IO目标的请求设置超时,如果超时未完成,就取消请求。

可以启动、停止、关闭IO目标对象,IO目标对象启动后才能接收请求,不然就关闭外界请求通道;

跟踪维护发送到IO目标的IO请求。例如删除目标对象后,所有与IO目标对象有关的排队的IO请求对象将被删除。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: