Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Das Framework stellt jede Pipe in einer USB-Schnittstelle als Framework-USB-Pipeobjekt dar. Wenn ein Treiber ein USB-Gerätkonfiguriert, erstellt das Framework ein Framework-USB-Pipeobjekt für jede Pipe in jeder ausgewählten Schnittstelle. Pipe-Objektmethoden ermöglichen es einem Treiber, die folgenden Vorgänge auszuführen:
Abrufen von Rohrinformationen
Nachdem Sie WdfUsbInterfaceGetConfiguredPipe aufgerufen haben, um ein Handle für ein Framework-USB-Pipeobjekt abzurufen, kann Ihr Treiber die folgenden Methoden aufrufen, die das USB-Pipeobjekt zum Abrufen von Informationen über das USB-Pipe definiert:
WdfUsbTargetPipeGetIoTarget
Gibt ein Handle an das E/A-Zielobjekt zurück, das einer USB-Leitung zugeordnet ist. Der Treiber kann dieses Handle an WdfRequestSend übergeben.
WdfUsbTargetPipeGetInformation
Ruft Informationen zu einem USB-Pipe und seinem Endpunkt ab.
WdfUsbTargetPipeGetType
Gibt den Typ eines USB-Rohrs zurück.
WdfUsbTargetPipeIsInEndpoint
Bestimmt, ob eine USB-Pipe mit einem Eingabeendpunkt verbunden ist.
WdfUsbTargetPipeIsOutEndpoint
Bestimmt, ob eine USB-Leitung an einen Ausgangsendpunkt angeschlossen ist.
WDF_USB_PIPE_DIRECTION_IN
Bestimmt, ob ein USB-Endpunkt ein Eingabeendpunkt ist.
WDF_USB_PIPE_DIRECTION_OUT
Bestimmt, ob ein USB-Endpunkt ein Ausgabeendpunkt ist.
Verwandte Informationen finden Sie unter Aufzählen von USB-Rohren.
Lesen aus einer Pipe
Um Daten aus einer USB-Eingabepipe zu lesen, kann Ihr Treiber eine beliebige (oder alle) der folgenden drei Techniken verwenden:
Synchrones Lesen von Daten
Um Daten synchron aus einer USB-Eingabepipeline zu lesen, kann Ihr Treiber die WdfUsbTargetPipeReadSynchronously-Methode aufrufen. Diese Methode erstellt und sendet eine Leseanforderung, und sie wird zurückgegeben, nachdem der E/A-Vorgang abgeschlossen wurde.
asynchrones Lesen von Daten
Um Daten asynchron aus einer USB-Eingabepipeline zu lesen, kann Ihr Treiber die WdfUsbTargetPipeFormatRequestForRead--Methode aufrufen, um eine Leseanforderung zu erstellen. Anschließend kann der Treiber WdfRequestSend- aufrufen, um die Anforderung asynchron (oder synchron) zu senden.
Daten asynchron und kontinuierlich lesen
Ein endloser Leser ist ein vom Framework vorgesehener Mechanismus, um sicherzustellen, dass eine Leseanforderung immer für eine USB-Leitung verfügbar ist. Dieser Mechanismus garantiert, dass der Treiber immer bereit ist, Daten von einem Gerät zu empfangen, das einen asynchronen, unerwünschten Eingabedatenstrom bereitstellt. Ein Treiber für eine Netzwerkschnittstellenkarte (Network Interface Card, NIC) kann z. B. einen kontinuierlichen Reader verwenden, um Eingabedaten zu empfangen.
Um einen kontinuierlichen Reader für eine Input-Pipe zu konfigurieren, muss die Callback-Funktion des Treibers EvtDevicePrepareHardware die Methode WdfUsbTargetPipeConfigContinuousReader aufrufen. Diese Methode legt ein Set von Leseanfragen an das E/A-Ziel des Geräts in einer Warteschlange fest.
Außerdem muss die Callback-Funktion des Treibers EvtDeviceD0Entry WdfIoTargetStart aufrufen, um den kontinuierlichen Reader zu starten und die Callback-Funktion des Treibers EvtDeviceD0Exit muss WdfIoTargetStop aufrufen, um den kontinuierlichen Reader anzuhalten.
Jedes Mal, wenn daten vom Gerät verfügbar sind, schließt das E/A-Ziel eine Leseanforderung ab, und das Framework ruft eine von zwei Rückruffunktionen auf: EvtUsbTargetPipeReadComplete, wenn das E/A-Ziel erfolgreich die Daten gelesen hat, oder EvtUsbTargetPipeReadersFailed, wenn das E/A-Ziel einen Fehler meldet.
Wenn Sie den optionalen EvtUsbTargetPipeReadersFailed Callback nicht bereitstellen, reagiert das Framework auf einen fehlgeschlagenen Leseversuch mit dem Senden einer weiteren Anfrage. Wenn sich der Bus also in einem Status befindet, in dem er keine Leseversuche annimmt, sendet das Framework ständig neue Anfragen, um einen fehlgeschlagenen Leseversuch auszugleichen.
Nachdem ein Treiber WdfUsbTargetPipeConfigContinuousReader aufgerufen hat, kann er WdfUsbTargetPipeReadSynchronously oder WdfRequestSend nicht verwenden, um E/A-Anfragen an die Pipe zu senden, es sei denn, die Callback-Funktion EvtUsbTargetPipeReadersFailed des Treibers wird aufgerufen und liefert FALSE.
Standardmäßig meldet das Framework einen Fehler, wenn ihr Treiber einen Lesepuffer angibt, der kein Vielfaches der maximalen Paketgröße der Pipe ist. Ihr Treiber kann WdfUsbTargetPipeSetNoMaximumPacketSizeCheck aufrufen, um diesen Test der Lesepuffergrößen zu deaktivieren.
Verwandte Informationen finden Sie unter:
- So senden Sie USB-Massenübertragungsanforderungen
- So übertragen Sie Daten an isochrone USB-Endpunkte
- Wie Sie den kontinuierlichen Reader zum Lesen von Daten aus einer USB-Pipe verwenden
Schreiben in eine Pipe
Um Daten in ein USB-Ausgaberohr zu schreiben, kann Ihr Treiber eine (oder beide) der folgenden Techniken verwenden:
Synchrones Schreiben von Daten
Um Daten synchron in eine USB-Ausgabepipeline zu schreiben, kann Ihr Treiber die WdfUsbTargetPipeWriteSynchronously-Methode aufrufen. Diese Methode erstellt und sendet eine Schreibanforderung, und sie wird zurückgegeben, nachdem der E/A-Vorgang abgeschlossen wurde.
asynchrones Schreiben von Daten
Um Daten asynchron in eine USB-Eingabepipeline zu schreiben, kann Ihr Treiber die WdfUsbTargetPipeFormatRequestForWrite Methode aufrufen, um eine Schreibanforderung zu erstellen. Anschließend kann der Treiber WdfRequestSend- aufrufen, um die Anforderung asynchron zu senden.
Verwandte Informationen finden Sie unter Senden von USB-Massenübertragungsanforderungen.
Anhalten und Zurücksetzen einer Pipe
Ihr Treiber kann die folgenden Methoden aufrufen, um ein USB-Rohr zu beenden oder zurückzusetzen:
WdfUsbTargetPipeAbortSynchronously
Sendet synchron eine Anforderung, um eine USB-Leitung zu beenden.
WdfUsbTargetPipeFormatRequestForAbort
Formatiert eine Anforderung zum Beenden eines USB-Rohrs. Der Treiber kann WdfRequestSend- aufrufen, um die Anforderung synchron oder asynchron zu senden.
WdfUsbTargetPipeResetSynchronously
Sendet synchron eine Anfrage zum Zurücksetzen einer USB-Pipe.
WdfUsbTargetPipeFormatRequestForReset
Formatiert eine Anfrage zum Zurücksetzen einer USB-Pipe. Der Treiber muss WdfRequestSend- aufrufen, um die Anforderung synchron oder asynchron zu senden.
Wenn das USB-Ziel Ihres Treibers eine E/A-Anfrage mit einem Fehlerstatuswert abschließt, sollte Ihr Treiber Folgendes tun:
Beenden Sie die Pipe, und brechen Sie alle zusätzlichen E/A-Anforderungen ab, die der Treiber an das USB-Ziel gesendet hat, wenn das Ziel die Anforderungen nicht abgeschlossen hat.
Aufruf von WdfIoTargetStop mit dem gesetzten Flag WdfIoTargetCancelSentIo.
Senden Sie synchron eine Abbruchanforderung an die Pipe.
Aufruf von WdfUsbTargetPipeAbortSynchronously, oder Aufruf von WdfUsbTargetPipeFormatRequestForAbort gefolgt von WdfRequestSend mit gesetztem WDF_REQUEST_SEND_OPTION_SYNCHRONOUS Flag.
Senden Sie synchron eine Rücksetzanforderung an die Pipe.
Aufruf von WdfUsbTargetPipeResetSynchronously, oder Aufruf von WdfUsbTargetPipeFormatRequestForReset gefolgt von WdfRequestSend mit dem WDF_REQUEST_SEND_OPTION_SYNCHRONOUS Flag festgelegt.
Starten Sie die Rohre neu.
Rufen Sie WdfIoTargetStartauf.
Senden Sie die fehlgeschlagene E/A-Anforderung erneut, und alle E/A-Anforderungen, die auf die fehlgeschlagene Anforderung folgen.
Nach einer erheblichen Anzahl mehrerer Fehler sollte der Treiber versuchen, den USB-Anschluss wie folgt zurückzusetzen:
Beenden Sie alle aktiven Rohre, und brechen Sie alle zusätzlichen E/A-Anforderungen ab, die der Treiber an das USB-Ziel der einzelnen Rohre gesendet hat, wenn das Ziel sie nicht abgeschlossen hat.
Aufrufen für jede aktive Pipe WdfIoTargetStop mit gesetztem WdfIoTargetCancelSentIo Flag.
Senden Sie synchron eine Anforderung, um den USB-Anschluss zurückzusetzen.
Aufruf von WdfUsbTargetDeviceResetPortSynchronously.
Starten Sie die Rohre neu.
Rufen Sie WdfIoTargetStart für jede Pipe auf, die der Treiber gestoppt hat.
Senden Sie die letzte E/A-Anforderung erneut, die fehlgeschlagen ist, und alle E/A-Anforderungen, die der fehlgeschlagenen Anforderung folgen.
Weitere Informationen finden Sie unter So beheben Sie USB-Pipe-Fehler.
Senden eines URB an eine Pipe
Wenn Ihr KMDF-Treiber mit einem USB-Pipe kommuniziert, indem E/A-Anforderungen gesendet werden, die URBs enthalten, kann der Treiber die folgenden Methoden aufrufen:
WdfUsbTargetPipeSendUrbSynchronously (nur KMDF)
Sendet synchron eine E/A-Anfrage, die eine URB enthält.
WdfUsbTargetPipeFormatRequestForUrb (nur KMDF)
Formatiert eine E/A-Anfrage, die ein URB enthält. Der Treiber kann WdfRequestSend- aufrufen, um die Anforderung synchron oder asynchron zu senden.
WdfUsbTargetPipeWdmGetPipeHandle (nur KMDF)
Gibt den USBD-Rohrziehpunkt eines Geräts zurück. Einige URBs benötigen dieses Handle.