Erstellen von Framework-Anforderungsobjekten
Framework-Anforderungsobjekte stellen E/A-Anforderungen dar, die der E/A-Manager an einen Treiber gesendet hat. Frameworkbasierte Treiber verarbeiten jede E/A-Anforderung durch Aufrufen von Frameworkanforderungsobjektmethoden.
Jede E/A-Anforderung enthält ein WDM-E/A-Anforderungspaket (IRP-Struktur ), frameworkbasierte Treiber müssen jedoch in der Regel nicht auf die IRP-Struktur zugreifen.
Die meisten Frameworkanforderungsobjekte werden vom Framework erstellt, aber Ihr Treiber kann auch Anforderungsobjekte erstellen.
Vom Framework erstellte Anforderungsobjekte
Wenn ein frameworkbasierter Treiber ein E/A-Anforderungspaket (IRP) vom E/A-Manager empfängt, fängt das Framework das IRP ab und erstellt ein Frameworkanforderungsobjekt. Das Framework platziert das Anforderungsobjekt in einer E/A-Warteschlange und ruft den entsprechenden Handler auf, wenn der Treiber über registrierte Anforderungshandler für die Warteschlange verfügt.
Das folgende Diagramm veranschaulicht die Schritte, die auftreten, wenn das Framework ein Anforderungsobjekt für einen Lesevorgang erstellt.
Die folgenden Schritte entsprechen den Zahlen im vorherigen Diagramm:
Eine Anwendung im Benutzermodus liest eine Datei, indem sie die Microsoft Win32-ReadFile-Funktion aufruft.
Die ReadFile-Funktion ruft den E/A-Manager auf, der im Kernelmodus ausgeführt wird.
Der E/A-Manager ordnet eine IRP-Struktur zu und speichert einen IRP_MJ_READ Funktionscode in der -Struktur.
Der E/A-Manager ruft die DispatchRead-Standardtreiberroutine für Treiber x auf und übergibt einen Zeiger auf die IRP-Struktur. Da treiber x ein frameworkbasierter Treiber ist, stellt das Framework die DispatchRead-Routine des Treibers bereit.
Das Framework erstellt ein Anforderungsobjekt, das die IRP-Struktur darstellt. Das Framework fügt das Anforderungsobjekt einem der Warteschlangenobjekte des Treibers hinzu.
Das Framework ruft den EvtIoRead-Anforderungshandler des Treibers auf und übergibt ein Warteschlangenobjekthandle und ein Anforderungsobjekthandle.
Von einem Treiber erstellte Anforderungsobjekte
Frameworkbasierte Treiber können auch Anforderungsobjekte erstellen. Beispielsweise kann ein Treiber Anforderungsobjekte erstellen, wenn er eine Lese- oder Schreibanforderung für eine Datenmenge empfängt, die größer ist als die E/A-Ziele des Treibers gleichzeitig verarbeiten können. In einer solchen Situation kann der Treiber die Daten in mehrere kleinere Anforderungen unterteilen und zusätzliche Anforderungsobjekte verwenden, um diese kleineren Anforderungen an ein oder mehrere E/A-Ziele zu senden.
Um ein Anforderungsobjekt zu erstellen, sollte Ihr Treiber WdfRequestCreate aufrufen, gefolgt von Frameworkobjektmethoden, die die Anforderung initialisieren, z. B. WdfUsbTargetPipeFormatRequestForRead.
Wenn ein Treiber WDM-IRPs in einer WDM-Dispatchroutine empfängt und diese dann mithilfe des Frameworks verwaltet oder weiterleitet, kann der Treiber WdfRequestCreateFromIrp aufrufen.