Versandmethoden für E/A-Anforderungen

Wenn ein Treiber WdfIoQueueCreate aufruft, um eine E/A-Warteschlange zu erstellen, gibt er eine Verteilungsmethode für die Warteschlange an. Das Framework stellt drei Verteilungsmethoden bereit: sequenzielle, parallele und manuelle. Der Treiber kann jede dieser Verteilungsmethoden für jede E/A-Warteschlange angeben, einschließlich der Standard-E/A-Warteschlange eines Geräts.

Der Treiber legt die Verteilmethode einer Warteschlange fest, indem er einen WDF_IO_QUEUE_DISPATCH_TYPE typisierten Wert in der WDF_IO_QUEUE_CONFIG-Struktur der Warteschlange angibt.

Beispiel für die Verwendung jeder Verteilmethode finden Sie unter Beispielverwendungen von E/A-Warteschlangen.

Sequenzielle Verteiler

Wenn Ihr Treiber oder Gerät jeweils nur eine E/A-Anforderung aus einer Warteschlange verarbeiten kann, sollten Sie die E/A-Warteschlangen des Geräts so einrichten, dass die sequenzielle Versendung verwendet wird, was auch als synchrone Verteilung bezeichnet wird. Bei dieser Art der Verteilung übermittelt das Framework Anforderungen nacheinander an den Treiber. Das Framework übermittelt die nächste Anforderung erst, wenn der Treiber die vorherige Anforderung abgeschlossen, abgebrochen oder erneut aus der Warteschlange löscht .

Nachdem das Framework eine Anforderung an einen der Anforderungshandler des Treibers übermittelt hat, verarbeitet der Treiber die Anforderung. Wenn der Treiber die Anforderung an ein allgemeines E/A-Ziel weiterleitet, ruft er in der Regel eine der synchronen Methoden des E/A-Zielobjekts auf. Weitere Informationen zu diesen Methoden finden Sie unter Synchrones Senden von E/A-Anforderungen. Der Treiber muss schließlich jede Anforderung abschließen oder abbrechen , die er von einer E/A-Warteschlange empfängt.

Ein Treiber, der eine E/A-Warteschlange für die sequenzielle Versendung eingerichtet hat, kann WdfIoQueueRetrieveNextRequest oder WdfIoQueueRetrieveRequestByFileObject aufrufen, um eine weitere Anforderung aus der Warteschlange abzurufen, bevor die letzte empfangene Anforderung abgeschlossen oder abgebrochen wurde. Sie können dies in einem Funktionstreiber tun, damit der Treiber den nächsten Hardwarevorgang starten kann, während die Rückruffunktion EvtInterruptDpc des Treibers weiterhin Daten aus dem vorherigen Hardwarevorgang verarbeitet.

Wenn Sie mehrere E/A-Warteschlangen erstellen und alle für die sequenzielle Versendung einrichten, sendet das Framework Anforderungen aus jeder Warteschlange sequenziell, aber die Warteschlangen werden parallel ausgeführt. Wenn Ihr Treiber oder Gerät nur eine Anforderung eines beliebigen Typs verarbeiten kann, müssen Sie eine einzelne E/A-Warteschlange mit einer EvtIoDefault-Rückruffunktion verwenden.

Parallele Versendung

Wenn Ihr Treiber und Ihr Gerät mehrere E/A-Anforderungen gleichzeitig verarbeiten können, können Sie die E/A-Warteschlangen des Geräts so einrichten, dass sie die parallele Verteilung verwenden, damit der Treiber die Anforderungen asynchron verarbeiten kann. Diese Verteilmethode wird auch als asynchrone Verteilung bezeichnet.

Wenn ein Treiber eine E/A-Warteschlange für die Verwendung der parallelen Verteilung einrichtt, übermittelt das Framework E/A-Anforderungen an den Treiber, sobald sie in der Warteschlange verfügbar sind. Das Ergebnis ist, dass der Treiber möglicherweise mehrere Anforderungen gleichzeitig verarbeiten muss.

Jedes Mal, wenn einer der Anforderungshandler des Treibers eine Anforderung empfängt , muss der Treiber die Anforderung verarbeiten und dann die Anforderung abschließen . Wenn der Treiber die Anforderung an ein allgemeines E/A-Ziel weiterleitet, ruft er in der Regel eine der asynchronen Methoden des E/A-Zielobjekts auf. Weitere Informationen zu diesen Methoden finden Sie unter Asynchrones Senden von E/A-Anforderungen. Der Treiber muss schließlich jede Anforderung abschließen oder abbrechen , die er von einer E/A-Warteschlange empfängt.

Ein Treiber, der parallele Verteilung verwendet, kann WdfIoQueueStop oder WdfIoQueueStopSynchronously aufrufen, um eine Warteschlange vorübergehend zu beenden, und dann WdfIoQueueStart aufrufen, um die Warteschlange neu zu starten.

Manuelle Versendung

Wenn Ihr Treiber die vollständige Kontrolle über die Übermittlung von E/A-Anforderungen haben soll, können Sie die E/A-Warteschlange eines Geräts so einrichten, dass die manuelle Verteilung verwendet wird. Dies bedeutet, dass das Framework keine Anforderungen an den Treiber übermittelt, es sei denn, der Treiber fragt explizit nach einer Anforderung.

Um eine Anforderung aus einer manuellen Warteschlange abzurufen, kann der Treiber WdfIoQueueRetrieveNextRequest oder WdfIoQueueRetrieveRequestByFileObject in einer Schleife aufrufen, die die Warteschlange abruft. Alternativ kann der Treiber WdfIoQueueReadyNotify aufrufen, um eine Rückruffunktion zu registrieren, die vom Framework aufgerufen wird, wenn eine oder mehrere Anforderungen in der Warteschlange verfügbar sind. Nachdem das Framework die Rückruffunktion aufgerufen hat, kann der Treiber WdfIoQueueRetrieveNextRequest oder WdfIoQueueRetrieveRequestByFileObject in einer Schleife aufrufen, um die Anforderungen abzurufen.

Nachdem der Treiber eine Anforderung aus der Warteschlange abgerufen hat, muss er die Anforderung verarbeiten. Der Treiber muss schließlich jede Anforderung abschließen oder abbrechen .