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 |
---|---|
|
Die Größe der angegebenen WDF_REQUEST_FORWARD_OPTIONS-Struktur ist ungültig. |
|
Ein Member der angegebenen WDF_REQUEST_FORWARD_OPTIONS-Struktur enthält einen ungültigen Wert. |
|
Dieser Wert wird zurückgegeben, wenn einer der folgenden Fehler auftritt:
|
|
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) |