chapter 9.6:格式化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格式化一個未改變的請求
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 完成回撥函式
驅動需要為所有非同步請求設定完成回撥函式,除非驅動為請求設定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。