系統的硬體資源是 I/O 連接埠、中斷向量、直接記憶體存取 (DMA) 通道,以及其他必須指派給連線到系統之每個裝置的通訊路徑。 本節中的主題說明 Kernel-Mode 驅動程序架構 (KMDF) 驅動程式如何交涉裝置的硬體資源需求、檢閱建議的資源清單,然後接收指派的資源。 本節也會討論 KMDF 和 User-Mode Driver Framework (UMDF) 驅動程式如何存取和對應指派的資源。
在使用者插入 PnP 裝置之後,列舉該裝置的驅動程式通常會建立一或多個邏輯配置,這是裝置可以使用的硬體資源組合。 這些組態包括下列各項:
一個開機設定,列出裝置在系統啟動時所需的硬體資源。 (對於 PnP 裝置,BIOS 會提供此資訊。
裝置可以運作的其他組態。 驅動程式會將這些額外的組態分組在資源需求清單中。 PnP 管理員最終會從此清單中選取要指派給裝置的資源。
驅動程式建立邏輯組態之後,會將它們傳送至架構,而架構會將它們傳送至 PnP 管理員。
接下來,PnP 管理員會判斷裝置需要哪些驅動程式,並在尚未載入時載入它們。 PnP 管理員會將裝置的硬體需求清單傳送至裝置的驅動程式以供檢閱。 函式和篩選驅動程式可以修改此清單,並將它傳回 PnP 管理員。
PnP 管理員會檢查修改的硬體需求清單,並判斷系統上實際可用的指定資源。 如果裝置需要先前分配給另一部裝置的資源,PnP 管理員可能會嘗試在系統裝置之間重新分配資源。
接下來,PnP 管理員會建立一個資源清單,這是一份 PnP 管理員打算指派給裝置的資源清單。 PnP 管理員會將此清單傳送至裝置的驅動程式以供檢閱。 此時,函式和篩選驅動程式可以從清單中移除資源,但無法將資源新增至清單中。
最後,PnP 管理員會將資源指派給裝置。 架構會將資源清單傳遞至裝置的函式和篩選驅動程式,而裝置的函式驅動程式會執行任何必要的初始化,讓裝置和驅動程式可以存取資源。
下列步驟會更詳細地描述此程式:
使用者將裝置插入。
公車司機偵測到該裝置,並列舉它。
架構呼叫總線驅動程式的 EvtDeviceResourcesQuery 回呼函式,建立描述裝置開機組態的資源清單。
架構會呼叫總線驅動程式的EvtDeviceResourceRequirementsQuery回呼函式,該函式為裝置建立資源需求清單。
PnP 管理員會判斷裝置需要哪些驅動程式,並在尚未載入時載入它們,以建立裝置的驅動程式堆疊。
PnP 管理員會將裝置的資源需求清單傳送至驅動程式堆疊以供檢閱。 當清單在驅動程式堆疊中向下移動時,架構會呼叫每個函式和每個篩選驅動程式的 EvtDeviceFilterRemoveResourceRequirements 回呼函式。 當清單回溯堆疊時,框架會呼叫每個函式及篩選驅動程式的 #B0 #A1 EvtDeviceFilterAddResourceRequirements #A2 #C3 回呼函式。 這兩個回呼函數都可以修改資源需求清單。
PnP 管理員會建立裝置的資源清單,並將其傳送至驅動程式堆疊以供檢閱。 架構會呼叫每一個函式及篩選驅動程式的 EvtDeviceRemoveAddedResources 回呼函式,移除由驅動程式的 EvtDeviceFilterAddResourceRequirements 回呼函式所增加的資源,以便總線驅動程式不會嘗試使用這些資源。
架構會從 PnP 管理員接收最終的資源清單,並加以儲存。
如果驅動程式呼叫 #B0 #A1 WdfInterruptCreate #A2 #C3 來建立中斷對象,架構會在資源清單中尋找中斷資源,並將其指派給中斷物件。
裝置進入未初始化的 D0 狀態之後,架構會呼叫每個驅動程式的 EvtDevicePrepareHardware 回呼函式,傳遞原始和轉譯版本的裝置資源清單做為輸入參數。 驅動程式可以儲存資源清單,這些資源清單在架構呼叫驅動程式的 EvtDeviceReleaseHardware 回呼函式之前都是有效的。