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
Ein SPBTARGET-Handle für das Ziel für diese E/A-Anforderung. Das Ziel ist ein Peripheriegerät oder ein Port, das an den Bus angeschlossen ist. Die SPB-Frameworkerweiterung (SpbCx) hat dieses Handle zuvor dem Ziel im EvtSpbTargetConnect-Rückruf zugewiesen, der die Verbindung mit dem Ziel geöffnet hat.
[in] Request
Ein 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 Fehlers status ausführen. Weitere Informationen finden Sie unter Hinweise.
[in] Length
Die Anzahl der Bytes, die vom Zielgerät gelesen werden sollen.
Rückgabewert
Keine
Bemerkungen
SpbCx verwaltet die E/A-Warteschlange für den SPB-Controller. SpbCx ruft die EvtSpbControllerIoRead-Rückruffunktion des SPB-Controllertreibers 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 Request-Parameterwert ist ein Handle, das diese Anforderung kapselt.
Ein EvtSpbControllerIoRead-Rückruf gibt keinen status Wert zurück. Stattdessen gibt der SPB-Controllertreiber die status des Lesevorgangs in der Status 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 einer Timer-DPC ab.
Wenn der Lesevorgang vollständig abgeschlossen ist, sollte der SPB-Controllertreiber die Vervollständigung status auf STATUS_SUCCESS festlegen. Wenn das Zielgerät angibt, dass es einige, aber nicht alle angeforderten Daten bereitstellen kann, sollte der SPB-Controllertreiber so viele Daten abrufen, wie verfügbar sind, die Anzahl der abgerufenen Datenbytes angeben und die Vervollständigung status in der E/A-Anforderung auf STATUS_SUCCESS festlegen. Ein solcher teilweise abgeschlossener Lesevorgang kann nicht auf einem SPI- oderI2-C-Busauftreten, sondern möglicherweise auf einem anderen Bustyp.
Wenn der Lesevorgang aufgrund von Zeilenrauschen, einem Controllerhardwarefehler oder einem Treiberfehler fehlschlägt, sollte der SPB-Controllertreiber den Abschluss status 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 zunächst eine Funktionsdeklaration bereitstellen, die den Typ der von Ihnen definierten Rückruffunktion identifiziert. Windows bietet eine Reihe von Rückruffunktionstypen für Treiber. Das Deklarieren einer Funktion mithilfe der Rückruffunktionstypen hilft der Codeanalyse für Treiber, der statischen Treiberüberprüfung (Static Driver Verifier , SDV) und anderen Überprüfungstools, Fehler zu finden, und es ist eine Anforderung zum Schreiben von Treibern für das Windows-Betriebssystem.
Um beispielsweise eine EvtSpbControllerIoRead-Rückruffunktion mit dem Namen MyEvtSpbControllerIoRead
zu definieren, verwenden Sie den EVT_SPB_CONTROLLER_READ-Funktionstyp, wie in diesem Codebeispiel gezeigt:
EVT_SPB_CONTROLLER_READ MyEvtSpbControllerIoRead;
Implementieren Sie dann Ihre Rückruffunktion wie folgt:
_Use_decl_annotations_
VOID
MyEvtSpbControllerIoRead(
WDFDEVICE Controller,
SPBTARGET Target,
SPBREQUEST Request,
size_t Length
)
{ ... }
Der EVT_SPB_CONTROLLER_READ Funktionstyp ist in der Headerdatei Spbcx.h definiert. Um Fehler beim Ausführen der Codeanalysetools genauer zu identifizieren, fügen Sie der Funktionsdefinition die Use_decl_annotations Anmerkung hinzu. Die Use_decl_annotations Anmerkung stellt sicher, dass die Anmerkungen verwendet werden, die auf den EVT_SPB_CONTROLLER_READ Funktionstyp in der Headerdatei angewendet 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_annotations finden Sie unter Verhalten von Funktionen mit Anmerkungen.
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Wird ab Windows 8 unterstützt. |
Zielplattform | Desktop |
Kopfzeile | spbcx.h |
IRQL | Wird unter IRQL <= DISPATCH_LEVEL aufgerufen. |