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
STATUS_INSUFFICIENT_RESOURCES
La cantidad de memoria disponible es baja.
STATUS_INVALID_DEVICE_REQUEST
El controlador no ha creado ninguna cola de E/S para el dispositivo y el controlador no es un controlador de filtro.
STATUS_WDF_BUSY
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.
Mientras se ejecuta WdfDeviceEnqueueRequest , es posible que el controlador reciba y complete o cancele la solicitud.

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(&params);
    WdfRequestGetParameters(
                            Request,
                            &params
                            );
    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)

Consulte también

WDF_REQUEST_PARAMETERS_INIT

WdfRequestComplete

WdfRequestGetParameters