共用方式為


從使用者模式服務與 GenericUSBFn.sys 通訊

所有使用者模式要求都會傳送至 Microsoft 提供的核心模式驅動程式 GenericUSBFn.sys。 您可以建立與 GenericUSBFn.sys 通訊的使用者模式服務,方法是將這些 I/O 控制程式代碼傳送 (至 IOCTL) ,而 GenericUSBFn.sys 處理與 USB 函式驅動程式的核心模式通訊。

Genericusbfnioctl.h 中宣告的 IOCTLs 可用來與使用者模式服務 GenericUSBFn.sys 通訊。

下列步驟說明如何定義與 GenericUSBFn.sys 互動的 USB 介面服務,以與 USB 函式驅動程式通訊:

  1. 啟動時,服務會接聽介面的裝置介面抵達。 裝置介面 GUID 是在登錄中宣告 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\USBFN\Interfaces OEM 定義子機碼下的 InterfaceGUID 值。 接聽裝置抵達的常見方法有兩種:
    • 觸發程式會啟動服務。 如需詳細資訊,請參閱服務觸發程式事件。
    • 註冊裝置介面抵達。 如需詳細資訊,請參閱 CM_Register_Notification 函式。
  2. 介面送達之後,服務會開啟裝置的句柄:
    • 呼叫 CM_Get_Device_Interface_List 函式,以取得裝置的符號名稱。 指定在登錄的 InterfaceGUID 值中宣告的裝置介面 GUID。
    • 擁有裝置的符號名稱之後,請使用 CreateFile 開啟裝置的句柄。
  3. 服務問題IOCTL_GENERICUSBFN_GET_CLASS_INFO擷取可用管道的相關信息,如登錄中所設定。
  4. 服務準備好進行通訊之後,就會IOCTL_GENERICUSBFN_ACTIVATE_USB_BUS問題。 啟用所有類別驅動程序之後,USB 函式類別延伸模組就可以連線到主機。
  5. 若要接收 USB 通知,服務會發出IOCTL_GENERICUSBFN_BUS_EVENT_NOTIFICATION。 此 IOCTL 會在發生新的 USB 事件時完成。 特別感興趣的事件 (USBFN_EVENT) 包括:
  6. UsbfnEventReset:這是用來判斷連線 USB 裝置的速度。
  7. UsbfnEventConfigured:服務現在可以發出傳輸要求。
  8. UsbfnEventSetupPacket:USB 函式類別延伸模組已收到介面特定的安裝封包 (bmRequestType.Type == BMREQUEST_CLASS) 。 服務應該透過在管道 0 中發出傳輸要求來回復設定封包,後面接著管道 0 上的交握要求 (IOCTL_GENERICUSBFN_CONTROL_STATUS_HANDSHAKE_OUT) 相反方向。
  9. 收到 UsbfnEventConfigured 事件之後,服務就可以使用IOCTL_GENERICUSBFN_TRANSFER_IN、IOCTL_GENERICUSBFN_TRANSFER_IN_APPEND_ZERO_PKT和IOCTL_GENERICUSBFN_TRANSFER_OUT開始發出傳輸要求。