Compartir a través de


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 WDF_REQUEST_FORWARD_OPTIONS proporcionada no es válido.
STATUS_INVALID_PARAMETER
Un miembro de la estructura 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 de 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 puede devolver otros valores de NTSTATUS.

Se produce una comprobación de errores si el controlador proporciona un identificador de objeto no válido.

Observaciones

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) para el dispositivo primario y 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 especificar espacio de contexto para los objetos de solicitud del primario dispositivo, 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 WdfDeviceInitSetRequestAttributes para el secundario objetos de solicitud del dispositivo 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 requeued. 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 el EvtCleanupCallback o EvtDestroyCallback función de un objeto de solicitud requeued para acceder a los recursos del dispositivo secundario, ya que es posible que los recursos se quiten antes del EvtCleanupCallback o función EvtDestroyCallback.

Para obtener más información sobre WdfRequestForwardToParentDeviceIoQueue, vea Solicitudes de E/S de requeuing.

Ejemplos

En el ejemplo de código siguiente se determina primero 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 Valor
de la plataforma de destino de Universal
versión mínima de KMDF 1.9
encabezado de wdfrequest.h (incluya Wdf.h)
biblioteca de 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