Función WdfRequestForwardToParentDeviceIoQueue (wdfrequest.h)

[Solo se aplica a KMDF]

El método WdfRequestForwardToParentDeviceIoQueue vuelve a poner en cola una solicitud de E/S de un dispositivo secundario en una cola de E/S especificada del dispositivo primario del elemento secundario.

Sintaxis

NTSTATUS WdfRequestForwardToParentDeviceIoQueue(
  [in] WDFREQUEST                   Request,
  [in] WDFQUEUE                     ParentDeviceQueue,
  [in] PWDF_REQUEST_FORWARD_OPTIONS ForwardOptions
);

Parámetros

[in] Request

Identificador de un objeto de solicitud de marco.

[in] ParentDeviceQueue

Identificador de un objeto de cola de marco.

[in] ForwardOptions

Puntero a una estructura de WDF_REQUEST_FORWARD_OPTIONS asignada por el autor de la llamada.

Valor devuelto

WdfRequestForwardToParentDeviceIoQueue 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_INFO_LENGTH_MISMATCH
El tamaño de la estructura de WDF_REQUEST_FORWARD_OPTIONS proporcionada no es válido.
STATUS_INVALID_PARAMETER
Un miembro de la estructura de WDF_REQUEST_FORWARD_OPTIONS proporcionada contiene un valor no válido.
STATUS_INVALID_DEVICE_REQUEST
Este valor se devuelve si se produce una de las siguientes acciones:
  • El controlador no obtuvo la solicitud de E/S de una cola de E/S.
  • Las colas de E/S de origen y destino son las mismas.
  • La cola de E/S especificada no pertenece al dispositivo primario.
  • El controlador ha habilitado el progreso hacia delante garantizado y la solicitud de E/S especificada está reservada para situaciones de poca memoria.
  • El controlador no llamó a WdfPdoInitAllowForwardingRequestToParent.
STATUS_WDF_BUSY
La cola de E/S especificada 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

Para que un controlador pueda llamar a WdfRequestForwardToParentDeviceIoQueue, debe llamar a WdfPdoInitAllowForwardingRequestToParent.

El controlador debe usar el mismo método para acceder a los búferes de datos (almacenados en búfer , directos o ninguno) tanto para el dispositivo primario como para el dispositivo secundario.

Si el controlador llamará a WdfRequestForwardToParentDeviceIoQueue para volver a poner en cola una solicitud de E/S, el controlador no debe usar el objeto de solicitud como elemento primario de otros objetos de marco, como objetos de temporizador o objetos de elemento de trabajo.

Si el controlador ha llamado a WdfDeviceInitSetRequestAttributes para especificar espacio de contexto para los objetos de solicitud del dispositivo primario , el marco no agrega este espacio de contexto para solicitar objetos que el controlador recibe en la cola de un dispositivo secundario. El controlador puede llamar a WdfObjectAllocateContext para agregar el espacio de contexto a un objeto de solicitud antes de que el controlador llame a WdfRequestForwardToParentDeviceIoQueue. Por otro lado, si el controlador llamó a WdfDeviceInitSetRequestAttributespara los objetos de solicitud del dispositivo secundario y si los objetos de solicitud del dispositivo primario usan espacio de contexto igual o menor que el espacio de contexto del dispositivo secundario, el controlador puede usar el espacio de contexto del objeto de solicitud sin llamar a WdfObjectAllocateContext.

Actualmente, el controlador debe usar la opción enviar y olvidar para todas las solicitudes de E/S puestas en cola. Por lo tanto, tenga en cuenta que, en el momento en que el marco elimina un objeto de solicitud requeued, es posible que ya haya quitado el dispositivo secundario que recibió originalmente el objeto de solicitud. Por lo tanto, el controlador no debe usar la función EvtCleanupCallback o EvtDestroyCallback de un objeto de solicitud requeued para tener acceso a los recursos secundarios del dispositivo, ya que los recursos podrían quitarse antes de que se ejecute la función EvtCleanupCallback o EvtDestroyCallback .

Para obtener más información sobre WdfRequestForwardToParentDeviceIoQueue, consulte Solicitudes de E/S de puesta en cola.

Ejemplos

En el ejemplo de código siguiente, primero se determina el dispositivo primario de un dispositivo que recibió una solicitud de E/S y, a continuación, vuelve a poner en cola la solicitud de E/S predeterminada del dispositivo primario.

WDFDEVICE device, parentDevice;
WDF_REQUEST_FORWARD_OPTIONS forwardOptions;
NTSTATUS status;

device = WdfIoQueueGetDevice(WdfRequestGetIoQueue(Request));
parentDevice = WdfPdoGetParent(device);

WDF_REQUEST_FORWARD_OPTIONS_INIT(&forwardOptions);
status = WdfRequestForwardToParentDeviceIoQueue(
             Request,
             WdfDeviceGetDefaultQueue(parentDevice),
             &forwardOptions
             );
if (!NT_SUCCESS(status)) {
    WdfRequestComplete(
                       Request,
                       status
                       );
  }

Requisitos

Requisito Value
Plataforma de destino Universal
Versión mínima de KMDF 1,9
Encabezado wdfrequest.h (incluir Wdf.h)
Library Wdf01000.sys (consulte Control de versiones de la biblioteca de marcos).
IRQL <=DISPATCH_LEVEL
Reglas de cumplimiento de DDI DriverCreate(kmdf)

Consulte también

WdfPdoInitAllowForwardingRequestToParent