Udostępnij przez


Komunikacja z GenericUSBFn.sys z usługi trybu użytkownika

Wszystkie żądania trybu użytkownika są wysyłane do sterownika trybu jądra dostarczonego przez firmę Microsoft GenericUSBFn.sys. Możesz utworzyć usługę trybu użytkownika, która komunikuje się z GenericUSBFn.sys, wysyłając kody sterowania we/wy (IOCTL), a GenericUSBFn.sys obsługuje komunikację w trybie jądra ze sterownikami funkcji USB.

Zadeklarowane w pliku Genericusbfnioctl.h IOCTL-e są używane do komunikacji z GenericUSBFn.sys przez usługę działającą w trybie użytkownika.

W poniższych krokach opisano sposób definiowania usługi interfejsu USB, która współdziała z GenericUSBFn.sys w celu komunikowania się ze sterownikami funkcji USB:

  1. Podczas uruchamiania usługa nasłuchuje na przybycie interfejsu urządzenia. Identyfikator GUID interfejsu urządzenia to wartość InterfaceGUID zadeklarowana w rejestrze, w podkluczu HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\USBFN\Interfaceszdefiniowanym przez producenta OEM. Istnieją dwie typowe metody nasłuchiwania przybycia urządzenia:
    • Wyzwól uruchomienie usługi. Aby uzyskać więcej informacji, zobacz Zdarzenia wyzwalania usług.
    • Zarejestruj się na powiadomienie o pojawieniu się interfejsu urządzenia. Aby uzyskać więcej informacji, zobacz funkcję CM_Register_Notification.
  2. Po nadejściu interfejsu usługa otworzy dojście do urządzenia:
    • Aby pobrać symboliczną nazwę urządzenia, wywołaj funkcję CM_Get_Device_Interface_List. Określ identyfikator GUID interfejsu urządzenia zadeklarowany w wartości InterfaceGUID w rejestrze.
    • Po utworzeniu symbolicznej nazwy urządzenia otwórz dojście do urządzenia przy użyciu polecenia CreateFile.
  3. Usługa wystawia IOCTL_GENERICUSBFN_GET_CLASS_INFO, aby pobrać informacje o dostępnych potokach zgodnie z konfiguracją w rejestrze.
  4. Gdy usługa będzie gotowa do komunikowania się, wydaje IOCTL_GENERICUSBFN_ACTIVATE_USB_BUS. Po aktywowaniu wszystkich sterowników klas, rozszerzenie funkcji klasy USB może nawiązać połączenie z hostem.
  5. Aby otrzymywać powiadomienia USB, usługa wydaje IOCTL_GENERICUSBFN_BUS_EVENT_NOTIFICATION. Operacja IOCTL kończy się po wystąpieniu nowego zdarzenia USB. Zdarzenia (USBFN_EVENT) o szczególnym znaczeniu obejmują:
  6. UsbfnEventReset: służy do określania szybkości podłączonego urządzenia USB.
  7. UsbfnEventConfigured: usługa może teraz wysyłać żądania transferu.
  8. UsbfnEventSetupPacket: rozszerzenie klasy funkcji USB otrzymało pakiet instalacyjny specyficzny dla interfejsu (bmRequestType.Type == BMREQUEST_CLASS). Usługa powinna odpowiedzieć na pakiet instalacyjny, wysyłając żądanie transferu w potoku 0, a następnie żądanie uzgadniania (IOCTL_GENERICUSBFN_CONTROL_STATUS_HANDSHAKE_OUT) w przeciwnym kierunku na tym samym potoku 0.
  9. Po odebraniu zdarzenia UsbfnEventConfigured usługa może rozpocząć wydawanie żądań transferu przy użyciu IOCTL_GENERICUSBFN_TRANSFER_IN, IOCTL_GENERICUSBFN_TRANSFER_IN_APPEND_ZERO_PKT i IOCTL_GENERICUSBFN_TRANSFER_OUT.