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 |
---|---|
|
Este valor se devuelve si se produce una de las siguientes acciones:
|
|
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.
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(¶ms);
WdfRequestGetParameters(
Request,
¶ms
);
switch (IoControlCode)
{
case IOCTL_NDISPROT_QUERY_OID_VALUE:
NICHandleQueryOidRequest(
Queue,
Request,
¶ms
);
break;
case IOCTL_NDISPROT_SET_OID_VALUE:
NICHandleSetOidRequest(
Queue,
Request,
¶ms
);
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) |