共用方式為


暫停裝置時保留傳入 IRP

當裝置的資源重新平衡時,裝置的驅動程式必須暫停裝置。 在資源重新平衡期間,某些驅動程式會暫停裝置,以回應 IRP_MN_QUERY_STOP_DEVICE 要求,而其他驅動程式會延遲暫停裝置,直到收到 IRP_MN_STOP_DEVICE 要求為止。 不論是哪一種情況,當 IRP_MN_STOP_DEVICE 成功時,都必須暫停裝置。

驅動程式必須在裝置上完成任何進行中的 IRP,並避免啟動任何需要存取裝置的新 IRP。

若要在裝置暫停時保留 IRP,驅動程式會實作如下的程式:

  1. 在其 AddDevice 例程中,使用類似HOLD_NEW_REQUESTS的名稱,在裝置擴充功能中定義旗標。 清除旗標。

  2. 建立 FIFO 佇列以保存 IRP。

    如果驅動程式已經將 IRP 排入佇列,它可以重複使用相同的佇列,因為驅動程式必須在暫停裝置之前完成任何未處理的要求。

    如果驅動程式還沒有 IRP 佇列,則必須在其 AddDevice 例程中建立一個。 它建立的佇列類型取決於驅動程式排清佇列的方式。 驅動程式可能會使用連結的相互連結清單和 ExInterlockedXxx清單 例程。

  3. 在IRP_MN_QUERY_STOP_DEVICE (或IRP_MN_STOP_DEVICE) 的 DispatchPnP 程式代碼中,完成任何未完成的要求,並設定HOLD_NEW_REQUESTS旗標。

  4. 在存取裝置的分派例程中,例如 DispatchWriteDispatchRead,檢查是否已設定HOLD_NEW_REQUESTS旗標。 如果是,驅動程式必須將 IRP 標示為擱置中,並將它排入佇列。

    驅動程式的 DispatchPnP 例程必須繼續處理 PnP IRP ,而不是保留它們, DispatchPower 例程必須繼續處理電源 IRP。

  5. DispatchPnP 中,為了響應啟動或取消停止 IRP,請清除HOLD_NEW_REQUESTS旗標,並在 IRP 保留佇列中啟動 IRP。

    這些動作可能是處理這些 PnP IRP 的最後一個步驟。 例如,為了響應啟動 IRP,驅動程式必須先執行任何作業來啟動裝置,然後就可以在 IRP 保存佇列中啟動 IRP。

    處理 IRP 保留佇列中 IRP 時發生錯誤,不會影響針對啟動或取消停止 IRP 所傳回的狀態。