共用方式為


將驅動程式從 UMDF 1 移植到 UMDF 2

本主題描述如何將 User-Mode Driver Framework (UMDF) 1 驅動程式移植到 UMDF 2。 您可以從使用 Sources/Dirs 檔案的 UMDF 1 驅動程式開始, (不是 Visual Studio 專案) ,也可以轉換包含在 Visual Studio 專案中的 UMDF 1 驅動程式。 結果將會是 Visual Studio 中的 UMDF 2 驅動程式專案。 UMDF 2 驅動程式 Windows 10同時在傳統型版本 (家用版、專業版、企業版和教育版) 和Windows 10 行動裝置版上執行。

Echo 驅動程式範例是已從 UMDF 1 移植到 UMDF 2 的驅動程式範例。

開始使用

若要開始,請在 Visual Studio 中開啟新的驅動程式專案。 選取Visual C++- > Windows Driver-WDF-User >> Mode Driver (UMDF 2) 範本。 Visual Studio 會開啟部分填入的範本,其中包含驅動程式必須實作之回呼函式的存根。 這個新的驅動程式專案將是 UMDF 2 驅動程式的基礎。 使用 UMDF 2 Echo 範例作為您應該介紹的程式碼類型指南。

接下來,請檢閱您現有的 UMDF 1 驅動程式程式碼,並判斷物件對應。 UMDF 1 中的每個 COM 物件在 UMDF 2 中都有對應的 WDF 物件。 例如, IWDFDevice 介面會對應至 WDF 裝置物件,由 WDFDEVICE 控制碼表示。 UMDF 1 中幾乎所有架構提供的介面方法在 UMDF 2 中都有對應的方法。 例如, IWDFDevice::GetDefaultIoQueue 會對應至 WdfDeviceGetDefaultQueue

同樣地,驅動程式提供的回呼函式在兩個版本中具有對等專案。 在 UMDF 1 中,驅動程式提供的介面命名慣例 (除了 IDriverEntry) 為 I物件回呼Xxx之外,在 UMDF 2 中,驅動程式提供的常式的命名慣例是 EvtObjectXxx。 例如, IDriverEntry::OnDeviceAdd 回呼方法會對應至 EvtDriverDeviceAdd

您的驅動程式會在 UMDF 1 和 2 中實作回呼函式,但驅動程式提供其回呼指標的方式不同。 在 UMDF 1 中,驅動程式會將回呼方法實作為驅動程式提供的介面成員。 驅動程式會在建立架構物件時向架構註冊這些介面,例如呼叫 IWDFDriver::CreateDevice

在 UMDF 2 中,驅動程式會在組態結構中提供驅動程式提供的回呼函式指標,例如 WDF_DRIVER_CONFIGWDF_IO_QUEUE_CONFIG

管理物件存留期

使用 UMDF 1 的驅動程式必須實作參考計數,才能判斷刪除物件是否安全。 因為架構代表驅動程式追蹤物件參考,所以 UMDF 2 驅動程式不需要計算參考。

在 UMDF 2 中,每個架構物件都有預設的父物件。 刪除父物件時,架構會刪除相關聯的子物件。 當您的驅動程式呼叫 WdfDeviceCreate之類的物件建立方法時,它可以接受預設父代,也可以在 WDF_OBJECT_ATTRIBUTES 結構中指定自訂父代。 如需架構物件及其預設父物件的清單,請參閱 Framework 物件的摘要

驅動程式初始化

UMDF 1 驅動程式會實作 IDriverEntry 介面。 在其 IDriverEntry::OnDeviceAdd 回呼方法中,驅動程式通常會:

UMDF 2 驅動程式會實作 DriverEntryEvtDriverDeviceAdd。 在其 DriverEntry 常式中,UMDF 2 驅動程式通常會呼叫 WDF_DRIVER_CONFIG_INIT ,以初始化驅動程式 的WDF_DRIVER_CONFIG 結構。 然後將此結構傳遞至 WdfDriverCreate

在其 EvtDriverDeviceAdd 函式中,驅動程式可能會執行下列其中一些動作:

安裝驅動程式

當您在 Visual Studio 中建立新的驅動程式專案時,新專案會包含 .inx 檔案。 當您建置驅動程式時,Visual Studio 會將 .inx 檔案編譯成 INF 檔案,做為驅動程式套件的一部分。

雖然 UMDF 1 驅動程式的 INF 檔案必須包含驅動程式類別識別碼,但 UMDF 2 驅動程式的 INF 檔案中不需要 DriverCLSID。

此外,雖然 UMDF 1 驅動程式必須在其 INF 檔案中參考共同安裝程式,但 UMDF 2 INF 檔案中不需要 constaller 參考。 雖然 UMDF 2 驅動程式的 INF 檔案中可以顯示一個子參考,但並非必要。

儲存裝置內容

在 UMDF 1 中,驅動程式通常會將裝置內容儲存在驅動程式建立的回呼物件中,例如藉由指定裝置回呼物件類別的私人成員。 或者,UMDF 1 驅動程式可以呼叫 IWDFObject::AssignCoNtext 方法,在架構物件上註冊內容。

在 UMDF 2 中,架構會根據驅動程式在呼叫物件建立方法時所提供的選擇性 WDF_OBJECT_ATTRIBUTES 結構來配置內容空間。 呼叫物件的 create 方法之後,驅動程式可以呼叫 WdfObjectAllocateCoNtext 一或多次,將額外的內容空間配置給特定物件。 如需 UMDF 2 驅動程式應該用來定義內容結構和存取子方法的步驟,請參閱 Framework 物件內容空間

對驅動程式進行偵錯

若要對 UMDF 2 驅動程式進行偵錯,您將在 Wdfkd.dll 中使用擴充功能,而不是Wudfext.dll。 如需 Wudfext.dll 中擴充功能的詳細資訊,請參閱 Wdfkd.dll中的偵錯工具擴充功能摘要

在 UMDF 2 中,您也可以透過 Inflight Trace Recorder (IFR) 取得額外的驅動程式偵錯資訊,如 在 KMDF 和 UMDF 2 驅動程式中使用 Inflight Trace Recorder中所述。 此外,您也可以使用架構自己的正式發行前小 眾測試版錄製器 (IFR) 。 請參閱 使用架構的事件記錄器

使用 UMDF 消費者入門

Framework 物件內容空間

UMDF 版本歷程記錄

Framework 物件