EVT_WDF_IO_IN_CALLER_CONTEXT Rückruffunktion (wdfdevice.h)
[Gilt nur für KMDF]
Die EvtIoInCallerContext-Ereignisrückruffunktion eines Treibers verarbeitet eine E/A-Anforderung vor, bevor sie vom Framework in eine E/A-Warteschlange platziert wird.
Syntax
EVT_WDF_IO_IN_CALLER_CONTEXT EvtWdfIoInCallerContext;
void EvtWdfIoInCallerContext(
[in] WDFDEVICE Device,
[in] WDFREQUEST Request
)
{...}
Parameter
[in] Device
Ein Handle für ein Framework-Geräteobjekt.
[in] Request
Ein Handle für ein Frameworkanforderungsobjekt.
Rückgabewert
Keine
Bemerkungen
Das Framework ruft die EvtIoInCallerContext-Rückruffunktion eines Treibers auf, damit der Treiber jede E/A-Anforderung untersuchen und möglicherweise eine vorläufige Verarbeitung für die Anforderung ausführen kann, bevor das Framework sie in einer E/A-Warteschlange platziert. Um eine EvtIoInCallerContext-Rückruffunktion für ein Gerät zu registrieren, ruft der Treiber WdfDeviceInitSetIoInCallerContextCallback auf.
Wenn ein Treiber eine EvtIoInCallerContext-Rückruffunktion für ein Gerät registriert, ruft das Framework die Rückruffunktion jedes Mal auf, wenn es eine E/A-Anforderung für das Gerät empfängt. Die Rückruffunktion wird im Threadkontext des Prozesses aufgerufen, der die E/A-Anforderung an den Treiber gesendet hat. Bei diesem Prozess handelt es sich entweder um den Treiber der nächsthöheren Ebene oder, wenn sich der Treiber ganz oben im Treiberstapel befindet, um eine Anwendung im Benutzermodus.
Der Hauptzweck dieser Rückruffunktion besteht darin, frameworkbasierte Treiber zur Unterstützung der Pufferzugriffsmethode zu ermöglichen, die weder gepuffert noch direkte E/A genannt wird. Für diese Pufferzugriffsmethode muss der Treiber auf empfangene Puffer im Prozesskontext des Absenders zugreifen.
Nachdem die Rückruffunktion die Puffer einer Anforderung abgerufen hat, kann sie Pufferadressen oder Handles im Kontextspeicher des Anforderungsobjekts speichern. (Der Treiber legt die Größe des Kontextspeicherbereichs des Anforderungsobjekts durch Aufrufen von WdfDeviceInitSetRequestAttributes fest.)
Da die Anforderung noch nicht zu einer E/A-Warteschlange gehört, sperrt oder synchronisiert das Framework die Anforderung nicht. Der Treiber ist für die ggf. erforderliche Synchronisierung verantwortlich. Weitere Informationen zur Synchronisierung finden Sie unter Synchronisierungstechniken für Framework-Based Treiber.
Nachdem die Rückruffunktion die Vorverarbeitung der Anforderung abgeschlossen hat, muss sie sie entweder in eine Warteschlange stellen, indem sie WdfDeviceEnqueueRequest aufruft, oder sie durch Aufrufen von WdfRequestComplete abschließen (wenn ein Fehler erkannt wird).
Weitere Informationen zur Rückruffunktion EvtIoInCallerContext finden Sie unter Abfangen einer E/A-Anforderung vor der Warteschlange und Zugreifen auf Datenpuffer in Framework-Based Treibern.
Wenn ein Treiber eine E/A-Warteschlange konfiguriert hat, um den garantierten Vorwärtsfortschritt zu unterstützen, ruft das Framework möglicherweise die Rückruffunktion EvtIoInCallerContext des Treibers in Situationen mit wenig Arbeitsspeicher nicht auf. Wenn alle reservierten Anforderungsobjekte des Frameworks verwendet werden, verschiebt das Framework die Verarbeitung der E/A-Anforderung, bis ein reserviertes Anforderungsobjekt verfügbar ist. In dieser Situation kann das Framework die Rückruffunktion EvtIoInCallerContext für die verschobene E/A-Anforderung nicht aufrufen, da das Framework, wenn ein reserviertes Anforderungsobjekt verfügbar wird, nicht mehr im Threadkontext des Prozesses ausgeführt wird, der die E/A-Anforderung an den Treiber gesendet hat.
Die Rückruffunktion EvtIoInCallerContext wird am IRQL des aufrufenden Threads aufgerufen. Wenn der aufrufende Thread von einer Anwendung im Benutzermodus stammt, wird die Rückruffunktion unter IRQL = PASSIVE_LEVEL aufgerufen. Wenn der aufrufende Thread von einem Kernelmodustreiber auf höherer Ebene stammt, kann die EvtIoInCallerContext-Rückruffunktion Ihres Treibers unter IRQL <= DISPATCH_LEVEL aufgerufen werden, wenn sowohl die Rückruffunktion als auch der Treiber auf höherer Ebene so konzipiert sind, dass die Anforderung an IRQL <= DISPATCH_LEVEL übergeben wird.
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform | Universell |
KMDF-Mindestversion | 1.0 |
Kopfzeile | wdfdevice.h (einschließen von Wdf.h) |
IRQL | Weitere Informationen finden Sie im Abschnitt mit den Hinweisen. |