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的類型,并對其産生的來源做了說明。

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函數得到。