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 以取得裝置堆疊頂端驅動程式裝置物件的指標。