IoCompleteRequest

IoCompleteRequest 例程表示調用者的已經完成了對指定I/O請求的所有處理操作,並且向I/O管理器返回指定的IRP報文。

編輯本段函數原型

  VOID
  IoCompleteRequest(
  IN PIRP Irp,
  IN CCHAR PriorityBoost
  );

編輯本段參數

  Irp 指向將要完成的IRP報文數據結構。 PriorityBoost 指定系統定義的常量,用來增加運行時要求操作的原始線程的優先權。如果要求操作的原始線程需要驅動程序快速的完成處理,或者IRP填充完成時有錯誤發生,那麼這個值就應該設爲 IO_NO_INCREMENT。否則PriorityBoost 常量的值應設爲device-type-specific常量。具體取哪些常量可以參見 ntddk.h wdm.h 文件。

編輯本段返回值

  無

編輯本段頭文件

  在 wdm.hntddk.h 中被定義。需要包含 wdm.hntddk.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);之後,用戶層的函數纔會返回。
擴展閱讀:
開放分類:
RootKitDDKWindows內核編程WDK
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章