WdfRequestForwardToParentDeviceIoQueue-Funktion (wdfrequest.h)

[Gilt nur für KMDF]

Die WdfRequestForwardToParentDeviceIoQueue-Methode stellt eine E/A-Anforderung aus der E/A-Warteschlange eines untergeordneten Geräts erneut an eine angegebene E/A-Warteschlange des übergeordneten Geräts des untergeordneten Geräts.

Syntax

NTSTATUS WdfRequestForwardToParentDeviceIoQueue(
  [in] WDFREQUEST                   Request,
  [in] WDFQUEUE                     ParentDeviceQueue,
  [in] PWDF_REQUEST_FORWARD_OPTIONS ForwardOptions
);

Parameter

[in] Request

Ein Handle für ein Frameworkanforderungsobjekt.

[in] ParentDeviceQueue

Ein Handle für ein Framework-Warteschlangenobjekt.

[in] ForwardOptions

Ein Zeiger auf eine aufruferseitig zugeordnete WDF_REQUEST_FORWARD_OPTIONS-Struktur .

Rückgabewert

WdfRequestForwardToParentDeviceIoQueue gibt STATUS_SUCCESS zurück, wenn der Vorgang erfolgreich ist. Andernfalls gibt diese Methode möglicherweise einen der folgenden Werte zurück:

Rückgabecode Beschreibung
STATUS_INFO_LENGTH_MISMATCH
Die Größe der angegebenen WDF_REQUEST_FORWARD_OPTIONS-Struktur ist ungültig.
STATUS_INVALID_PARAMETER
Ein Member der angegebenen WDF_REQUEST_FORWARD_OPTIONS-Struktur enthält einen ungültigen Wert.
STATUS_INVALID_DEVICE_REQUEST
Dieser Wert wird zurückgegeben, wenn einer der folgenden Fehler auftritt:
  • Der Treiber hat die E/A-Anforderung nicht aus einer E/A-Warteschlange abgerufen.
  • Quell- und Ziel-E/A-Warteschlangen sind identisch.
  • Die angegebene E/A-Warteschlange gehört nicht zum übergeordneten Gerät.
  • Der Treiber hat einen garantierten Vorwärtsfortschritt aktiviert, und die angegebene E/A-Anforderung ist für Situationen mit geringem Arbeitsspeicher reserviert.
  • Der Treiber hat WdfPdoInitAllowForwardingRequestToParent nicht aufgerufen.
STATUS_WDF_BUSY
Die angegebene E/A-Warteschlange akzeptiert keine neuen Anforderungen.
 

Diese Methode gibt möglicherweise auch andere NTSTATUS-Werte zurück.

Eine Fehlerüberprüfung tritt auf, wenn der Treiber ein ungültiges Objekthandle bereitstellt.

Hinweise

Bevor ein Treiber WdfRequestForwardToParentDeviceIoQueue aufrufen kann, muss er WdfPdoInitAllowForwardingRequestToParent aufrufen.

Der Treiber muss dieselbe Methode für den Zugriff auf Datenpuffer (gepuffert, direkt oder nicht) für das übergeordnete Gerät und das untergeordnete Gerät verwenden.

Wenn Ihr Treiber WdfRequestForwardToParentDeviceIoQueue aufruft , um eine E/A-Anforderung erneut in die Warteschlange zu stellen, darf der Treiber das Anforderungsobjekt nicht als übergeordnetes Element anderer Frameworkobjekte verwenden, z. B. Timer- oder Arbeitselementobjekte.

Wenn Ihr Treiber WdfDeviceInitSetRequestAttributes aufgerufen hat, um den Kontextbereich für die Anforderungsobjekte des übergeordneten Geräts anzugeben, fügt das Framework diesen Kontextbereich nicht hinzu, um Objekte anzufordern, die der Treiber in der Warteschlange eines untergeordneten Geräts empfängt. Der Treiber kann WdfObjectAllocateContext aufrufen, um den Kontextbereich zu einem Anforderungsobjekt hinzuzufügen, bevor der Treiber WdfRequestForwardToParentDeviceIoQueue aufruft. Wenn der Treiber dagegen WdfDeviceInitSetRequestAttributes für die Anforderungsobjekte des untergeordneten Geräts aufgerufen hat und die Anforderungsobjekte des übergeordneten Geräts einen Kontextraum verwenden, der dem Kontextbereich des untergeordneten Geräts entspricht oder kleiner ist, kann der Treiber den Kontextbereich des Anforderungsobjekts verwenden, ohne WdfObjectAllocateContext aufzurufen.

Derzeit muss der Treiber die Option "Senden und Vergessen " für alle erneut in die Warteschlange gestellten E/A-Anforderungen verwenden. Beachten Sie daher, dass das Framework bis zum Löschen eines erneut in die Warteschlange gestellten Anforderungsobjekts möglicherweise bereits das untergeordnete Gerät entfernt hat, das das Anforderungsobjekt ursprünglich empfangen hat. Daher darf der Treiber die EvtCleanupCallback - oder EvtDestroyCallback-Funktion eines erneut in die Warteschlange gestellten Anforderungsobjekts nicht verwenden, um auf untergeordnete Geräteressourcen zuzugreifen, da die Ressourcen möglicherweise entfernt werden, bevor die EvtCleanupCallback - oder EvtDestroyCallback-Funktion ausgeführt wird.

Weitere Informationen zu WdfRequestForwardToParentDeviceIoQueue finden Sie unter Wiederherstellen von E/A-Anforderungen.

Beispiele

Im folgenden Codebeispiel wird zunächst das übergeordnete Gerät eines Geräts bestimmt, das eine E/A-Anforderung empfangen hat, und dann wird die E/A-Anforderung erneut an die Standard-E/A-Warteschlange des übergeordneten Geräts quediert.

WDFDEVICE device, parentDevice;
WDF_REQUEST_FORWARD_OPTIONS forwardOptions;
NTSTATUS status;

device = WdfIoQueueGetDevice(WdfRequestGetIoQueue(Request));
parentDevice = WdfPdoGetParent(device);

WDF_REQUEST_FORWARD_OPTIONS_INIT(&forwardOptions);
status = WdfRequestForwardToParentDeviceIoQueue(
             Request,
             WdfDeviceGetDefaultQueue(parentDevice),
             &forwardOptions
             );
if (!NT_SUCCESS(status)) {
    WdfRequestComplete(
                       Request,
                       status
                       );
  }

Anforderungen

Anforderung Wert
Zielplattform Universell
KMDF-Mindestversion 1.9
Kopfzeile wdfrequest.h (include Wdf.h)
Bibliothek Wdf01000.sys (siehe Versionsverwaltung der Frameworkbibliothek).)
IRQL <=DISPATCH_LEVEL
DDI-Complianceregeln DriverCreate(kmdf)

Weitere Informationen

WdfPdoInitAllowForwardingRequestToParent