天天看點

IRP與派遣函數

1.派遣函數是WINDOWS驅動程式中的重要概念。驅動程式的主要功能是負責處理I/O請求,其中大部分I/O請求時在派遣函數中處理的。

2.使用者模式下所有驅動程式的I/O請求,全部由作業系統化為一個叫做IRP的資料結構,不同的IRP資料會被“派遣”到不同的派遣函數(Dispatch Functin )中,這也是派遣函數名字的由來。

3.IRP的處理機制類似Windows應用程式的“消息處理”機制,驅動程式接收到不同的類型的IRP後,會進入不同的派遣函數,在派遣函數中IRP得到處理。

4.IRP是一個很複雜的資料結構,IRP兩個基本的屬性,一個是MajorFunction,另一個是MinorFunction,分别記錄IRP的主類型和子類型。作業系統根據MajorFunction将IRP“派遣”到不同的派遣函數中,在派遣函數中還可以這個IRP屬于哪種MinorFunction

5.DriverEntry有個函數指針數組MajorFunction.都是派遣函數位址。對于沒有設定IRP類型,系統預設這些IRP類型與_IopInvalidDeviceRequest函數關聯。還有些IRP是由系統的某個元件建立的。

6.下表列出了IRP的類型,并對其産生的來源做了說明。

IRP與派遣函數

7.應用程式和驅動程式有3中通信方式

1.DO_BUFFER_IO

2.DO_DIRECT_IO

3.其他

8.在使用第3種讀寫裝置時,派遣函數直接讀寫應用程式提供的緩沖區位址。ReadFile,WriteFile提供的緩沖區記憶體位址,可以在派遣函數中通過IRP的UserBuffer字段得到。

9.除了用ReadFile和WriteFile以外,應用程式還可以通過另外一個DeviceIoControl操作裝置。DeviceIoControl内部會使用作業系統建立IRP_MJ_DEVICE_CONTROL類型的IRP,然後作業系統會将這個IRP轉發到派遣函數中。它可以讓應用程式和驅動程式進行通信。

10.通信必備參數:輸入,輸出位址,MDL結構(直接)

11.IO_STACK_LOCATION  即I/O堆棧,這個資料結構和IRP緊密相連。當IRP可能在裝置棧中轉發多次,為了記錄IRP在每層裝置中做的操作,IRP會有個IO_STACK_LOCATION數組。每個IO_STACK_LOCATION元素記錄着對應裝置中做的操作。對于本層可以通過IoGetCurrentIrpStackLocation函數得到。

繼續閱讀