Volver a poner en cola las solicitudes de E/S
Los controladores pueden volver a poner en cola las solicitudes de E/S que obtienen de una cola de E/S. Un controlador puede volver a poner en cola una solicitud de E/S a otra cola de E/S que el controlador ha creado para el mismo dispositivo. Además, un controlador de autobús puede volver a poner en cola una solicitud de E/S de una cola de E/S de un dispositivo secundario a la cola de E/S de un dispositivo primario.
Volver a poner en cola una solicitud de E/S a una cola de E/S diferente para un dispositivo
Una vez que los controladores de solicitudes de un controlador reciben una solicitud de E/S de una cola de E/S de un controlador, el controlador puede llamar a WdfRequestForwardToIoQueue para volver a poner en cola la solicitud a otra cola.
Por ejemplo, si desea que el controlador asigne recursos a una solicitud antes de procesar la solicitud, la función de devolución de llamada EvtIoDefault del controlador podría recibir todas las solicitudes, almacenar la información de recursos en la memoria de contexto de cada solicitud y, a continuación, llamar a WdfRequestForwardToIoQueue para volver a poner en cola cada solicitud a una cola adicional.
Si el controlador llama a WdfRequestForwardToIoQueue para volver a poner en cola una solicitud de E/S que el controlador obtuvo de una cola de E/S que usa el método de distribución secuencial, el marco entregará la siguiente solicitud de E/S de la cola secuencial al controlador sin esperar a que se complete la solicitud requeued.
Si el controlador usa el método de distribución manual, puede llamar al método WdfRequestRequeue para devolver una solicitud de E/S al encabezado de la cola de E/S desde la que el controlador lo obtuvo. Después de llamar a WdfRequestRequeue, la siguiente llamada del controlador a WdfIoQueueRetrieveNextRequest recupera la solicitud requeued.
Volver a poner en cola una solicitud de E/S a una cola de E/S de un dispositivo primario
Un controlador de función para un dispositivo primario puede actuar como controlador de bus que enumera los dispositivos secundarios del dispositivo primario y crea objetos de dispositivo físicos (PPO) para los dispositivos secundarios. Estos controladores a veces pueden recibir solicitudes de E/S para un dispositivo secundario que el dispositivo primario debe controlar.
Por ejemplo, un bus de protocolo (como USB) normalmente controla los recursos de hardware asignados a cada dispositivo conectado. Por lo tanto, el controlador de función del bus primario normalmente controla las operaciones de E/S para cada dispositivo secundario. Cuando el administrador de E/S envía una solicitud de E/S a la pila de dispositivos de uno de los dispositivos secundarios, el controlador de función del bus recibe la solicitud de E/S en una de las colas de E/S del dispositivo secundario, porque ese controlador creó el PDO del dispositivo secundario. Para que el controlador pueda procesar la solicitud de E/S en el contexto del dispositivo de bus primario, debe volver a poner en cola la solicitud de E/S del dispositivo secundario a una cola de E/S que pertenezca al dispositivo primario.
Sin embargo, los controladores no pueden llamar a WdfRequestForwardToIoQueue para mover las solicitudes de una cola secundaria a la cola de un elemento primario. Dado que el administrador de E/S crea pilas de dispositivos independientes para los dispositivos primarios y secundarios, el objeto de dispositivo WDM subyacente debe cambiarse primero de uno que represente el dispositivo secundario a uno que represente al elemento primario.
Antes de la versión 1.9 de KMDF, los controladores podían enviar solicitudes de E/S desde un dispositivo secundario solo a su elemento primario creando destinos de E/S remotos, aumentando el tamaño de la pila de dispositivos del dispositivo secundario y especificando el objeto de dispositivo WDM correcto.
A partir de la versión 1.9 de KMDF, un controlador puede llamar a WdfPdoInitAllowForwardingRequestToParent antes de crear un dispositivo secundario y, a continuación, llamar a WdfRequestForwardToParentDeviceIoQueue para volver a poner en cola una solicitud de la cola de E/S secundaria a una cola primaria. Si un controlador usaWdfPdoInitAllowForwardingRequestToParent y WdfRequestForwardToParentDeviceIoQueue, el marco aumenta el tamaño de pila del dispositivo secundario y asigna el objeto de dispositivo WDM correcto a la solicitud de E/S.