在发送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。
情形:
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。