Verwalten von E/A-Warteschlangen

Starten einer E/A-Warteschlange

Wenn ein Treiber WdfIoQueueCreate aufruft, um eine E/A-Warteschlange zu erstellen, ermöglicht das Framework der Warteschlange automatisch, E/A-Anforderungen zu empfangen und an einen Treiber zu übermitteln.

Treiber rufen in der Regel WdfIoQueueCreate aus einer EvtDriverDeviceAdd-Rückruffunktion auf. Das Framework kann mit der Übermittlung von E/A-Anforderungen an den Treiber beginnen, nachdem die Rückruffunktion EvtDriverDeviceAdd des Treibers zurückgegeben wird.

Wenn Ihr Treiber stromverwaltete E/A-Warteschlangen verwendet, kann das Framework nicht mit der Übermittlung von Anforderungen an Ihren Treiber beginnen, bis das Gerät seinen Arbeitsstatus erreicht und das Framework die EvtDeviceD0Entry-Rückruffunktion des Treibers aufgerufen hat.

Beenden und Neustarten einer E/A-Warteschlange

Ihr Treiber kann WdfIoQueueStop oder WdfIoQueueStopSynchronously aufrufen, um vorübergehend zu verhindern, dass das Framework E/A-Anforderungen aus einer E/A-Warteschlange liefert. Um die Übermittlung von E/A-Anforderungen fortzusetzen, ruft der Treiber WdfIoQueueStart auf.

Wenn Ihr Treiber stromverwaltete E/A-Warteschlangen verwendet, beendet das Framework automatisch die Warteschlangen eines Geräts, wenn das Gerät seinen Arbeitszustand (D0) verlässt, und das Framework startet die Warteschlangen neu, wenn der Gerätestatus zu D0 zurückkehrt.

Hinzufügen von Anforderungen zu einer E/A-Warteschlange

Wenn das System eine Lese-, Schreib- oder Geräte-E/A-Steuerungsanforderung an einen Treiber sendet, platziert das Framework die Anforderung in einer E/A-Warteschlange. Der Treiber kann die Typen von Anforderungen steuern, die das Framework in jeder Warteschlange speichert, indem er WdfDeviceConfigureRequestDispatching aufruft.

Ein Treiber kann auch Anforderungen, die er vom Framework empfangen hat, erneut wiederherstellen, indem er WdfRequestForwardToIoQueue aufruft.

Abrufen von Anforderungen aus einer E/A-Warteschlange

Wenn ein Treiber die sequenzielle oder parallele Verteilungsmethode für eine E/A-Warteschlange angibt, empfängt er Anforderungen in Anforderungshandlern.

Wenn ein Treiber die manuelle oder sequenzielle Verteilmethode angibt, kann er Anforderungen abrufen, indem er WdfIoQueueRetrieveNextRequest oder WdfIoQueueRetrieveRequestByFileObject aufruft.

Suchen nach einer E/A-Anforderung

Wenn ein Treiber die manuelle Verteilmethode für eine E/A-Warteschlange angibt, kann er mit den folgenden Schritten nach bestimmten Anforderungen in der Warteschlange suchen:

  1. Rufen Sie WdfIoQueueFindRequest auf, um nach einer Anforderung zu suchen, die den vom Treiber angegebenen Kriterien entspricht.

  2. Rufen Sie WdfIoQueueRetrieveFoundRequest auf, um die Anforderung abzurufen, die WdfIoQueueFindRequest gefunden hat.

Bereinigen oder Entladen einer E/A-Warteschlange

Das Bereinigen einer E/A-Warteschlange bedeutet, das Einfügen von E/A-Anforderungen in die Warteschlange zu beenden und alle Anforderungen abzubrechen, die sich bereits in der Warteschlange befinden.

Das Entladen einer E/A-Warteschlange bedeutet, das Einfügen von E/A-Anforderungen in die Warteschlange zu beenden, während alle Anforderungen, die sich bereits in der Warteschlange befinden, an den Treiber übermittelt werden können.

Treiber bereinigen oder entladen ihre Warteschlangen in der Regel nur, wenn die Warteschlangen nicht energieverwaltet sind. Für energieverwaltete E/A-Warteschlangen können Treiber Die Rückruffunktionen EvtIoStop und EvtIoResume bereitstellen.

