WdfDeviceEnqueueRequest-Funktion (wdfdevice.h)
[Gilt nur für KMDF]
Die WdfDeviceEnqueueRequest--Methode liefert 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 zu einem Framework-Geräteobjekt.
[in] Request
Ein Handle zu einem Framework-Anforderungsobjekt.
Rückgabewert
Wenn der Vorgang erfolgreich ist, gibt die Methode STATUS_SUCCESS zurück. Weitere Rückgabewerte sind:
Rückgabecode | Beschreibung |
---|---|
|
Die verfügbare Arbeitsspeichermenge 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-Wertezurück.
Wenn der Treiber ein ungültiges Objekthandle bereitstellt, tritt eine Fehlerüberprüfung auf.
Bemerkungen
Ihr Treiber kann WdfDeviceEnqueueRequest nur von einer EvtIoInCallerContext- Rückruffunktion aufrufen.
Die WdfDeviceEnqueueRequest Methode fügt die Anforderung der anforderungsspezifischen E/A-Warteschlange des Treibers für das Gerät hinzu, wenn der Treiber eine erstellt hat. Andernfalls fügt die Methode die Anforderung zur Standardwarteschlange des Geräts hinzu, wenn der Treiber einen erstellt hat.
Wenn der Treiber keine E/A-Warteschlangen für das Gerät erstellt hat, führt WdfDeviceEnqueueRequest die folgenden Aktionen 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 die Anforderung oder den Kontext nach dem Aufrufen WdfDeviceEnqueueRequestverwenden muss, sollte er vor dem Aufrufen WdfDeviceEnqueueRequesteinen Verweis auf die Anforderung benötigen.
Dazu kann der Treiber WdfObjectReference- vor und dann WdfObjectDereference nach dem Aufruf von WdfDeviceEnqueueRequestaufrufen. Der Treiber muss die Anforderung ableiten, bevor EvtIoInCallerContextbeendet wird.
Weitere Informationen zur WdfDeviceEnqueueRequest--Methode finden Sie unter Managing I/O Queues.
Für die Versionen 1.0 und 1.5 von KMDF müssen WdfDeviceEnqueueRequest- bei PASSIVE_LEVEL aufgerufen werden. Für Versionen 1.7 und höher können WdfDeviceEnqueueRequest- bei IRQL <= DISPATCH_LEVEL aufgerufen werden.
Beispiele
Das folgende Codebeispiel ist eine EvtIoInCallerContext Rückruffunktion, die nach Anforderungen sucht, die den benutzerdefinierten E/A-Steuerelementcode 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 sie 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- | Universal |
Minimale KMDF-Version | 1.0 |
Header- | wdfdevice.h (einschließen Wdf.h) |
Library | Wdf01000.sys (siehe Framework-Bibliotheksversionsverwaltung.) |
IRQL- | <= DISPATCH_LEVEL (Abschnitt "Hinweise") |
DDI-Complianceregeln | DeferredRequestCompleted(kmdf), DriverCreate(kmdf), KmdfIrql(kmdf), Kmdf, KmdfIrqlExplicit(kmdf), RequestCompleted(kmdf), RequestCompletedLocal(kmdf) |