如果可以立即完成輸入 IRP,分派例程會執行下列動作:
以適當的值設定狀態和資訊成員於 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 設定為零。
使用 IRP 並將 PriorityBoost 設為 IO_NO_INCREMENT,呼叫 IoCompleteRequest。
傳回已在 I/O 狀態區塊中設定的適當STATUS_XXX 。 請注意,呼叫 IoCompleteRequest 會使呼叫端無法存取指定的 IRP,因此無法從已完成 IRP 的 I/O 狀態區塊設定分派例程的傳回值。
請遵循此實作指導方針,以使用 IRP 呼叫 IoCompleteRequest:
在呼叫 IoCompleteRequest之前,請一律釋放驅動程式所持有的任何旋轉鎖。
完成 IRP 需要不確定的時間,特別是在分層驅動程式鏈結中。 此外,如果較高層級的驅動程式的 IoCompletion 例程將 IRP 向下傳送至持有旋轉鎖的較低驅動程式,就會發生死結。