Wenn einige Warteschlangen Ihres Treibers nicht mit Energie verwaltet werden, sollten Sie eine Warteschlange bereinigen oder entladen, wenn das zugehörige Gerät oder der E/A-Kanal nicht mehr verfügbar ist. In der Regel bereinigen Sie eine Warteschlange, anstatt eine Warteschlange zu leeren, es sei denn, es besteht eine hohe Wahrscheinlichkeit, dass jede Anforderung sehr wichtige Informationen enthält. Beispielsweise kann ein Treiber für ein Netzwerkgerät seine Warteschlangen bereinigen, während ein Treiber für ein Speichergerät seine Warteschlangen wahrscheinlich leert.

Wenn Ihr Treiber eine E/A-Warteschlange bereinigen oder entladen soll, kann der Treiber eine der folgenden Warteschlangenobjektmethoden aufrufen:

Seien Sie vorsichtig, wenn Sie WdfIoQueueDrain und WdfIoQueueDrainSynchronously aufrufen. Da ein Ablaufvorgang auf den Abschluss von Anforderungen wartet, sollten Sie eine Warteschlange nur entleeren, wenn Sie sicher sind, dass die ausstehenden Anforderungen der Warteschlange rechtzeitig abgeschlossen werden. Wenn Sie nicht wissen, wie lange E/A-Anforderungen bis zum Abschluss dauern und es akzeptabel ist, ausstehende Anforderungen abzubrechen, sollten Sie die Warteschlange bereinigen.

Verschieben von Anforderungen aus einer E/A-Warteschlange in eine andere

Nachdem Ihr Treiber eine E/A-Anforderung erhalten hat, können Sie möchten, dass der Treiber die Anforderung in eine andere E/A-Warteschlange zurückgibt. Hierzu ruft der Treiber WdfRequestForwardToIoQueue oder WdfRequestForwardToParentDeviceIoQueue auf, wodurch die Anforderung dem Ende einer angegebenen Warteschlange hinzugefügt wird. Schließlich übermittelt das Framework die Anforderung mithilfe der Verteilmethode der angegebenen Warteschlange erneut an den Treiber. Weitere Informationen zum Verschieben von E/A-Anforderungen von einer E/A-Warteschlange in eine andere finden Sie unter Erneutes Zurückstellen von E/A-Anforderungen.

Abfangen einer E/A-Anforderung, bevor sie in die Warteschlange gestellt wird

Es ist möglich, dass ein Treiber eine E/A-Anforderung abfangen kann, bevor das Framework die Anforderung in einer E/A-Warteschlange platziert. Um E/A-Anforderungen abzufangen, muss der Treiber WdfDeviceInitSetIoInCallerContextCallback aufrufen, um eine EvtIoInCallerContext-Rückruffunktion zu registrieren.

Das Framework ordnet die Rückruffunktion EvtIoInCallerContext einem Gerät zu. Daher ruft das Framework die Rückruffunktion EvtIoInCallerContext jedes Mal auf, wenn es eine Anforderung empfängt, die das System an das Gerät sendet.

Wenn eine EvtIoInCallerContext-Rückruffunktion eine Anforderung empfängt , führt sie in der Regel eine vorläufige Verarbeitung für die Anforderung durch. Als Nächstes ruft die Rückruffunktion WdfDeviceEnqueueRequest auf, wodurch die Anforderung an das Framework zurückgibt. Das Framework kann die Anforderung dann in der richtigen E/A-Warteschlange platzieren, genau wie es wäre, wenn es die Rückruffunktion EvtIoInCallerContext nicht aufgerufen hätte.

Der Hauptgrund dafür, dass ein Treiber eine EvtIoInCallerContext-Rückruffunktion bereitstellt, ist, dass der Treiber E/A-Vorgänge verarbeiten muss, die die E/A-Methode weder gepuffert noch direkte E/A unterstützen. Für diese E/A-Methode muss der Treiber auf empfangene Puffer im Prozesskontext des Absenders der E/A-Anforderung zugreifen. Weitere Informationen finden Sie unter Zugreifen auf Datenpuffer in Framework-Based Treibern.

Abrufen von E/A-Warteschlangeneigenschaften

Um Eigenschaften eines Frameworkwarteschlangenobjekts abzurufen, kann der Treiber die folgenden Methoden aufrufen: