FastIo介面介紹)

來源:互聯網
上載者:User

由於你的驅動將要綁定到檔案系統驅動的上邊,檔案系統除了處理正常的IRP 之外,還要處理所謂的FastIo.FastIoCache Manager 調用所引發的一種沒有irp 的請求。換句話說,除了正常的Dispatch Functions 之外,你還得為DriverObject 撰寫另一組Fast Io Functions.這組函數的指標在driver->FastIoDispatch.

首先需要瞭解的是:FastIo 是獨立於普通的處理IRP 的分發函數之外的另一組介面。但是他們的作用是一樣的,就是由驅動處理外部給予的請求。而且所處理的請求也基本相同。其次,檔案系統的普通分發常式和fastio 常式都隨時有可能被調用。做好的過濾驅動顯然應該同時過濾這兩套介面。然而,一般都只介紹IRP 過濾的方法。Fastio 介面非常複雜。但是與IRP 過濾是基本一一對應的。只要瞭解了前者,後者很容易學會。

在開發的初期學習階段,你可以簡單的設定所有的fastio 常式返回FALSE 並不做任何事。這樣這些請求都會通過IRP重新發送被你的普通分發函數捕獲。有一定的效率損失,但是並不是很大。

NT FASTIO 是一套IO MANAGER DEVICE DRIVER 溝通的另外一套API. 在進行基於IRP 為基礎的介面調用前, IO MANAGER 會嘗試使用FAST IO 介面來加速各種IO 操作. FASTIO 本身的文檔並不多見, 本篇就是要介紹一下FASTIO 介面.

FastIoCheckIfPossible, 此調用並不是IO MANAGER 直接調用. 而是被FsRtlXXX 系列函數調用. 用於確認讀寫操作是否可以用FASTIO 介面進行.

FastIoRead/FastIoWrite, 很明顯, 是讀寫處理的調用.

FastIoQueryBasicInfo/FastIoQueryStandardInfo, 用於擷取各種檔案資訊. 例如建立,修改日期等.

FastIoLock/FastIoUnlockSingle/FastIoUnlockAll/FastIoUnlockAllByKey,用於對檔案的鎖定操作.

NT 中有2 種鎖定需要存在。1.排他性鎖. 2.共用鎖定. 排他性鎖在寫操作前擷取,不準其他進程獲得寫操作許可權, 而共用鎖定則代表需要讀檔案某區間. 禁止有寫動作出現. 在同一地址上, 如果有多個共用鎖定請求, 那是被允許的.

FastIoDeviceControl 用於提供NtDeviceIoControlFile 的支援.

AcquireFileForNtCreateSection/ReleaseFileForNtCreateSection NTFS 在對應檔內容到記憶體頁面前進行的操作.

FastIoDetachDevice, REMOVABLE 介質被拿走後, FILE SYSTEM DEVICE 對象會在任意的時刻被銷毀. 只有正確處理這個調用才能把上層DEVICE 和將要銷毀的DEVICE 脫鉤. 如果不解決這個函數, 系統會當.

FastIoQueryNetworkOpenInfo, CIFS 也就是網路位置,更準確的說是網路重新導向驅動嘗試擷取檔案資訊,會使用這個調用. 該調用是因為各種曆史原因而產生. 當時設計CIFS 時為避免多次在網上傳輸檔案資訊請求, NT4 時傳輸協議增加了一個FileNetworkOpenInformation 的網路檔案請求. FSD 則增加了這個介面. 用於在一次操作中獲得所有的檔案資訊. 客戶段發送FileNetworkOpenInformation, 伺服器端的FSD 用本介面完成資訊填寫.

FastIoAcquireForModWrite, Modified Page Writer 會調用這個介面來擷取檔案鎖. 如果實現這個介面. 則能使得檔案鎖定範圍減小到調用指定的範圍. 不實現此介面, 整個檔案被鎖.

FastIoPrepareMdlWrite, FSD 提供MDL. 以後向此MDL 寫入資料就代表向檔案寫入資料. 調用參數中有FILE_BOJECT 描述要寫的目標檔案.

FastIoMdlWriteComplete, 寫操作完成. FSD 回收MDL.

FastIoReadCompressed, 當此調用被調用時, 讀到的資料是壓縮後的.應該相容於標準的NT 提供的壓縮庫. 因為調用者負責解壓縮.

FastIoWriteCompressed,當此調用被調用時, 可以將資料是壓縮後儲存.

FastIoMdlReadCompressed/FastIoMdlReadCompleteCompressed, MDL 版本的壓縮讀. 當後一個介面被調用時,MDL 必須被釋放.

FastIoMdlWriteCompressed/FastIoMdlWriteCompleteCompressed, MDL 版本的壓縮寫.當後一個介面被調用時,MDL 必須被釋放.

FastIoQueryOpen, 這不是開啟檔案的操作. 但是卻提供了一個IRP_MJ_CREATE IRP. 我在以前版本的

SECUSTAR 的軟體中錯誤地實現了功能. 這個操作是開啟檔案/擷取檔案基本資料/關閉檔案的一個操作.

FastIoReleaseForModWrite,釋放FastIoAcquireForModWrite 調用所佔有的LOCK.

FastIoAcquireForCcFlush/FastIoReleaseForCcFlush FsRtl 會調用此介面,LAZY WRITE 線程將要把修改後的檔案資料寫入前調用.擷取檔案鎖.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.