Share via


Verarbeiten von E/A-Anforderungen in einem USB-Hostcontrollertreiber

Bewährte Methoden für einen Hostcontrollertreiber zum Verarbeiten von E/A-Anforderungen, die von UCX gesendet werden.

UCX verfolgt alle Endpunkte nach, die vom Hostcontrollertreiber für Geräte im USB-Bus erstellt wurden. Alle Datenübertragungsanforderungen, die vom Hubtreiber oder von einem anderen Treiber gesendet werden, der sich weiter oben im USB-Gerätestapel befindet, werden zuerst von UCX verarbeitet. UCX ist für die Weiterleitung des Frameworkanforderungsobjekts an die richtige Endpunktwarteschlange verantwortlich. Der in der Anforderung enthaltene USB-Anforderungsblock (USB Request Block, URB) kann ein Endpunkthandle angeben. Wenn ein Endpunkthandle angegeben ist, überprüft UCX unter den für das Gerät vorhandenen Endpunkten nach dem entsprechenden Endpunkt. Wenn das angegebene Endpunkthandle vorhanden ist, wird die Anforderung an die Warteschlange des Endpunkts weitergeleitet. Wenn das angegebene Endpunkthandle nicht gefunden wird, tritt ein Fehler bei der Anforderung auf. Wenn kein Handle angegeben ist, gilt die Anforderung für den Standardendpunkt, und UCX leitet die Anforderung an die Standardendpunktwarteschlange des Hostcontrollertreibers für dieses Gerät weiter.

Um die Kompatibilität mit vorhandenen USB-Treibern sicherzustellen, muss der Hostcontroller beim Abschließen der URB-Anforderung die folgenden Anforderungen erfüllen:

  • WdfRequestComplete muss unter DISPATCH_LEVEL aufgerufen werden.
  • Wenn die URB an die Frameworkwarteschlange übermittelt wurde und der Treiber mit der synchronen Verarbeitung im Thread oder DPC des aufrufenden Treibers begonnen hat, sollte die Anforderung nicht auch synchron abgeschlossen werden. Die Anforderung muss auf einem separaten DPC abgeschlossen werden, der mit einem Aufruf von WdfDpcEnqueue geplant werden kann.
  • Ähnlich wie bei der vorherigen Anforderung muss der Hostcontrollertreiber beim Empfang EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE oder EVT_WDF_REQUEST_CANCEL die URB-Anforderung für einen separaten DPC vom aufrufenden Thread oder DPC abschließen. Standardmäßig schließt WDF abgebrochene Anforderungen in der Warteschlange synchron ab. Dieses Verhalten kann probleme bei URB-Anforderungen verursachen. Aus diesem Grund muss der Treiber einen EvtIoCanceledOnQueue-Rückruf für seine URB-Warteschlangen bereitstellen.

Das Frameworkanforderungsobjekt für eine IOCTL_INTERNAL_USB_SUBMIT_URB enthält eine URB unter Parameters.Others.Arg1 der Anforderung. Wenn die Anforderung abgeschlossen ist, muss der URB-status entweder auf USBD_STATUS_SUCCESS oder auf einen Fehler status festgelegt werden, der die Art des Fehlers angibt. Die Fehlerwerte status werden in der Usb.h-Headerdatei definiert.