Función WdfRequestForwardToIoQueue (wdfrequest.h)

[Se aplica a KMDF y UMDF]

El método WdfRequestForwardToIoQueue vuelve a poner en cola una solicitud de E/S a una de las colas de E/S del controlador de llamada.

Sintaxis

NTSTATUS WdfRequestForwardToIoQueue(
  [in] WDFREQUEST Request,
  [in] WDFQUEUE   DestinationQueue
);

Parámetros

[in] Request

Identificador de un objeto de solicitud de marco.

[in] DestinationQueue

Identificador de un objeto de cola de marco.

Valor devuelto

WdfRequestForwardToIoQueue devuelve STATUS_SUCCESS si la operación se realiza correctamente. De lo contrario, este método podría devolver uno de los siguientes valores:

Código devuelto Descripción
STATUS_INVALID_DEVICE_REQUEST
Este valor se devuelve si se produce una de las siguientes acciones:
  • El controlador no obtuvo la solicitud de una cola de E/S.
  • Las colas de origen y destino son las mismas.
  • Las colas de origen y destino no pertenecen al mismo dispositivo.
  • El controlador no posee la solicitud.
  • La solicitud se puede cancelar.
STATUS_WDF_BUSY
La cola de destino no acepta nuevas solicitudes.
 

Este método también 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 debe poseer la solicitud de E/S y debe haber obtenido la solicitud de una de sus colas de E/S.

Las colas de origen y destino no pueden ser las mismas. En otras palabras, el controlador no puede llamar a WdfRequestForwardToIoQueue para devolver una solicitud a la cola de la que procede. Para volver a poner en cola una solicitud a la misma cola, use WdfRequestRequeue.

Las colas de origen y destino deben pertenecer al mismo dispositivo.

La solicitud no debe ser cancelable. Si el controlador ha llamado a WdfRequestMarkCancelable o WdfRequestMarkCancelableEx para que la solicitud se pueda cancelar, debe llamar a WdfRequestUnmarkCancelable antes de llamar a WdfRequestForwardToIoQueue.

Después de que el controlador llame a WdfRequestForwardToIoQueue, el controlador no posee la solicitud requeued hasta que el marco entregue la solicitud de la nueva cola al controlador. Mientras la solicitud está en la nueva cola, el marco posee la solicitud y puede cancelarla sin notificar al controlador.

Antes de que WdfRequestForwardToIoQueue devuelva, se pueden producir los siguientes eventos:

  • Si la cola de destino estaba vacía, el marco puede entregar la solicitud de E/S requeued a uno de los controladores de solicitudes de la cola de destino.
  • Si el método de distribución de la cola de origen es secuencial o paralelo, el marco puede entregar otra solicitud a uno de los controladores de solicitudes de la cola de origen.
Para obtener más información sobre WdfRequestForwardToIoQueue, vea Requeuing I/O Requests and Managing I/O Queues.

Ejemplos

El ejemplo de código siguiente es una función de devolución de llamada EvtIoDeviceControl del controlador de ejemplo PCIDRV . Si una solicitud recibida contiene un código de control de E/S de IOCTL_NDISPROT_INDICATE_STATUS, el controlador llama a WdfRequestForwardToIoQueue para mover la solicitud a otra cola de E/S.

VOID
PciDrvEvtIoDeviceControl(
    IN WDFQUEUE  Queue,
    IN WDFREQUEST  Request,
    IN size_t  OutputBufferLength,
    IN size_t  InputBufferLength,
    IN ULONG  IoControlCode
    )
{
    NTSTATUS  status= STATUS_SUCCESS;
    PFDO_DATA  fdoData = NULL;
    WDFDEVICE  hDevice;
    WDF_REQUEST_PARAMETERS  params;

    UNREFERENCED_PARAMETER(OutputBufferLength);
    UNREFERENCED_PARAMETER(InputBufferLength);

    hDevice = WdfIoQueueGetDevice(Queue);
    fdoData = FdoGetData(hDevice);

    WDF_REQUEST_PARAMETERS_INIT(&params);
    WdfRequestGetParameters(
                            Request,
                            &params
                            );

    switch (IoControlCode)
    {
        case IOCTL_NDISPROT_QUERY_OID_VALUE:
            NICHandleQueryOidRequest(
                                     Queue,
                                     Request,
                                     &params
                                     );
            break;

        case IOCTL_NDISPROT_SET_OID_VALUE:
            NICHandleSetOidRequest(
                                   Queue,
                                   Request,
                                   &params
                                   );
            break;

        case IOCTL_NDISPROT_INDICATE_STATUS:
            status = WdfRequestForwardToIoQueue(
                                                Request,
                                                fdoData->PendingIoctlQueue
                                                );
            if(!NT_SUCCESS(status)){
                WdfRequestComplete(
                                   Request,
                                   status
                                   );
                break;
            }
            break;

        default:
            WdfRequestComplete(
                               Request,
                               STATUS_INVALID_DEVICE_REQUEST
                               );
            break;
    }
    return;
}

Requisitos

Requisito Value
Plataforma de destino Universal
Versión mínima de KMDF 1.0
Versión mínima de UMDF 2.0
Encabezado wdfrequest.h (incluya Wdf.h)
Library Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF)
IRQL <=DISPATCH_LEVEL
Reglas de cumplimiento de DDI DeferredRequestCompleted(kmdf), DriverCreate(kmdf), InvalidReqAccess(kmdf), InvalidReqAccessLocal(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestCompleted(kmdf), RequestCompletedLocal(kmdf)

Consulte también

EvtDestroyCallback

WdfRequestMarkCancelable

WdfRequestMarkCancelableEx

WdfRequestRequeue

WdfRequestUnmarkCancelable