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 |
---|---|
|
El tamaño de la estructura de WDF_REQUEST_FORWARD_OPTIONS proporcionada no es válido. |
|
Un miembro de la estructura de WDF_REQUEST_FORWARD_OPTIONS proporcionada contiene un valor no válido. |
|
Este valor se devuelve si se produce una de las siguientes acciones:
|
|
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) |