共用方式為


DispatchPnP 常式

驅動程式的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 的狀態。

  • 驅動程式必須處理特定的 PnP IRP,而且可以選擇性地處理其他 IP。

    每個 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,非匯流排驅動程式可能依賴其父匯流排驅動程式將狀態設定為成功。 不過,這是有風險的做法。 為了保持一致性和健全性,驅動程式必須將 IRP 狀態設定為成功處理的每個 PnP 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 傳遞至下一個驅動程式。

  • 驅動程式必須在 IRP 的分派常式中處理 PnP IRP, (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 以取得裝置堆疊頂端驅動程式裝置物件的指標。