Erstellen von E/A-Warteschlangen
Frameworkwarteschlangenobjekte stellen E/A-Warteschlangen dar, bei denen es sich um Container für die E/A-Anforderungen handelt, die ein Treiber empfängt. Jeder Treiber kann eine oder mehrere E/A-Warteschlangen für jedes Gerät erstellen. Das Framework-Warteschlangenobjekt definiert eine Reihe von Ereignisrückruffunktionen , die der Treiber bereitstellen kann, und eine Reihe von Objektmethoden, die der Treiber aufrufen kann.
Wenn das Framework eine E/A-Anforderung empfängt, die an eines der Geräte des Treibers weitergeleitet wird, platziert das Framework die Anforderung in der entsprechenden E/A-Warteschlange. Wenn Ihr Treiber einen oder mehrere Anforderungshandler registriert, kann das Framework Ihren Treiber jedes Mal benachrichtigen, wenn eine E/A-Anforderung verfügbar ist. Alternativ kann Ihr Treiber die E/A-Warteschlange auf Anforderungen abfragen.
Die meisten Treiber erstellen E/A-Warteschlangen in ihrer Rückruffunktion EvtDriverDeviceAdd . Um eine E/A-Warteschlange für ein Gerät zu erstellen, ruft der Treiber die WdfIoQueueCreate-Methode des Framework-Warteschlangenobjekts auf (die ein Framework-Warteschlangenobjekt erstellt). Der Treiber stellt der -Methode eine WDF_IO_QUEUE_CONFIG-Struktur bereit. Diese Struktur enthält Konfigurationsinformationen zur Warteschlange, z. B. die Verteilmethode der Warteschlange und Zeiger auf Anforderungshandler , die das Framework aufruft, wenn Anforderungen in der Warteschlange verfügbar sind. Die Struktur gibt auch an, ob die Warteschlange energieverwaltet wird und ob der Treiber Puffer der Länge null für die E/A-Anforderungen der Warteschlange unterstützt.
Wenn der Treiber das DefaultQueue-Element der WDF_IO_QUEUE_CONFIG-Struktur auf TRUE festlegt, wird die Warteschlange zur Standard-E/A-Warteschlange des Geräts. Wenn Ihr Treiber eine Standard-E/A-Warteschlange erstellt, platziert das Framework alle E/A-Anforderungen des Geräts in dieser Warteschlange, es sei denn, Sie erstellen zusätzliche Warteschlangen zum Empfangen einiger Anforderungen. Ein Treiber kann ein Handle für die Standard-E/A-Warteschlange eines Geräts abrufen, indem er die WdfDeviceGetDefaultQueue-Methode aufruft.
Wenn Sie mehrere E/A-Warteschlange für ein Gerät verwenden möchten, kann der Treiber WdfIoQueueCreate aufrufen, um so viele Warteschlangenobjekte zu erstellen, wie Sie benötigen. Wenn ein Treiber mehrere Warteschlangen erstellt, kann er WdfDeviceConfigureRequestDispatching aufrufen, wodurch das Framework angewiesen wird, verschiedene Arten von Anforderungen an verschiedene Warteschlangen weiterzuleiten. Sie können beispielsweise angeben, dass alle Leseanforderungen an eine Warteschlange übermittelt werden und alle Schreibanforderungen an eine andere Warteschlange übermittelt werden.
Wenn Ihr Treiber eine Reihe von E/A-Warteschlangen erstellt und WdfDeviceConfigureRequestDispatching aufruft , um jeden Anforderungstyp, den Ihr Treiber empfangen kann, an eine bestimmte Warteschlange zu leiten, benötigt der Treiber keine Standardwarteschlange.
Wenn ein Treiber keine E/A-Warteschlange für Anforderungen eines bestimmten Typs bereitstellt und ihr Treiber ein Funktionstreiber ist, führt das Framework Anforderungen dieses Typs mit einer Vervollständigung status Wert von STATUS_INVALID_DEVICE_REQUEST aus. Wenn Ihr Treiber ein Filtertreiber ist und WdfFdoInitSetFilter aufgerufen hat, leitet das Framework diese Anforderungen automatisch an den nächstniedrigen Treiber im Treiberstapel weiter. So muss beispielsweise ein Filtertreiber, der keine Leseanforderungen verarbeitet, keine E/A-Warteschlange bereitstellen, die Leseanforderungen empfängt.
Beispiele dafür, wie Treiber E/A-Warteschlangen verwenden können, finden Sie unter Beispielverwendungen von E/A-Warteschlangen.