共用方式為


硬體資源簡介

系統的硬體資源是 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 管理員會將資源指派給裝置。 架構會將資源清單傳遞至裝置的函式和篩選驅動程式,而裝置的函式驅動程式會執行任何必要的初始化,讓裝置和驅動程式可以存取資源。

下列步驟會更詳細地描述此程式:

  1. 使用者將裝置插入。

  2. 公車司機偵測到該裝置,並列舉它。

  3. 架構呼叫總線驅動程式的 EvtDeviceResourcesQuery 回呼函式,建立描述裝置開機組態的資源清單。

  4. 架構會呼叫總線驅動程式的EvtDeviceResourceRequirementsQuery回呼函式,該函式為裝置建立資源需求清單

  5. PnP 管理員會判斷裝置需要哪些驅動程式,並在尚未載入時載入它們,以建立裝置的驅動程式堆疊。

  6. PnP 管理員會將裝置的資源需求清單傳送至驅動程式堆疊以供檢閱。 當清單在驅動程式堆疊中向下移動時,架構會呼叫每個函式和每個篩選驅動程式的 EvtDeviceFilterRemoveResourceRequirements 回呼函式。 當清單回溯堆疊時,框架會呼叫每個函式及篩選驅動程式的 #B0 #A1 EvtDeviceFilterAddResourceRequirements #A2 #C3 回呼函式。 這兩個回呼函數都可以修改資源需求清單。

  7. PnP 管理員會建立裝置的資源清單,並將其傳送至驅動程式堆疊以供檢閱。 架構會呼叫每一個函式及篩選驅動程式的 EvtDeviceRemoveAddedResources 回呼函式,移除由驅動程式的 EvtDeviceFilterAddResourceRequirements 回呼函式所增加的資源,以便總線驅動程式不會嘗試使用這些資源。

  8. 架構會從 PnP 管理員接收最終的資源清單,並加以儲存。

  9. 如果驅動程式呼叫 #B0 #A1 WdfInterruptCreate #A2 #C3 來建立中斷對象,架構會在資源清單中尋找中斷資源,並將其指派給中斷物件。

  10. 裝置進入未初始化的 D0 狀態之後,架構會呼叫每個驅動程式的 EvtDevicePrepareHardware 回呼函式,傳遞原始和轉譯版本的裝置資源清單做為輸入參數。 驅動程式可以儲存資源清單,這些資源清單在架構呼叫驅動程式的 EvtDeviceReleaseHardware 回呼函式之前都是有效的。