chapter 9.6:格式化I/O请求

在发送I/O请求前经常必须格式化请求,设置I/O栈位置及其他信息(如完成回调)
情形:
    1.接受从framework来的请求,并发送到I/O target,此时需要设置buffer offset或者更改数据长度或内容。
    2.驱动把自己创建的I/O请求发送给I/O target
    3.驱动为请求设置完成回调函数
驱动必须格式化所有请求,除了一种情况:从framework接受请求,不进行任何改动,直接转发给默认I/O target(sent and forget)
如何格式化请求:
    1.为默认I/O target格式化一个未改变的请求
    2.格式化驱动创建的请求或重新格式化framework的请求
    3.格式化并发送同步的请求(KMDF)

为默认I/O target格式化一个未改变的请求
若驱动想为I/O请求设置完成回调函数,必须在发给I/O target前对请求格式化
UMDF:IWDFRequest::FormatUsingCurrentType
KMDF:WdfRequestFormatRequestUsingCurrentType
方法获取一个已有的WDF I/O请求对象,为底层的IRP设置I/O栈位置(下一层驱动),而不改动IRP
即WDM的IoCopyCurrentIrpStackLocationToNext方法。
若驱动不需要设置完成回调,则不必格式化请求。


格式化驱动创建的请求或重新格式化framework的请求
使用I/O target object上的格式化方法。
UMDF
    ####
KMDF
    WdfIoTargetFormatRequestForInternalIoct:为任何I/O target格式化内部IOCTL
    WdfIoTargetFormatRequestForInternalIoctlOthers:为非标准参数的任何I/O target格式化内部IOCTL
    WdfIoTargetFormatRequestForIoctl:为任何I/O target格式化IOCTL
    WdfIoTargetFormatRequestForRead:为任何I/O target格式化读请求
    WdfIoTargetFormatRequestForWrite:为任何I/O target格式化写请求
KMDF提供方法:在单独调用中格式化并发送同步的I/O请求
参数:
    1.Request:需要格式化的请求
    2.IoctlCode:IOCTL控制码,设备IOCTL
    3.InputMemory:WDF mem obj,用于read和IOCTL请求
    4.InputMemoryOffset:WDFMEMORY_OFFSET structure,offset和length
    5.OutputMemory:WDF mem obj,用于write和IOCTL请求
    6.OutputMemoryOffset:WDFMEMORY_OFFSET structure,offset和length
    7.DeviceOffset:设备中的offset,开始transfer的位置,只用于read和write请求
    KMDF需要I/O target的handle
UMDF例子
    ####
KMDF例子
    Toastmon.c


I/O 完成回调函数
WDF默认非同步地发送I/O请求。
驱动需要为所有非同步请求设置完成回调函数,除非驱动为请求设置send-and-forget
UMDF:
KMDF:WdfRequestSetCompletionRoutine
I/O 完成回调函数处理过程:
    驱动需要可以为从上面接受过了的请求注册完成回调。
    检查完成状态,获得I/O buffer里的数据。
    若驱动创建了请求,则不必注册完成回调函数。(只需设置parent)
KMDF还可以重用它创建的请求对象
I/O 完成回调函数参数:
    1.Request:KMDF,WDFREQUEST对象的handle
    2.Target:WDFIOTARGET对象的handle
    3.Params:WDF_REQUEST_COMPLETION_PARAMS structure的pointer
    4.Context:驱动定义的context area,注册callback需要的数据
获得完成状态和信息
    UMDF:
    KMDF:WdfRequestGetCompletionParams获得WDF_REQUEST_COMPLETION_PARAMS structure 的指针。
completed by the current driver, deleted, reused, or reformatted之后,CompletionParams才会无效。
Request parameters:到达驱动的请求的参数
Request Completion parameters:发送的至I/O target请求的参数,若不对发送的请求进行改动,Request parameters既是Completion parameters。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值