將驅動程式從 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_CONFIG 和 WDF_IO_QUEUE_CONFIG。
管理物件存留期
使用 UMDF 1 的驅動程式必須實作參考計數,才能判斷刪除物件是否安全。 因為架構代表驅動程式追蹤物件參考,所以 UMDF 2 驅動程式不需要計算參考。
在 UMDF 2 中,每個架構物件都有預設的父物件。 刪除父物件時,架構會刪除相關聯的子物件。 當您的驅動程式呼叫 WdfDeviceCreate之類的物件建立方法時,它可以接受預設父代,也可以在 WDF_OBJECT_ATTRIBUTES 結構中指定自訂父代。 如需架構物件及其預設父物件的清單,請參閱 Framework 物件的摘要。
驅動程式初始化
UMDF 1 驅動程式會實作 IDriverEntry 介面。 在其 IDriverEntry::OnDeviceAdd 回呼方法中,驅動程式通常會:
- 建立並初始化裝置回呼物件的實例。
- 呼叫 IWDFDriver::CreateDevice來建立新的架構裝置物件。
- 設定裝置的佇列及其對應的回呼物件。
- 呼叫 IWDFDevice::CreateDeviceInterface來建立裝置介面類別別的實例。
UMDF 2 驅動程式會實作 DriverEntry 和 EvtDriverDeviceAdd。 在其 DriverEntry 常式中,UMDF 2 驅動程式通常會呼叫 WDF_DRIVER_CONFIG_INIT ,以初始化驅動程式 的WDF_DRIVER_CONFIG 結構。 然後將此結構傳遞至 WdfDriverCreate。
在其 EvtDriverDeviceAdd 函式中,驅動程式可能會執行下列其中一些動作:
- 填入 WDFDEVICE_INIT 結構,以提供用來建立裝置物件的資訊。 如需使用WDFDEVICE_INIT的詳細資訊,請參閱 建立 Framework 裝置物件。
- 設定裝置物件的內容區域。 如需配置和存取架構物件內容空間的相關資訊,請參閱 Framework 物件內容空間。
- 建立裝置物件。
- 指定裝置物件的 要求處理常式 。
- 建立 I/O 佇列。
- 建立裝置介面。
- 如果裝置物件擁有電源原則,請設定 裝置閒置原則 和 喚醒設定。
- 如果硬體支援中斷,請建立中斷物件。
安裝驅動程式
當您在 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) 。 請參閱 使用架構的事件記錄器。