共用方式為


如何在分派程序中完成 IRP

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

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

    • 分派常式會將 Status 設定為 STATUS_SUCCESS 或適當的錯誤(STATUS_XXX),這可能是呼叫支援常式所傳回的值,或針對某些同步請求,由下層驅動程式傳回的值。

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

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

    • 它會將 Information 設定為一個值,該值會根據其成功完成的其他 IRP 特定請求而有所不同,並以 STATUS_SUCCESS 紀錄。

    • 它會將 Information 設定為值,該值會根據其完成的 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之前,請一律釋放驅動程式所持有的任何旋轉鎖。

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