驅動程式的 DispatchPnP 常式會藉由處理 IRP_MJ_PNP I/O 函式程式代碼的 IRP 來支援隨插即用。 與 IRP_MJ_PNP 函式程式代碼相關聯的是數個次要 I/O 函式程式代碼 (請參閱 隨插即用次要 IRP) ,其中一些驅動程式都必須處理,而其中一些可以選擇性地處理。 PnP 管理員會使用這些次要函式碼來引導驅動程式啟動、停止和移除裝置,以及查詢驅動程式的裝置相關資訊。
裝置的所有驅動程式都必須有機會處理裝置的 PnP IRP,除非少數情況下允許函式或篩選驅動程式失敗 IRP。
每個驅動程式的 DispatchPnP 常式都必須遵循下列規則:
函式或篩選驅動程式必須將 PnP IRP 向下傳遞至裝置堆疊中的下一個驅動程式,除非函式或篩選驅動程式處理 IRP 並遇到失敗 (例如,因為資源不足) 。
裝置的所有驅動程式都必須有機會處理裝置的 PnP IRP,除非其中一個驅動程式遇到錯誤。 PnP 管理員會將 IRP 傳送至裝置堆疊中的頂端驅動程式。 函式和篩選驅動程式會將 IRP 向下傳遞至下一個驅動程式,而父匯流排驅動程式會完成 IRP。 如需詳細資訊,請參閱PnP IRP 向下傳遞裝置堆疊的資訊。
如果驅動程式嘗試處理 IRP 並遇到錯誤 (,例如資源不足) ,則 IRP 可能會失敗。 如果驅動程式收到 IRP,其中包含未處理的程式代碼,驅動程式不得讓 IRP 失敗。 它必須將這類 IRP 向下傳遞至下一個驅動程式,而不需要修改 IRP 的狀態。
驅動程式必須處理某些 PnP IRPs,並且可以選擇性地處理其他 PnP IRPs。
每個 PnP 驅動程式都需要處理特定 IRP,例如 IRP_MN_REMOVE_DEVICE,而且可以選擇性地處理其他 IRP。 如需有關各種驅動程式(函式驅動程式、篩選驅動程式和匯流排驅動程式)所需及選擇性 IRP 的資訊,請參閱 插即用次要 IRP。
驅動程式可以因為有適當錯誤狀態而使必要的 PnP IRP 失敗,但驅動程式絕對不可以對這類 IRP 傳回 STATUS_NOT_SUPPORTED。
如果驅動程式成功處理 PnP IRP,驅動程式會將 IRP 狀態設定為成功。 它不依賴堆疊中的另一個驅動程式來設定狀態。
驅動程式會將 Irp-IoStatus.Status> 設定為 STATUS_SUCCESS,以通知 PnP 管理員驅動程式已成功處理 IRP。 某些 IRP 上,非匯流排驅動程式可能可以依靠其父匯流排驅動程式將狀態設為成功。 然而,這是一種冒險的做法。 為了一致性和健全性,驅動程式必須針對其成功處理的每個 PnP IRP 將 IRP 狀態設定為成功。
如果驅動程式失敗 IRP,驅動程式會以錯誤狀態完成 IRP,而且不會將 IRP 向下傳遞至下一個驅動程式。
若要讓 IRP 失敗,例如 IRP_MN_QUERY_STOP_DEVICE,驅動程式會將 Irp-IoStatus.Status> 設定為 STATUS_UNSUCCESSFUL。 其他 IRP 的其他錯誤狀態值包括 STATUS_INSUFFICIENT_RESOURCES 和 STATUS_INVALID_DEVICE_STATE。
驅動程式不會為其處理的 IRP 設定STATUS_NOT_SUPPORTED。 這是PnP管理員設定的初始狀態。 如果 IRP 以此狀態完成,則表示堆疊中沒有驅動程式處理 IRP;所有驅動程式都只是將 IRP 傳遞給下一個驅動程式。
驅動程式必須在其分派常式中處理 PnP IRP (在 IRP 向下移動裝置堆疊),在 IoCompletion 常式中(在 IRP 向上移動裝置堆疊),或在兩者中,同時符合 IRP 參考頁面中所指定的條件。
某些 PnP IRP,例如 IRP_MN_REMOVE_DEVICE,必須先由裝置堆疊頂端的驅動程式處理,然後由每個下一個較低的驅動程式處理。 其他的,例如 IRP_MN_START_DEVICE,必須先由父匯流排驅動程式處理。 還有一些,例如 IRP_MN_QUERY_CAPABILITIES,可以在設備堆棧的下降和返回的過程中進行處理。 如需套用至每個 PnP IRP 的規則,請參閱 即插即用次要 IRP 。 如需父匯流排驅動程式必須先處理的 PnP IRP 相關資訊,請參考 延後 PnP IRP 處理至較低層驅動程式完成。
驅動程式必須在 IRP 向下移動裝置堆疊時將資訊新增至 IRP,並在 IRP 向上返回途中修改或移除資訊。
傳回資訊以回應 PnP 查詢 IRP 時,驅動程式必須遵循此慣例,才能啟用裝置分層驅動程式傳遞的有序資訊。
除非明確記錄,否則驅動程式不得相依於以任何特定順序傳送的 PnP IRP。
當驅動程式傳送 PnP IRP 時,它必須將 IRP 傳送至裝置堆疊中的頂端驅動程式。
大部分的 PnP IRP 是由 PnP 管理員傳送,但有些可以由驅動程式傳送 (例如 IRP_MN_QUERY_INTERFACE) 。 驅動程式必須將 PnP IRP 傳送給位於裝置堆疊頂端的驅動程式。 呼叫 IoGetAttachedDeviceReference 以取得位於裝置堆疊頂端的驅動程式之裝置物件指標。