Windows发送I/O request到WDF driver时,framework代表driver接收request来进行分派、组队、完成、取消操作。
当接收到I/O request时,Framework决定
1.自行处理请求
2.发起一个回调函数让WDF driver处理请求:framework把数据包装成a framework request object
framework跟踪每一个I/O request:当需要时,可以调用合适的callback
framework通过建立一个或多个queue object和配置信息管理一列I/O request
1.queue处理的I/O request类型
2.请求是如何从queue分派的
3.power management事件是如何影响queue的
WDF driver注册queue的回调函数来接收请求,queue object调用合适的回调函数来分派请求,3种注册queue object的方法:
1.并行:queue及时向driver压入请求,同时可以有多个活动请求
2.序列:只有当上一个请求被完成或者转发了之后,queue向driver压入请求。
3.手动:根据需求,driver向queue拉取请求
PnP和Power manager可以影响I/O queue的状态,framework对queue其有这两者的支持和取消请求操作。
driver通过配置queue开始、停止、恢复的行为来响应相关事件
driver可以显式地开始、停止、恢复、清除的行为
取消I/O请求
Windows I/O是不同步的,导致很难正确取消请求。
WDF driver需要仔细处理锁的问题,通过多个处理例程处理。
Framework提供了默认的处理,不需要driver的影响。
当I/O请求取消时:
1.默认framework取消在queue中的请求。
2.除非driver把请求标记成cancelable,queue中移除并分派的请求不能被取消。
3.WDF driver可以对正在处理的请求标记成可被framework取消的。
I/O target
WDF driver有时需要把I/O request发送给其他驱动
1.driver需要把一些请求从栈传递下去。
2.driver有时需要发起I/O request:比如为了获取栈底bus driver的信息
3.driver有时需要发送I/O request到另一个设备栈获得信息
driver把请求发送给I/O target(一个framework object),可以是同步或非同步的。
默认的I/O target是设备栈低一级设备的driver,也可以调整为同个栈中另一个driver或者完全不同栈中的driver。
I/O target对driver的接口:
1.target的state
2.格式化请求
3.获得target的信息
4.获得target的移除消息
I/O target追踪请求:当target device或者source driver状态变化时,可以取消请求。
处理不致命错误
1.一些错误driver无法恢复,UMDF crash,KMDF bug check
2.一些错误driver可以恢复,UMDF 返回HRESULT,KMDF 返回NTSTATUS
WDF driver可以返回错误:比如会返回fail的回调函数
有时候要处理NULL
*PREfast(静态分析工具)可以帮助检查错误处理
告知UMDF错误:
1.HRESULT支持多个成功失败码
2.使用SUCCEED或FAID宏来检查HRESULT
3.UMDF驱动的回调函数返回HRESULT值
4.HRESULT错误值在“COM介绍”一章讨论
告知KMDF错误:
1.NTSTATUS支持多个成功失败码
2.使用NT_SUCCESS宏来检查NTSTATUS
3.KMDF驱动的回调函数返回NTSTATUS值
4.NTSTATUS在Ntstatus.h中定义,也可以自定义NTSTATUS(在组件间可以理解的条件下)
*%wdk%\inc\wdk\kmdf\VersionNumver\Wdfstatus.h
当接收到I/O request时,Framework决定
1.自行处理请求
2.发起一个回调函数让WDF driver处理请求:framework把数据包装成a framework request object
framework跟踪每一个I/O request:当需要时,可以调用合适的callback
framework通过建立一个或多个queue object和配置信息管理一列I/O request
1.queue处理的I/O request类型
2.请求是如何从queue分派的
3.power management事件是如何影响queue的
WDF driver注册queue的回调函数来接收请求,queue object调用合适的回调函数来分派请求,3种注册queue object的方法:
1.并行:queue及时向driver压入请求,同时可以有多个活动请求
2.序列:只有当上一个请求被完成或者转发了之后,queue向driver压入请求。
3.手动:根据需求,driver向queue拉取请求
PnP和Power manager可以影响I/O queue的状态,framework对queue其有这两者的支持和取消请求操作。
driver通过配置queue开始、停止、恢复的行为来响应相关事件
driver可以显式地开始、停止、恢复、清除的行为
取消I/O请求
Windows I/O是不同步的,导致很难正确取消请求。
WDF driver需要仔细处理锁的问题,通过多个处理例程处理。
Framework提供了默认的处理,不需要driver的影响。
当I/O请求取消时:
1.默认framework取消在queue中的请求。
2.除非driver把请求标记成cancelable,queue中移除并分派的请求不能被取消。
3.WDF driver可以对正在处理的请求标记成可被framework取消的。
I/O target
WDF driver有时需要把I/O request发送给其他驱动
1.driver需要把一些请求从栈传递下去。
2.driver有时需要发起I/O request:比如为了获取栈底bus driver的信息
3.driver有时需要发送I/O request到另一个设备栈获得信息
driver把请求发送给I/O target(一个framework object),可以是同步或非同步的。
默认的I/O target是设备栈低一级设备的driver,也可以调整为同个栈中另一个driver或者完全不同栈中的driver。
I/O target对driver的接口:
1.target的state
2.格式化请求
3.获得target的信息
4.获得target的移除消息
I/O target追踪请求:当target device或者source driver状态变化时,可以取消请求。
处理不致命错误
1.一些错误driver无法恢复,UMDF crash,KMDF bug check
2.一些错误driver可以恢复,UMDF 返回HRESULT,KMDF 返回NTSTATUS
WDF driver可以返回错误:比如会返回fail的回调函数
有时候要处理NULL
*PREfast(静态分析工具)可以帮助检查错误处理
告知UMDF错误:
1.HRESULT支持多个成功失败码
2.使用SUCCEED或FAID宏来检查HRESULT
3.UMDF驱动的回调函数返回HRESULT值
4.HRESULT错误值在“COM介绍”一章讨论
告知KMDF错误:
1.NTSTATUS支持多个成功失败码
2.使用NT_SUCCESS宏来检查NTSTATUS
3.KMDF驱动的回调函数返回NTSTATUS值
4.NTSTATUS在Ntstatus.h中定义,也可以自定义NTSTATUS(在组件间可以理解的条件下)
*%wdk%\inc\wdk\kmdf\VersionNumver\Wdfstatus.h