共用方式為


由使用者模式服務進行與 GenericUSBFn.sys 的溝通

所有使用者模式要求都會傳送至Microsoft提供的核心模式驅動程式,GenericUSBFn.sys。 您可以透過傳送這些 I/O 控制代碼 (IOCTL) 來創建與 GenericUSBFn.sys 通信的使用者模式服務,而 GenericUSBFn.sys 則負責與 USB 功能驅動程式的核心模式通信。

Genericusbfnioctl.h 中宣告的 IOCTLs 是用於從使用者模式服務向 GenericUSBFn.sys 通訊的。

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

  1. 啟動時,服務會監聽裝置介面的出現。 裝置介面 GUID 是在登錄中宣告的 InterfaceGUID 值,位於 OEM 定義的 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\USBFN\Interfaces子機碼下。 偵測裝置抵達有兩種常見方法:
    • 觸發啟動服務。 如需詳細資訊,請參閱服務觸發事件。
    • 註冊裝置介面抵達。 如需詳細資訊,請參閱 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發出傳輸要求。