E/A-Anforderungen erneut in die Warteschlange stellen
Treiber können E/A-Anforderungen, die sie aus einer E/A-Warteschlange erhalten, erneut in die Warteschlange stellen. Ein Treiber kann eine E/A-Anforderung erneut an eine andere E/A-Warteschlange stellen, die der Treiber für dasselbe Gerät erstellt hat. Darüber hinaus kann ein Bustreiber eine E/A-Anforderung aus der E/A-Warteschlange eines untergeordneten Geräts in die E/A-Warteschlange eines übergeordneten Geräts wiederherstellen.
Erneutes Warteschlangen einer E/A-Anforderung an eine andere E/A-Warteschlange für ein Gerät
Nachdem die Anforderungshandler eines Treibers eine E/A-Anforderung aus der E/A-Warteschlange eines Treibers empfangen haben, kann der Treiber WdfRequestForwardToIoQueue aufrufen, um die Anforderung erneut in eine andere Warteschlange zu stellen.
Wenn Ihr Treiber beispielsweise Ressourcen vor der Verarbeitung der Anforderung einer Anforderung zuordnen soll, kann die EvtIoDefault-Rückruffunktion des Treibers alle Anforderungen empfangen, Ressourceninformationen im Kontextspeicher jeder Anforderung speichern und dann WdfRequestForwardToIoQueue aufrufen, um jede Anforderung erneut in eine zusätzliche Warteschlange zu stellen.
Wenn Ihr Treiber WdfRequestForwardToIoQueue aufruft, um eine E/A-Anforderung erneut in die Warteschlange zu stellen, die der Treiber aus einer E/A-Warteschlange abgerufen hat, die die sequenzielle Verteilmethode verwendet, übermittelt das Framework die nächste E/A-Anforderung aus der sequenziellen Warteschlange an den Treiber, ohne auf den Abschluss der erneut stehenden Anforderung zu warten.
Wenn Ihr Treiber die manuelle Verteilermethode verwendet, kann er die WdfRequestRequeue-Methode 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 WdfRequestRequeue ruft der nächste Aufruf des Treibers von WdfIoQueueRetrieveNextRequest die erneut in die Warteschlange eingereihte Anforderung ab.
Erneutes Queuieren einer E/A-Anforderung in die E/A-Warteschlange eines übergeordneten Geräts
Ein Funktionstreiber für ein übergeordnetes Gerät kann als Bustreiber fungieren, der die untergeordneten Geräte des übergeordneten Geräts aufzählt und physische Geräteobjekte (PDOs ) für die untergeordneten Geräte erstellt. Solche Treiber können manchmal E/A-Anforderungen für ein untergeordnetes Gerät empfangen, das das übergeordnete Gerät verarbeiten muss.
Beispielsweise steuert ein Protokollbus (z. B. USB) in der Regel die Hardwareressourcen, die jedem verbundenen Gerät zugewiesen sind. Daher verarbeitet der Funktionstreiber für den übergeordneten Bus in der Regel E/A-Vorgänge für jedes untergeordnete Gerät. Wenn der E/A-Manager eine E/A-Anforderung an den Gerätestapel eines der untergeordneten Geräte sendet, empfängt der Funktionstreiber für den Bus die E/A-Anforderung in einer der E/A-Warteschlangen des untergeordneten Geräts, da dieser Treiber die PDO des untergeordneten Geräts erstellt hat. Bevor der Treiber die E/A-Anforderung im Kontext des übergeordneten Busgeräts verarbeiten kann, muss er die E/A-Anforderung aus der E/A-Warteschlange des untergeordneten Geräts in eine E/A-Warteschlange zurückstellen, die zum übergeordneten Gerät gehört.
Treiber können jedoch WdfRequestForwardToIoQueue nicht aufrufen, um Anforderungen aus der Warteschlange eines untergeordneten Elements in die Warteschlange eines übergeordneten Elements zu verschieben. Da der E/A-Manager separate Gerätestapel für die übergeordneten und untergeordneten Geräte erstellt, muss das zugrunde liegende WDM-Geräteobjekt zuerst von einem, das das untergeordnete Gerät darstellt, in eins geändert werden, das das übergeordnete Gerät darstellt.
Vor Version 1.9 von KMDF konnten Treiber E/A-Anforderungen von einem untergeordneten Gerät nur an das übergeordnete Gerät senden, indem sie Remote-E/A-Ziele erstellen, die Größe des Gerätestapels des untergeordneten Geräts erhöhen und das richtige WDM-Geräteobjekt angeben.
Ab KMDF-Version 1.9 kann ein Treiber WdfPdoInitAllowForwardingRequestToParent aufrufen, bevor er ein untergeordnetes Gerät erstellt, und dann WdfRequestForwardToParentDeviceIoQueue aufrufen, um eine Anforderung aus der E/A-Warteschlange des untergeordneten Elements erneut in eine übergeordnete Warteschlange zu stellen. Wenn ein TreiberWdfPdoInitAllowForwardingRequestToParent und WdfRequestForwardToParentDeviceIoQueue verwendet, erhöht das Framework die Größe des untergeordneten Gerätestapels und weist der E/A-Anforderung das richtige WDM-Geräteobjekt zu.