Freigeben über


EVT_SPB_CONTROLLER_READ Rückruffunktion (spbcx.h)

Die EvtSpbControllerIoRead Ereignisrückruffunktion eines SPB-Controllertreibers liest Daten vom angegebenen Zielgerät in die Puffer, die mit der Leseanforderung bereitgestellt werden.

Syntax

EVT_SPB_CONTROLLER_READ EvtSpbControllerRead;

void EvtSpbControllerRead(
  [in] WDFDEVICE Controller,
  [in] SPBTARGET Target,
  [in] SPBREQUEST Request,
  [in] size_t Length
)
{...}

Parameter

[in] Controller

Ein WDFDEVICE-Handle für das Framework-Geräteobjekt, das den SPB-Controller darstellt.

[in] Target

Eine SPBTARGET- für das Ziel für diese E/A-Anforderung. Das Ziel ist ein Peripheriegerät oder port, das an den Bus angeschlossen ist. Die SPB-Frameworkerweiterung (SpbCx) hat diesem Handle zuvor im EvtSpbTargetConnect Rückruf zugewiesen, der die Verbindung mit dem Ziel geöffnet hat.

[in] Request

Eine SPBREQUEST Handle für die E/A-Anforderung. Ihr SPB-Controllertreiber muss diese Anforderung entweder durch Ausführen des angeforderten Vorgangs oder durch Zurückgeben eines Fehlerstatus abschließen. Weitere Informationen finden Sie unter Anmerkungen.

[in] Length

Die Anzahl der Bytes, die vom Zielgerät gelesen werden sollen.

Rückgabewert

Nichts

Bemerkungen

SpbCx verwaltet die E/A-Warteschlange für den SPB-Controller. SpbCx ruft die EvtSpbControllerIoRead Rückruffunktion des SPB-Controllers auf, wenn ein Client (Peripherietreiber) des SPB-Controllers eine IRP_MJ_READ Anforderung an ein Zielgerät sendet, das an den Bus angeschlossen ist. Der wert des Request Parameter ist ein Handle, das diese Anforderung kapselt.

Ein EvtSpbControllerIoRead Rückruf gibt keinen Statuswert zurück. Stattdessen gibt der SPB-Controllertreiber den Status des Lesevorgangs im Abschlussstatus für die E/A-Anforderung an.

Ein EvtSpbControllerIoRead Rückruf ist asynchron. Das heißt, die Rückruffunktion sollte den angeforderten Lesevorgang initiieren und dann zurückgeben, ohne auf den Abschluss des Vorgangs zu warten. Später schließt der SPB-Controllertreiber die Leseanforderung während eines Interrupt-DPC oder eines Timers DPC ab.

Wenn der Lesevorgang vollständig abgeschlossen ist, sollte der SPB-Controllertreiber den Abschlussstatus auf STATUS_SUCCESS festlegen. Wenn das Zielgerät angibt, dass es einige, aber nicht alle angeforderten Daten bereitstellen kann, sollte der SPB-Controllertreiber beliebig viele Daten abrufen, die Anzahl der abgerufenen Datenbytes angeben und den Abschlussstatus in der E/A-Anforderung auf STATUS_SUCCESS festlegen. Ein solcher teilweise abgeschlossener Lesevorgang kann nicht auf einem SPI oder I2C Bus auftreten, kann aber auf einem anderen Bustyp auftreten.

Wenn der Lesevorgang aufgrund von Zeilengeräuschen, einem Controllerhardwarefehler oder einem Treiberfehler fehlschlägt, sollte der SPB-Controllertreiber den Abschlussstatus in der E/A-Anforderung auf einen entsprechenden Fehlercode festlegen. Nicht alle Busse bieten einen Mechanismus für ein Zielgerät, um einen Transportfehler oder eine teilweise abgeschlossene Übertragung zu melden, und nicht alle Controller können diese Bedingungen erkennen.

Um eine EvtSpbControllerIoRead- Rückruffunktion zu registrieren, rufen Sie die SpbDeviceInitialize-Methode auf.

Beispiele

Um eine EvtSpbControllerIoRead- Rückruffunktion zu definieren, müssen Sie zuerst eine Funktionsdeklaration bereitstellen, die den Typ der Rückruffunktion identifiziert, die Sie definieren. Windows stellt eine Reihe von Rückruffunktionstypen für Treiber bereit. Durch das Deklarieren einer Funktion mithilfe der Rückruffunktionstypen können Codeanalyse für Treiber, statische Treiberüberprüfung (SDV) und andere Überprüfungstools Fehler finden, und es ist eine Anforderung zum Schreiben von Treibern für das Windows-Betriebssystem.

Um beispielsweise eine EvtSpbControllerIoRead- Rückruffunktion zu definieren, die MyEvtSpbControllerIoReadbenannt ist, verwenden Sie den funktionstyp EVT_SPB_CONTROLLER_READ, wie in diesem Codebeispiel gezeigt:

EVT_SPB_CONTROLLER_READ  MyEvtSpbControllerIoRead;

Implementieren Sie dann die Rückruffunktion wie folgt:

_Use_decl_annotations_
VOID
  MyEvtSpbControllerIoRead(
    WDFDEVICE Controller,
    SPBTARGET Target,
    SPBREQUEST Request,
    size_t Length
    )
{ ... }

Der EVT_SPB_CONTROLLER_READ Funktionstyp wird in der Headerdatei "Spbcx.h" definiert. Um Fehler genauer zu identifizieren, wenn Sie die Codeanalysetools ausführen, müssen Sie der Funktionsdefinition die Use_decl_annotations Anmerkung hinzufügen. Die Use_decl_annotations Anmerkung stellt sicher, dass die Anmerkungen, die auf den Funktionstyp EVT_SPB_CONTROLLER_READ in der Headerdatei angewendet werden, verwendet werden. Weitere Informationen zu den Anforderungen für Funktionsdeklarationen finden Sie unter Deklarieren von Funktionen mithilfe von Funktionsrollentypen für KMDF-Treiber. Weitere Informationen zu Use_decl_annotationsfinden Sie unter Annotating Function Behavior.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Wird ab Windows 8 unterstützt.
Zielplattform- Desktop
Header- spbcx.h
IRQL- Wird bei IRQL <= DISPATCH_LEVEL aufgerufen.

Siehe auch