Konfigurieren des Versandmodus für eine E/A-Warteschlange
Warnung
UMDF 2 ist die neueste Version von UMDF und ersetzt UMDF 1. Alle neuen UMDF-Treiber sollten mit UMDF 2 geschrieben werden. UMDF 1 werden keine neuen Features hinzugefügt, und die Unterstützung für UMDF 1 für neuere Versionen von Windows 10 ist eingeschränkt. Universelle Windows-Treiber müssen UMDF 2 verwenden.
Die archivierten UMDF 1-Beispiele finden Sie im Windows 11, Version 22H2 – Mai 2022 Treiberbeispiele Update.
Weitere Informationen finden Sie unter Erste Schritte mit UMDF.
Wenn E/A-Anforderungen von Anwendungen eintreffen, platziert das Framework jede Anforderung in der entsprechenden E/A-Warteschlange. Wie und wann die Anforderungen an den Treiber übermittelt werden, hängt davon ab, wie der Treiber die Verteilung für die E/A-Warteschlange konfiguriert und wie der Treiber die Rückruffunktionssynchronisierung angibt. Die E/A-Warteschlange interagiert auch mit dem PnP- und Energieverwaltungssubsystem von UMDF, um E/A-Anforderungen in der Warteschlange zu halten, bis das Gerät den richtigen Zustand erreicht.
Hinweis Der Versandmodus für die E/A-Warteschlange hängt nicht mit dem Synchronisierungsmodus zusammen. Die Versandkonfiguration der E/A-Warteschlange steuert die Anzahl der Anforderungen, die der Treiber für die Verarbeitung zu einem bestimmten Zeitpunkt annehmen kann, während die Synchronisierung die gleichzeitige Ausführung von Ereignisrückruffunktionen steuert, die Anforderungen präsentieren oder abbrechen. Es werden jedoch mehrere Betriebsmodi erstellt, indem Versand- und Synchronisierungsmodi kombiniert werden.
Der Treiber konfiguriert die Verteilung für eine E/A-Warteschlange, wenn der Treiber die IWDFDevice::CreateIoQueue-Methode aufruft, um die Standardwarteschlange zu konfigurieren oder eine sekundäre Warteschlange zu erstellen. Der Treiber kann einen der Werte aus dem WDF_IO_QUEUE_DISPATCH_TYPE Enumerationstyp im DispatchType-Parameter von IWDFDevice::CreateIoQueue angeben, um den Verteilungsmodus zu identifizieren. Ein E/A-Warteschlangenobjekt kann die folgenden Verteilungsmodi unterstützen:
Sequenziell
Der sequenzielle Verteilmodus wird mit dem Wert WdfIoQueueDispatchSequential angegeben. In diesem Verteilmodus löst eine Warteschlange im Verarbeitungszustand Ereignisse aus, sodass ein Treiber nur jeweils eine Anforderung verarbeitet. Die Warteschlange verschiebt alle zusätzlichen Anforderungen, bis der Treiber die Verarbeitung seiner aktuellen Anforderung abgeschlossen hat, oder ruft die IWDFIoRequest::ForwardToIoQueue-Methode auf, um die Anforderung erneut zu queue. Wenn die aktuelle Anforderung abgeschlossen oder weitergeleitet wird, löst die Warteschlange ein Ereignis aus, um die nächste Anforderung bereitzustellen.
Parallel
Der parallele Versandmodus wird mithilfe des WdfIoQueueDispatchParallel-Werts angegeben. In diesem Versandmodus löst eine Warteschlange im Verarbeitungszustand Ereignisse aus, sobald E/A-Anforderungen für den Treiber bereit sind. Wenn der Treiber eine E/A-Anforderung empfängt, kann der Treiber die E/A-Anforderung auf eine der folgenden Arten verarbeiten:
- Der Treiber ruft entweder die IWDFIoRequest::Complete - oder IWDFIoRequest::CompleteWithInformation-Methode auf, um die E/A-Anforderung sofort abzuschließen. Ein Treiber schließt die E/A-Anforderung sofort ab, wenn die E/A-Anforderung ungültig ist, nicht gewartet werden kann oder durch Kopieren von Daten aus einem Puffer oder Cache abgeschlossen werden kann, der die Daten enthält.
- Der Treiber ruft die IWDFIoRequest::ForwardToIoQueue-Methode auf, um die E/A-Anforderung erneut zu stellen.
- Der Treiber ruft die IWDFIoRequest::Send-Methode auf, um die E/A-Anforderung an einen Treiber auf niedrigerer Ebene zu übergeben.
Manuell
Der manuelle Versandmodus wird mithilfe des WdfIoQueueDispatchManual-Werts angegeben. In diesem Versandmodus benachrichtigt die E/A-Warteschlange den Treiber nicht automatisch, wenn Anforderungen in der Warteschlange eintreffen. Der Treiber muss die IWDFIoQueue::RetrieveNextRequest-Methode aufrufen, um Anforderungen manuell aus der Warteschlange abzurufen. Dies ist ein Abfragemodell.
Wenn Ihr Treiber in UMDF-Versionen 1.9 und höher den manuellen Versandmodus verwendet, kann er IWDFIoRequest2::Requeue aufrufen, um eine E/A-Anforderung an den Kopf der E/A-Warteschlange zurückzugeben, aus der der Treiber sie abgerufen hat. Nach dem Aufrufen von IWDFIoRequest2::Requeue ruft der Treiber mit dem nächsten Aufruf von IWDFIoQueue::RetrieveNextRequest die requeuierte Anforderung ab.
Bei allen Versandmodi empfängt und verfolgt das E/A-Warteschlangenobjekt die Anforderung, bis der Treiber die Anforderung verarbeitet oder die Anforderung abgebrochen wird.
Wenn der Treiber die Warteschlange für die serielle oder parallele Verteilung konfiguriert, benachrichtigt das Framework den Treiber einer Anforderung über die Rückruffunktionen, die vom Treiber registriert werden, wenn der Treiber die Warteschlange erstellt oder die Standardwarteschlange konfiguriert. Weitere Informationen finden Sie unter Rückruffunktionen für E/A-Warteschlangenereignisse.