Freigeben über


EVT_SPB_CONTROLLER_LOCK Rückruffunktion (spbcx.h)

Ein SPB-Controllertreiber EvtSpbControllerLock Ereignisrückruffunktion sperrt den SPB-Controller für den Zugriff auf ein einzelnes Zielgerät auf dem Bus.

Syntax

EVT_SPB_CONTROLLER_LOCK EvtSpbControllerLock;

VOID EvtSpbControllerLock(
  [in] WDFDEVICE Controller,
  [in] SPBTARGET Target,
  [in] SPBREQUEST LockRequest
)
{...}

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] LockRequest

Ein SPBREQUEST handle an eine E/A-Steuerelementanforderung, um den Controller zu sperren. 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.

Rückgabewert

Nichts

Bemerkungen

SpbCx verwaltet die E/A-Warteschlange für den SPB-Controller. Wenn der SPB-Controllertreiber eine EvtSpbControllerLock Rückruffunktion registriert, ruft SpbCx diese Funktion auf, wenn ein Client (Peripherietreiber) des Controllers eine IOCTL_SPB_LOCK_CONTROLLER Anforderung an ein Ziel auf dem Bus sendet. Der LockRequest Parameterwert ist ein Handle, das diese Anforderung kapselt.

Die EvtSpbControllerLock und EvtSpbControllerUnlock Funktionen führen ergänzende Vorgänge aus. Beide Funktionen sind optional. Wenn Ihr SPB-Controllertreiber eine EvtSpbControllerUnlock--Funktion implementiert, ist der Treiber nicht erforderlich, um eine EvtSpbControllerLock--Funktion zu implementieren. Dies ist jedoch möglicherweise nicht erforderlich. Wenn ihr SPB-Controllertreiber jedoch eine EvtSpbControllerLock--Funktion implementiert, muss er auch eine EvtSpbControllerUnlock--Funktion implementieren. Weitere Informationen finden Sie in den Hinweisen in SPB_CONTROLLER_CONFIG.

Während die Sperre wirksam ist, darf der Controller keinen Zugriff auf Ziele auf dem Bus zulassen, der nicht auf das ziel, das vom LockRequest Parameter festgelegt ist.

Wenn der SPB-Controllertreiber den Modus des Controllers ändern muss, um den normalen Zielauswahlmechanismus vorübergehend außer Kraft zu setzen, kann er dies während des EvtSpbControllerLock Rückrufs tun. Wenn diese Modusänderung eine lange Verzögerung erfordert oder erfordert, dass der Treiber auf einen Geräteunterbrechung wartet, sollte der Treiber die Modusänderung initiieren und dann ohne Verzögerung vom Rückruf zurückkehren. Später kann der Treiber den Sperrvorgang in einem Timer-DPC oder einem Interrupt-DPC abschließen.

Wenn der Sperrvorgang in einem DPC abgeschlossen ist, sollte der SPB-Controllertreiber zuvor alle Ressourcen zugewiesen haben, die er für den Sperrvorgang benötigt.

Ein EvtSpbControllerLock- Rückruf muss vermeiden, dass eine Sperranforderung fehlschlägt. Wenn Treiberüberprüfung aktiviert ist, löst ein solcher Fehler eine Prüferfalle aus, die dem Plug and Play-Manager meldet, dass der Controller fehlgeschlagen ist. SpbCx ignoriert den Fehler einer Sperranforderung und versucht nicht, den Fehler zu behandeln oder zu beheben.

Die funktion EvtSpbControllerLock gibt keinen Wert zurück. Stattdessen gibt der SPB-Controllertreiber den Status des Sperrvorgangs im Abschlussstatus der E/A-Anforderung an, die vom LockRequest Parameter identifiziert wird. Legen Sie den Abschlussstatus auf STATUS_SUCCESS fest.

SpbCx ruft die EvtSpbControllerUnlock Ereignisrückruffunktion auf, um einen Controller zu entsperren, der zuvor von einem EvtSpbControllerLock Rückruf gesperrt wurde.

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

Weitere Informationen zur funktion EvtSpbControllerLock finden Sie unter Handling Client-Implemented Sequences.

Beispiele

Um eine EvtSpbControllerLock 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 EvtSpbControllerLock Rückruffunktion zu definieren, die MyEvtSpbControllerLockbenannt ist, verwenden Sie den funktionstyp EVT_SPB_CONTROLLER_LOCK, wie in diesem Codebeispiel gezeigt:

EVT_SPB_CONTROLLER_LOCK  MyEvtSpbControllerLock;

Implementieren Sie dann die Rückruffunktion wie folgt:

_Use_decl_annotations_
VOID
  MyEvtSpbControllerLock(
    WDFDEVICE Controller,
    SPBTARGET Target,
    SPBREQUEST LockRequest
    )
{ ... }

Der EVT_SPB_CONTROLLER_LOCK 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_LOCK 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