WdfDeviceEnqueueRequest-Funktion (wdfdevice.h)
[Gilt nur für KMDF]
Die WdfDeviceEnqueueRequest-Methode übermittelt eine angegebene E/A-Anforderung an das Framework, sodass das Framework die Anforderung anschließend einer der E/A-Warteschlangen hinzufügen kann, die der Treiber für das angegebene Gerät erstellt hat.
Syntax
NTSTATUS WdfDeviceEnqueueRequest(
[in] WDFDEVICE Device,
[in] WDFREQUEST Request
);
Parameter
[in] Device
Ein Handle für ein Framework-Geräteobjekt.
[in] Request
Ein Handle für ein Frameworkanforderungsobjekt.
Rückgabewert
Wenn der Vorgang erfolgreich ist, gibt die Methode STATUS_SUCCESS zurück. Weitere Rückgabewerte sind:
Rückgabecode | Beschreibung |
---|---|
|
Die Menge des verfügbaren Arbeitsspeichers ist gering. |
|
Der Treiber hat keine E/A-Warteschlangen für das Gerät erstellt, und der Treiber ist kein Filtertreiber. |
|
Die E/A-Warteschlange des Geräts akzeptiert keine Anforderungen. |
Die -Methode gibt möglicherweise andere NTSTATUS-Werte zurück.
Eine Fehlerüberprüfung tritt auf, wenn der Treiber ein ungültiges Objekthandle bereitstellt.
Hinweise
Ihr Treiber kann WdfDeviceEnqueueRequest nur über eine EvtIoInCallerContext-Rückruffunktion aufrufen.
Die WdfDeviceEnqueueRequest-Methode fügt die Anforderung der anforderungstypspezifischen E/A-Warteschlange des Treibers für das Gerät hinzu, sofern der Treiber eine solche erstellt hat. Andernfalls fügt die -Methode die Anforderung der Standardwarteschlange des Geräts hinzu, wenn der Treiber eine erstellt hat.
Wenn der Treiber keine E/A-Warteschlangen für das Gerät erstellt hat, führt WdfDeviceEnqueueRequest folgendes aus:
- Wenn der Treiber ein Filtertreiber ist, sendet WdfDeviceEnqueueRequest die Anforderung an das E/A-Ziel des Treibers.
- Wenn der Treiber kein Filtertreiber ist, gibt WdfDeviceEnqueueRequest STATUS_INVALID_DEVICE_REQUEST zurück.
Wenn der Treiber daher die Anforderung oder ihren Kontext nach dem Aufrufen von WdfDeviceEnqueueRequest verwenden muss, sollte er vor dem Aufrufen von WdfDeviceEnqueueRequest einen Verweis auf die Anforderung benötigen.
Dazu kann der Treiber WdfObjectReference vor und dann WdfObjectDereference nach dem Aufruf von WdfDeviceEnqueueRequest aufrufen. Der Treiber muss die Anforderung ableiten, bevor EvtIoInCallerContext beendet wird.
Weitere Informationen zur WdfDeviceEnqueueRequest-Methode finden Sie unter Verwalten von E/A-Warteschlangen.
Für die Versionen 1.0 und 1.5 von KMDF muss WdfDeviceEnqueueRequest unter PASSIVE_LEVEL aufgerufen werden. Ab Version 1.7 kann WdfDeviceEnqueueRequest unter IRQL <= DISPATCH_LEVEL aufgerufen werden.
Beispiele
Das folgende Codebeispiel ist eine EvtIoInCallerContext-Rückruffunktion , die nach Anforderungen sucht, die den benutzerdefinierten E/A-Steuerungscode enthalten, IOCTL_NONPNP_METHOD_NEITHER. Wenn der E/A-Steuerelementcode nicht gefunden wird, gibt die Rückruffunktion einfach die Anforderung an das Framework zurück. Wenn die Rückruffunktion den E/A-Steuerelementcode findet, verarbeitet sie die Anforderung vor und gibt ihn dann an das Framework zurück. Wenn ein Fehler auftritt, schließt die Rückruffunktion die Anforderung ab.
VOID
MyEvtDeviceIoInCallerContext(
IN WDFDEVICE Device,
IN WDFREQUEST Request
)
{
NTSTATUS status = STATUS_SUCCESS;
WDF_REQUEST_PARAMETERS params;
WDF_REQUEST_PARAMETERS_INIT(¶ms);
WdfRequestGetParameters(
Request,
¶ms
);
if(!(params.Type == WdfRequestTypeDeviceControl &&
params.Parameters.DeviceIoControl.IoControlCode == IOCTL_NONPNP_METHOD_NEITHER)) {
status = WdfDeviceEnqueueRequest(
Device,
Request
);
if(!NT_SUCCESS(status)) {
goto End;
}
return;
}
//
// Found a match for the control code. Preprocess the request, and then
// return the request to the framework.
//
//...(Preprocess the request here.)
status = WdfDeviceEnqueueRequest(
Device,
Request
);
if(!NT_SUCCESS(status)) {
goto End;
}
return;
End:
WdfRequestComplete(
Request,
status
);
return;
}
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform | Universell |
KMDF-Mindestversion | 1.0 |
Kopfzeile | wdfdevice.h (einschließen von Wdf.h) |
Bibliothek | Wdf01000.sys (siehe Versionierung der Frameworkbibliothek.) |
IRQL | <= DISPATCH_LEVEL (Siehe Abschnitt "Hinweise") |
DDI-Complianceregeln | DeferredRequestCompleted(kmdf), DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestCompleted(kmdf), RequestCompletedLocal(kmdf) |