Weiterleiten von E/A-Anforderungen

Wenn ein Treiber eine E/A-Anforderung empfängt, die er nicht verarbeiten kann, führt er in der Regel eine der folgenden Aktionen aus:

  • Die empfangene Anforderung wird an einen anderen Treiber weitergeleitet.

  • Es erstellt zusätzliche Anforderungen und sendet sie an einen anderen Treiber.

Frameworkbasierte Treiber leiten Anforderungen mithilfe von E/A-Zielen weiter, die andere Treiber im System darstellen. Treiber können eine der folgenden Techniken verwenden, um eine Anforderung an ein E/A-Ziel weiterzuleiten:

  • Ein Treiber kann E/A-Anforderungen an den nächstniedrigen Treiber weiterleiten, indem er WdfDeviceGetIoTarget, gefolgt von WdfRequestFormatRequestUsingCurrentType und schließlich WdfRequestSend aufruft.

    Dieses Verfahren ist nur nützlich, wenn der Treiber eine Anforderung empfängt, die er vor der Weiterleitung nicht ändern muss.

  • Ein Treiber kann WdfFdoInitSetFilter aufrufen, um sich als Filtertreiber zu registrieren.

    Wenn ein Filtertreiber keine E/A-Warteschlange für einen bestimmten E/A-Anforderungstyp bereitstellt, leitet das Framework Anforderungen dieses Typs automatisch an den nächstniedrigen Treiber weiter.

  • In der Regel untersucht ein Funktionstreiber den Inhalt jeder E/A-Anforderung. Wenn ein Funktionstreiber eine Anforderung nicht verarbeiten kann, kann er die Anforderung ändern und an ein E/A-Ziel weiterleiten. Oder sie erstellt eine oder mehrere neue Anforderungen und sendet sie an ein E/A-Ziel.

    Das E/A-Zielobjekt des Frameworks definiert mehrere Methoden zum Senden von E/A-Anforderungen an andere Treiber. Beispielsweise kann ein Treiber WdfIoTargetFormatRequestForRead, gefolgt von WdfRequestSend aufrufen, um eine Leseanforderung an ein E/A-Ziel zu senden. Weitere Informationen zu E/A-Zielen finden Sie unter Verwenden von E/A-Zielen.

    In seltenen Fällen möchte ein Treiberautor den Inhalt des zugrunde liegenden WDM-E/A-Stapelspeicherorts einer Anforderung angeben, bevor er eine Anforderung an ein E/A-Ziel sendet. In diesen Fällen kann der Treiber WdfRequestWdmFormatUsingStackLocation aufrufen, bevor er WdfRequestSend aufruft.

Manchmal muss ein Treiber dieselbe Anforderung an mehrere E/A-Ziele senden, in der Regel, weil der Treiber einen einzigen Befehl an alle geräte senden muss. Vor dem Senden einer Anforderung an ein E/A-Ziel kann der Treiber WdfRequestChangeTarget aufrufen, um zu überprüfen, ob auf das E/A-Ziel zugegriffen werden kann.

Der Treiber muss schließlich jede Anforderung ausführen, die er an ein E/A-Ziel weiterleitet, es sei denn, er legt beim Aufrufen von WdfRequestSend das WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET-Flag fest.

Beachten Sie, dass das Framework, wenn ein Treiber eine Anforderung weiterleitet, das Framework-Anforderungsobjekt nicht buchstäblich vom sendenden Treiber an den empfangenden Treiber überträgt. Stattdessen erstellt das Framework ein neues Anforderungsobjekt im Treiber, das die Anforderung empfängt. Nur das der Anforderung zugrunde liegende E/A-Anforderungspaket (IRP) wird von einem Treiber auf einen anderen übertragen.