1. 程式人生 > >chapter 9.6:格式化I/O請求

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。

相關推薦

chapter 9.6:格式化I/O請求

在傳送I/O請求前經常必須格式化請求,設定I/O棧位置及其他資訊(如完成回撥) 情形:     1.接受從framework來的請求,併發送到I/O target,此時需要設定buffer offset或者更改資料長度或內容。     2.驅動把自己建立的I/O請求傳送給I

chapter 9.3: 建立I/O request

種類:read, write, or device I/O control request 建立request時,不包括memory object和其他任何資訊 KMDF驅動可以定義內部IOCTL,引數自定義,支援3種memory object和offset structu

chapter 10 System-Level I/O

like ring 表示 can class 文件表 pri write ble Thu 8 Feb 15:43:18 GMT 2018 Part III interaction and communication between Programs ------------

Java內容梳理(18)API學習(6I/O

目錄: 1、I/O流的分類 2、常用的I/O流 3、物件的序列化和反序列化 4、物件克隆 5、圖片操作 1、I/O流的分類 (1)介紹 流說明了Java中讀寫資料的方式: 順序讀寫資料:從左到右,從上到下依此讀取資料 資料的流動方向:單向 參照物:程式

塊裝置驅動註冊和登出、載入與解除安裝、塊裝置驅動的I/O請求

塊裝置驅動的open()函式和字元裝置驅動的open()和類似,都以相關inode和file結構體指標作為引數,當一個結點引用一個塊裝置時,inode->i_bdev->bd_disk包含一個指向關聯gendisk的結構體的指標.因此類似字元裝置,可將gendisk的private_data賦給f

c++筆記08---I/O 流,格式化 I/O,非格式化 I/O,隨機 I/O,二進位制 I/O

1.    輸入輸出 I/O 流             C: fopen/fclose/fread/fwrite/fprintf/fscanf/fseek/ftell/fput/fget...     C++: 對基本的 I/O 操作做了類的封裝,其功能沒有任何差別,用法

java學習筆記(9)-Java I/O系統

第九章 Java I/O系統 1、題目 1.1、 何為流?根據流的方向,流可分為哪兩種? 流表示檔案傳播的方向和傳播的檔案資訊的集合。根據流的方向,流可分為輸入與輸出流。 PPT:流是在計算機的輸入、輸出操作中流動的資料序列。 1.2、 I

6章 輸入輸出系統——I/O系統

思維導圖: 關於裝置管理 1)管理物件: I/O裝置和相應的裝置控制器(I/O系統組成) 2)基本任務: 完成使用者提出的I/O請求, 提高I/O速率、改善I/O裝置的利用率。 為更高層程序方便使用裝置提供手段 一、I/O系統的功能、模型和介面 1)主要功能: 1.1隱藏物理裝置細節,

Winsock(6) Socket關閉、流式協議、分組-重組I/O

Socket的關閉與流式協議(Stream Protocols)、分組-重組I/O(Scatter-Gather I/O) Socket關閉連線shutdown()/closesocket()函式 一旦你使用完一個Socket連線後,需要及時關閉它來釋放相關資源

C Primer Plus 第6Chapter 9 課後程式設計練習

ex9.1 // ex_9.1 #include <stdio.h> double min(double, double); int main(void) { double num1, num2 = 0; printf("Enter the f

java複習筆記6--java基礎之I/O

什麼是I/O流 所謂I/O(Input/Output縮寫),即指應用程式對資料在裝置或者檔案上的輸入與輸出。流是一組有順序的,有起點和終點的位元組集合,是對資料傳輸的總稱或抽象(java萬物皆物件的特性)。即資料在兩裝置間的傳輸稱為流,流的本質是資料傳輸,根據資

PythonCookBook 筆記 chapter-05-檔案I/O

open函式及引數點選開啟連結 1, 開啟文字檔案的兩種模式 filename = 'file.py' # 對文字檔案的讀寫rt/wt, 對二進位制資料的讀寫rb/wb # 離開with語句塊後,檔案自動關閉 with open(filename, 'rt') as fObj:  

計算機系統結構考試重點:Chapter 8:I/O系統

匯流排的定義以及匯流排的型別 匯流排的定義: 共享的通訊鏈路,用於連線多個子系統的單組連線 控制匯流排,資料匯流排,I/O匯流排 前端匯流排:Front Side Bus(FSB),是將CPU連線到北橋晶片的匯流排。北橋晶片負責聯絡記憶體、顯示卡等資料吞吐量最大

[Google Guava] 9-I/O

原文連結 譯文連結 譯者:沈義揚 位元組流和字元流 Guava使用術語”流” 來表示可關閉的,並且在底層資源中有位置狀態的I/O資料流。術語”位元組流”指的是InputStream或OutputStream,”字元流”指的是Reader 或Writer(雖然他們的介面Readable 和App

U盤格式化後恢復,DiskGenius 4.9.6 海外註冊版

U盤\SD卡,損壞\格式化,裡邊有重要的資料需要恢復,我試了很多方法DiskGenius,需要購買專業版才能使用資料恢復功能。 連結為DiskGenius 4.9.6 海外註冊版,資料恢復功能親測可用 連結: https://pan.baidu.com/s/1ydIcJ03blvRR6a

9.I/O重定向和管道

標準輸入重定向(STDIN,檔案描述符為0):預設從鍵盤輸入。 標準輸出重定向(STDOUT,檔案描述符為1):預設輸出到螢幕。 錯誤輸出重定向(STDERR,檔案描述符為2):預設輸出到螢幕。 1.IO重定向 IO重定向:就是把一些預設輸入輸出

java I/O系統(9)-物件序列化與還原

引言 萬物皆物件,在我們程式執行中,物件只要在引用鏈上存在引用,那麼它就會一直存在。但是當我們程式結束的時候,那麼物件就會消亡。那麼在jvm不執行的時候我們仍能夠儲存下來是非常有意義的,在java中可以用序列化來實現。序列化其實也是IO系統中的一部分。在本篇博

5.9 標準I/O庫_二進位制I/O

    下列兩個函式執行二進位制I/O操作: #include <stdio.h> size_t fread(void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp); size_t fwri

Thinking in Java 第18章 Java I/O 系統(18.9-18.14)

//宣告:部分內容引自《Java程式設計思想(第四版)》機械工業出版社 【程序控制】 – 你經常會需要在 Java 內部執行其他作業系統的程式,並且要控制這些程式的輸入和輸出。Java 類庫提供了執行這些操作的類。 【新 I/O】 – 轉換資料。

Java網路程式設計與NIO詳解2:JAVA NIO 一步步構建I/O多路複用的請求模型

微信公眾號【黃小斜】作者是螞蟻金服 JAVA 工程師,專注於 JAVA 後端技術棧:SpringBoot、SSM全家桶、MySQL、分散式、中介軟體、微服務,同時也懂點投資理財,堅持學習和寫作,相信終身學習的力量!關注公眾號後回覆”架構師“即可領取 Java基礎、進階、專案和架構師等免費學習資料,更有資料