在 UMDF 驅動程式中使用裝置介面

警告

UMDF 2 是最新版的 UMDF,並取代 UMDF 1。 所有新的 UMDF 驅動程式都應該使用 UMDF 2 撰寫。 未將新功能新增至 UMDF 1,且較新版本的WINDOWS 10上,UMDF 1 的支援有限。 通用 Windows 驅動程式必須使用 UMDF 2。

封存的 UMDF 1 範例可在Windows 11 22H2 - 2022 年 5 月驅動程式範例更新中找到。

如需詳細資訊,請參閱使用 UMDF 消費者入門

裝置介面是應用程式可用來存取裝置隨插即用 (PnP) 裝置的符號連結。 使用者模式應用程式可以將介面的符號連結名稱傳遞至 API 元素,例如 Microsoft Win32 CreateFile 函 式。 若要取得裝置介面的符號連結名稱,使用者模式應用程式可以呼叫 SetupDi 函式。 如需 SetupDi 函式的詳細資訊,請參閱 SetupDi Device Interface Functions。

每個裝置介面都屬於 裝置介面類別別。 例如,CD-ROM 裝置的驅動程式堆疊可能會提供屬於 GUID_DEVINTERFACE_CDROM 類別的介面。 CD-ROM 裝置的其中一個驅動程式會註冊 GUID_DEVINTERFACE_CDROM 類別的實例,以通知系統和應用程式 CD-ROM 裝置可供使用。 如需裝置介面類別別的詳細資訊,請參閱 裝置介面簡介

註冊裝置介面

若要註冊裝置介面類別別的實例,UMDF 型驅動程式可以從其IDriverEntry::OnDeviceAdd回呼函式內呼叫IWDFDeviceInterface。 如果驅動程式支援介面的多個實例,它可以為每個實例指派唯一的參考字串。

啟用和停用裝置介面

如果建立成功,架構會根據裝置的 PnP 狀態自動啟用和停用介面。

此外,驅動程式可以視需要停用並重新啟用裝置介面。 例如,如果驅動程式判斷其裝置已停止回應,驅動程式可以呼叫 IWDFDevice::AssignDeviceInterfaceState 來停用裝置的介面,並禁止應用程式取得介面的新控制碼。 (介面的現有控制碼不會受到影響。) 如果裝置稍後可以使用,驅動程式可以再次呼叫 IWDFDevice::AssignDeviceInterfaceState 來重新啟用介面。

接收存取裝置介面的要求

當應用程式要求存取驅動程式的裝置介面時,架構會呼叫驅動程式的 IQueueCallbackCreate::OnCreateFile 回 呼函式。 驅動程式可以呼叫 IWDFFile::RetrieveFileName ,以取得應用程式正在存取的裝置或檔案名稱。 如果驅動程式在註冊裝置介面時指定參考字串,作業系統會在 IWDFFile::RetrieveFileName 傳回的檔案或裝置名稱中包含參考字串。

建立裝置事件

UMDF 型驅動程式可以藉由呼叫IWDFDevice::P ostEvent來建立裝置特定的自訂事件 (稱為裝置事件) 。 已註冊使用任何裝置介面的驅動程式可以接收裝置自訂事件的通知。 UMDF 型驅動程式會藉由提供 IRemoteInterfaceCallbackEvent::OnRemoteInterfaceEvent 回呼函式來接收這類通知。

自訂事件對裝置而言是唯一的。 建立事件的驅動程式開發人員,以及接收事件的驅動程式開發人員都必須瞭解事件的意義。

存取另一個驅動程式的裝置介面

如果您想要以 UMDF 為基礎的驅動程式將 I/O 要求傳送至另一個驅動程式提供的裝置介面,您可以建立代表裝置介面的 遠端 I/O 目標

首先,您的驅動程式必須註冊,才能在裝置介面可用時接收通知。 使用下列步驟:

  1. 當您的驅動程式呼叫 IWDFDriver::CreateDevice時,驅動程式可以提供 IPnpCallbackRemoteInterfaceNotification 介面。 此介面的 IPnpCallbackRemoteInterfaceNotification::OnRemoteInterfaceArrival 回呼函式會在裝置介面可用時通知您的驅動程式。

  2. 在驅動程式呼叫 IWDFDriver::CreateDevice之後,它可以針對驅動程式將使用的每個裝置介面呼叫 IWDFDevice2::RegisterRemoteInterfaceNotification

之後,架構會在每次指定的裝置介面可用時呼叫驅動程式的 IPnpCallbackRemoteInterfaceNotification::OnRemoteInterfaceArrival 回呼函式。 回呼函式可以呼叫 IWDFRemoteInterfaceInitialize::GetInterfaceGuidIWDFRemoteInterfaceInitialize::RetrieveSymbolicLink 來判斷哪些裝置介面已抵達。

驅動程式的 IPnpCallbackRemoteInterfaceNotification::OnRemoteInterfaceArrival 回呼函式通常應該執行下列動作:

  1. 呼叫 IWDFDevice2::CreateRemoteInterface 以建立遠端介面物件,選擇性地提供 IRemoteInterfaceCallbackEventIRemoteInterfaceCallbackRemoval 介面。

  2. 呼叫 IWDFDevice2::CreateRemoteTarget 來建立遠端目標物件,選擇性地提供 IRemoteTargetCallbackRemoval 介面。

  3. 呼叫 IWDFRemoteTarget::OpenRemoteInterface 將裝置介面連線到遠端目標。

    如果裝置介面是 SWENUM 軟體裝置列舉值所建立的介面,您的驅動程式必須從工作專案呼叫 OpenRemoteInterface 。 (例如,請參閱 Windows SDK.) 中的 QueueUserWorkItem 函式

現在驅動程式可以將 I/O 要求格式化並傳送至遠端 I/O 目標。

除了 IPnpCallbackRemoteInterfaceNotification::OnRemoteInterfaceArrival 回呼函式之外,UMDF 驅動程式還可以提供兩個額外的回呼函式來接收裝置介面事件的通知: