Freigeben über


EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE Rückruffunktion (wdfio.h)

[Gilt für KMDF und UMDF]

Die EvtIoCanceledOnQueue Ereignisrückruffunktion eines Treibers informiert den Treiber darüber, dass er eine E/A-Anforderung abschließen muss, die das Framework aus einer E/A-Warteschlange entfernt hat.

Syntax

EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE EvtWdfIoQueueIoCanceledOnQueue;

void EvtWdfIoQueueIoCanceledOnQueue(
  [in] WDFQUEUE Queue,
  [in] WDFREQUEST Request
)
{...}

Die Parameter

[in] Queue

Ein Handle zu einem E/A-Warteschlangenobjekt.

[in] Request

Ein Handle zu einem Anforderungsobjekt.

Rückgabewert

Nichts

Bemerkungen

Ein Treiber registriert eine EvtIoCanceledOnQueue Rückruffunktion, wenn die WdfIoQueueCreate-Methode aufgerufen wird. Weitere Informationen zum Aufrufen WdfIoQueueCreatefinden Sie unter Erstellen von E/A-Warteschlangen.

Wenn ein Treiber eine EvtIoCanceledOnQueue Rückruffunktion für eine E/A-Warteschlange registriert, ruft das Framework die Rückruffunktion in den folgenden Situationen auf:

  • Ein Anforderungshandler eine E/A-Anforderung von einer E/A-Warteschlange empfängt, der Treiber ruft WdfRequestForwardToIoQueue, WdfRequestForwardToParentDeviceIoQueue, oder WdfRequestRequeue erneut die Anforderung an die E/A-Warteschlange zurück, für die die EvtIoCanceledOnQueue Rückruffunktion registriert ist, und der zugeordnete E/A-Vorgang wird anschließend abgebrochen.
  • Die EvtIoInCallerContext Rückruffunktion des Treibers empfängt eine E/A-Anforderung, der Treiber ruft WdfDeviceEnqueueRequest, um die Anforderung an das Framework zurückzugeben, platziert das Framework dann die Anforderung in der E/A-Warteschlange, für die die EvtIoCanceledOnQueue Rückruffunktion registriert ist, und anschließend der zugeordnete E/A-Vorgang abgebrochen wird.
Nachdem das Framework die EvtIoCanceledOnQueue Rückruffunktion aufgerufen hat, besitzt der Treiber das Anforderungsobjekt und muss die Anforderung mit einem entsprechenden Statuscode abschließen, entweder in EvtIoCanceledOnQueue oder höher. Wenn das Framework EvtIoCanceledOnQueueaufruft, wird die Anforderung weiterhin der E/A-Warteschlange zugeordnet, der Treiber kann die Anforderung jedoch nicht erneut anfordern. Der Besitz der Anforderung verbleibt beim Treiber, auch wenn der Treiber die Anforderung in EvtIoCanceledOnQueuenicht erfüllt. Wenn der Treiber die Anforderung abgeschlossen hat, nachdem EvtIoCanceledOnQueue zurückgegeben wurde, kann er nicht WdfIoQueueFindRequest aufrufen und WdfIoQueueRetrieveFoundRequest, um den Besitz der Anforderung erneut zu erhalten, da der Treiber bereits über den Besitz der Anforderung verfügt.

In der Regel schließt der Treiber in EvtIoCanceledOnQueuedie E/A-Anforderung mit dem Abschlussstatus STATUS_CANCELLED ab.

In einigen Fällen hat der Treiber möglicherweise zuvor eine E/A-Anforderung in eine manuelle Warteschlange zurückgefragt, vielleicht um auf Informationen zu warten. Beispielsweise kann ein Treiber in einem seiner Anforderungshandlereine E/A-Anforderung platzieren, die einer ausstehenden DMA-Transaktion in einer manuellen Warteschlange zugeordnet ist. In diesem Fall versucht der Treiber, die DMA-Transaktion in seinem EvtIoCanceledOnQueue Rückruf abzubrechen. Abhängig von den Ergebnissen des Abbruchvorgangs schließt der Treiber die Anforderung mit einem geeigneten Status ab, entweder in EvtIoCanceledOnQueue oder höher.

Das Framework ruft nicht die EvtIoCanceledOnQueue Rückruffunktion für E/A-Anforderungen auf, die das Framework nie an den Treiber übermittelt hat.

Das Framework ruft eine EvtIoCanceledOnQueue Rückruffunktion auf, sobald festgestellt wird, dass eine E/A-Anforderung abgebrochen wurde, unabhängig von der Dispatching-Methode, die der Treiber für die E/A-Warteschlange festgelegt hat. Daher kann das Framework eine EvtIoCanceledOnQueue Rückruffunktion aufrufen für:

  • Eine Anforderung in einer Warteschlange, die sequenzielle Verteilerverwendet, auch wenn der Treiber derzeit eine andere Anforderung aus der Warteschlange besitzt.
  • Eine Anforderung in einer Warteschlange, für die der Treiber NumberOfPresentedRequestsfestgelegt hat, auch wenn der Treiber derzeit die maximale Anzahl von Anforderungen besitzt.
Weitere Informationen zur EvtIoCanceledOnQueue Rückruffunktion finden Sie unter Abbrechen von E/A-Anforderungen.

Die EvtIoCanceledOnQueue- Rückruffunktion kann bei IRQL <= DISPATCH_LEVEL aufgerufen werden, es sei denn, das ExecutionLevel Member der WDF_OBJECT_ATTRIBUTES Struktur des Geräts oder Treibers wird auf WdfExecutionLevelPassivefestgelegt.

Wenn die IRQL PASSIVE_LEVEL ist, ruft das Framework die Rückruffunktion innerhalb eines kritischen Bereichsauf.

Beispiele

Um eine EvtIoCanceledOnQueue 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 eine EvtIoCanceledOnQueue Rückruffunktion zu definieren, müssen Sie zuerst eine Funktionsdeklaration bereitstellen, die SDV und andere Überprüfungstools erfordern. Das folgende Beispiel stammt aus dem beispiel PCMCIA SmartCard Driver Beispiel.

EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE PscrEvtIoCanceledOnQueue;

Im beispiel PCMCIA Smart Card Driver verwendet der Treiber eine manuelle Warteschlange, um ausstehende Smartcardbenachrichtigungsanforderungen zu speichern. Der Treiber stellt eine EvtIoCanceledOnQueue Rückruffunktion bereit, in der der Treiber das Benachrichtigungsfeld löscht und die Anforderung abschließt.

_Use_decl_annotations_
VOID
PscrEvtIoCanceledOnQueue(
    WDFQUEUE  Queue,
    WDFREQUEST  Request
    )

{
    PDEVICE_EXTENSION DeviceExtension;
    PSMARTCARD_EXTENSION smartcardExtension;

    DeviceExtension = GetDeviceExtension(WdfIoQueueGetDevice(Queue));
    smartcardExtension = (PSMARTCARD_EXTENSION) &DeviceExtension->SmartcardExtension;

    //KdPrint(("Cancelled on queue 0x%x\n", WdfRequestWdmGetIrp(Request)));

    InterlockedExchangePointer(
                             &(smartcardExtension->OsData->NotificationIrp),
                             NULL
                             );

    WdfRequestComplete(Request, STATUS_CANCELLED);
}

Der EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE Funktionstyp wird in der Headerdatei "Wdfio.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_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE 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. Informationen zu Use_decl_annotationsfinden Sie unter Annotating Function Behavior.

Anforderungen

Anforderung Wert
Zielplattform universell
Minimale KMDF-Version 1.0
Mindest-UMDF-Version 2.0
Kopfzeile wdfio.h (einschließen Wdf.h)
IRQL <= DISPATCH_LEVEL (siehe Abschnitt "Hinweise")

Siehe auch

WdfIoQueueCreate

WdfRequestForwardToIoQueue