編輯本段函數原型
VOID IoCompleteRequest( IN PIRP Irp, IN CCHAR PriorityBoost );編輯本段參數
Irp 指向將要完成的IRP報文數據結構。 PriorityBoost 指定系統定義的常量,用來增加運行時要求操作的原始線程的優先權。如果要求操作的原始線程需要驅動程序快速的完成處理,或者IRP填充完成時有錯誤發生,那麼這個值就應該設爲 IO_NO_INCREMENT。否則PriorityBoost 常量的值應設爲device-type-specific常量。具體取哪些常量可以參見 ntddk.h 或 wdm.h 文件。編輯本段返回值
無編輯本段頭文件
在 wdm.h 和 ntddk.h 中被定義。需要包含 wdm.h 或 ntddk.h 文件。 註釋當驅動完成了對指定IRP的所有處理操作之後,會調用 IoCompleteRequest 。I/O管理器檢查IRP以決定上級驅動是否已經爲這個IRP指定了一個 IoCompletion 例程。如果這樣的話,每一個 IoCompletion 例程將會依次被調用,直到在驅動鏈中的每一個分層驅動已經完成這個IRP的填充操作爲止。 當所有的驅動已充填充完了指定的IRP時,I/O管理器會向操作的原始請求者返回一個狀態值。需要注意的是,一個設置了 driver-created 的IRP的上級驅動必須提供一個 IoCompletion 例程來釋放它當初創建的那個IRP。 在一個自旋鎖被佔用時,不要調用IoCompleteRequest 。當一個自旋鎖被佔用時,試圖完成一個IRP的填充操作會導致死鎖。 IoCompleteRequest 的調用者必須是運行在 IRQL <= DISPATCH_LEVEL 上的。編輯本段PS
這個函數一般出現在I/O Dispatch系列函數中。當用戶層與內核層設備進行通訊時,比如用戶層調用了CreateFile、CloseHandle、ReadFile、WriteFile和DeviceIoControl等I/O操作函數時,內核會調用代碼中已經指派的DRIVER_DISPATCH系列函數。如果用戶層的這些函數是採用同步方式(Synchronous)調用的話,那麼只有當內核DRIVER_DISPATCH函數中調用了IoCompleteRequest(Irp, IO_NO_INCREMENT);之後,用戶層的函數纔會返回。- 擴展閱讀:
-
- 1
具體可參見 Microsoft 的 DDK 幫助文檔。
- 2
http://hi.baidu.com/ligh0721/blog/category/%C4%DA%BA%CB%B1%E0%B3%CC%B1%CA%BC%C7
- 1
- 開放分類:
- RootKit,DDK,Windows內核編程,WDK