硬體資源簡介

系統的硬體資源是 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 管理員會將此清單傳送至裝置的驅動程式以供檢閱。 此時,函式和篩選驅動程式可以從清單中移除資源,但無法將資源新增至清單中。

最後,PnP 管理員會將資源指派給裝置。 架構會將資源清單傳遞至裝置的函式和篩選驅動程式,而裝置的函式驅動程式會執行必要的任何初始化,讓裝置和驅動程式可以存取資源。

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

  1. 使用者插入裝置

  2. 匯流排驅動程式會偵測裝置並 加以列舉

  3. 架構會呼叫匯流排驅動程式的 EvtDeviceResourcesQuery 回呼函式,此函式 會建立 描述裝置開機設定的資源清單。

  4. 架構會呼叫匯流排驅動程式的 EvtDeviceResourceRequirementsQuery 回呼函式,這會 建立裝置的資源需求清單

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

  6. PnP 管理員會將裝置的資源需求清單傳送至驅動程式堆疊以供檢閱。 當清單向下移動驅動程式堆疊時,架構會呼叫每個函式,並篩選驅動程式的 EvtDeviceFilterRemoveResourceRequirements 回呼函式。 當清單移動備份堆疊時,架構會呼叫每個函式,並篩選驅動程式的 EvtDeviceFilterAddResourceRequirements 回呼函式。 這兩個回呼函式都可以 修改資源需求清單

  7. PnP 管理員會為裝置建立資源清單,並將它傳送至驅動程式堆疊以供檢閱。 架構會呼叫每個函式,並篩選驅動程式的EvtDeviceRemoveAddedResources回呼函式,這會移除驅動程式EvtDeviceFilterAddResourceRequirements回呼函式新增的資源,讓匯流排驅動程式不會嘗試使用這些函式。

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

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

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