如何在分派常式中完成 IRP

如果可以立即完成輸入 IRP,分派常式會執行下列動作:

  1. 以適當的值設定 IRP I/O 狀態欄塊的狀態和資訊成員,一般:

    • 分派常式會將 Status 設定為STATUS_SUCCESS或適當的錯誤 (STATUS_XXX) ,這可以是呼叫支援常式所傳回的值,或針對較低驅動程式的特定同步要求所傳回的值。

      如果較低層級的驅動程式傳回STATUS_PENDING,則較高層級的驅動程式不應該呼叫 IRP 的 IoCompleteRequest ,但有一個例外:較高層級驅動程式可以使用事件在其 IoCompletion 常式與其分派常式之間同步處理,在此情況下 ,IoCompletion 常式會發出事件訊號並傳回STATUS_MORE_PROCESSING_REQUIRED。 分派常式會等候事件,然後呼叫 IoCompleteRequest 來完成 IRP。

    • 如果要求傳輸資料,例如讀取或寫入要求已滿足,則會將 資訊 設定為成功傳輸的位元組數目。

    • 它會將 [資訊 ] 設定為值,根據它完成的其他 IRP 的特定要求而有所不同,STATUS_SUCCESS。

    • 它會將 [資訊 ] 設定為值,該值會根據其完成的 IRP 特定要求而有所不同,並出現警告STATUS_XXX。 例如,它會將 Information 設定為針對這類警告傳輸的位元組數目,例如STATUS_BUFFER_OVERFLOW。

    • 通常,它會針對完成且錯誤STATUS_XXX的要求,將Information設定為零。

  2. 使用 IRP 和PriorityBoost = IO_NO_INCREMENT 呼叫IoCompleteRequest

  3. 傳回已在 I/O 狀態欄塊中設定的適當STATUS_XXX 。 請注意,呼叫 IoCompleteRequest 可讓呼叫端無法存取指定的 IRP,因此無法從已完成 IRP 的 I/O 狀態欄塊設定來自分派常式的傳回值。

遵循此實作指導方針,以使用 IRP 呼叫 IoCompleteRequest:

在呼叫 IoCompleteRequest之前,請一律釋放任何微調鎖定 (s) 驅動程式。

完成 IRP 需要不確定的時間,特別是在層次驅動程式鏈結中。 此外,如果較高層級驅動程式的 IoCompletion 常式將 IRP 向下傳送回持有微調鎖定的較低驅動程式,就會發生死結。