Función WdfDeviceEnqueueRequest (wdfdevice.h)
[Solo se aplica a KMDF]
El método WdfDeviceEnqueueRequest entrega una solicitud de E/S especificada al marco, de modo que el marco pueda agregar posteriormente la solicitud a una de las colas de E/S que el controlador ha creado para el dispositivo especificado.
Sintaxis
NTSTATUS WdfDeviceEnqueueRequest(
[in] WDFDEVICE Device,
[in] WDFREQUEST Request
);
Parámetros
[in] Device
Identificador de un objeto de dispositivo de marco.
[in] Request
Identificador de un objeto de solicitud de marco.
Valor devuelto
Si la operación se realiza correctamente, el método devuelve STATUS_SUCCESS. Entre los valores devueltos adicionales se incluyen:
Código devuelto | Descripción |
---|---|
|
La cantidad de memoria disponible es baja. |
|
El controlador no ha creado ninguna cola de E/S para el dispositivo y el controlador no es un controlador de filtro. |
|
La cola de E/S del dispositivo no acepta solicitudes. |
El método podría devolver otros valores NTSTATUS.
Se produce una comprobación de errores si el controlador proporciona un identificador de objeto no válido.
Comentarios
El controlador puede llamar a WdfDeviceEnqueueRequest solo desde una función de devolución de llamada EvtIoInCallerContext .
El método WdfDeviceEnqueueRequest agrega la solicitud a la cola de E/S específica del tipo de solicitud del controlador para el dispositivo, si el controlador ha creado uno. De lo contrario, el método agrega la solicitud a la cola predeterminada del dispositivo, si el controlador ha creado uno.
Si el controlador no ha creado ninguna cola de E/S para el dispositivo, WdfDeviceEnqueueRequest hace lo siguiente:
- Si el controlador es un controlador de filtro, WdfDeviceEnqueueRequest envía la solicitud al destino de E/S del controlador.
- Si el controlador no es un controlador de filtro, WdfDeviceEnqueueRequest devuelve STATUS_INVALID_DEVICE_REQUEST.
Como resultado, si el controlador necesita usar la solicitud o su contexto después de llamar a WdfDeviceEnqueueRequest, debe tomar una referencia en la solicitud antes de llamar a WdfDeviceEnqueueRequest.
Para ello, el controlador puede llamar a WdfObjectReference antes y, a continuación, WdfObjectDereference después de la llamada a WdfDeviceEnqueueRequest. El controlador debe desreferenciar la solicitud antes de salir de EvtIoInCallerContext.
Para obtener más información sobre el método WdfDeviceEnqueueRequest , vea Administración de colas de E/S.
Para las versiones 1.0 y 1.5 de KMDF, se debe llamar a WdfDeviceEnqueueRequest en PASSIVE_LEVEL. Para las versiones 1.7 y posteriores, se puede llamar a WdfDeviceEnqueueRequest en IRQL <= DISPATCH_LEVEL.
Ejemplos
El ejemplo de código siguiente es una función de devolución de llamada EvtIoInCallerContext que busca solicitudes que contienen el código de control de E/S personalizado, IOCTL_NONPNP_METHOD_NEITHER. Si no se encuentra el código de control de E/S, la función de devolución de llamada simplemente devuelve la solicitud al marco. Si la función de devolución de llamada encuentra el código de control de E/S, preprocesa la solicitud y, a continuación, la devuelve al marco. Si se produce un error, la función de devolución de llamada completa la solicitud.
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;
}
Requisitos
Requisito | Value |
---|---|
Plataforma de destino | Universal |
Versión mínima de KMDF | 1.0 |
Encabezado | wdfdevice.h (incluir Wdf.h) |
Library | Wdf01000.sys (consulte Control de versiones de la biblioteca de marcos). |
IRQL | <= DISPATCH_LEVEL (consulte la sección comentarios) |
Reglas de cumplimiento de DDI | DeferredRequestCompleted(kmdf), DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestCompleted(kmdf), RequestCompletedLocal(kmdf) |