Creación de colas de E/S
Los objetos de cola de marco representan colas de E/S, que son contenedores para las solicitudes de E/S que recibe un controlador. Cada controlador puede crear una o varias colas de E/S para cada dispositivo. El objeto de cola del marco define un conjunto de funciones de devolución de llamada de eventos que el controlador puede proporcionar y un conjunto de métodos de objeto a los que puede llamar el controlador.
Cuando el marco recibe una solicitud de E/S que se dirige a uno de los dispositivos del controlador, el marco coloca la solicitud en la cola de E/S adecuada. Si el controlador registra uno o varios controladores de solicitudes, el marco puede notificar al controlador cada vez que haya disponible una solicitud de E/S. Como alternativa, el controlador puede sondear la cola de E/S para las solicitudes.
La mayoría de los controladores crean colas de E/S en su función de devolución de llamada EvtDriverDeviceAdd . Para crear una cola de E/S para un dispositivo, el controlador llama al método WdfIoQueueCreate del objeto de cola del marco (que crea un objeto de cola de marco). El controlador proporciona una estructura WDF_IO_QUEUE_CONFIG al método . Esta estructura contiene información de configuración sobre la cola, como el método de distribución y los punteros de la cola para solicitar controladores a los que el marco llama cuando las solicitudes están disponibles en la cola. La estructura también indica si la cola se administrará con energía y si el controlador admite búferes de longitud cero para las solicitudes de E/S de la cola.
Si el controlador establece el miembro DefaultQueue de la estructura WDF_IO_QUEUE_CONFIG en TRUE, la cola se convierte en la cola de E/S predeterminada del dispositivo. Si el controlador crea una cola de E/S predeterminada, el marco coloca todas las solicitudes de E/S del dispositivo en esta cola, a menos que cree colas adicionales para recibir algunas de las solicitudes. Un controlador puede obtener un identificador para la cola de E/S predeterminada de un dispositivo llamando al método WdfDeviceGetDefaultQueue .
Si desea usar más de una cola de E/S para un dispositivo, el controlador puede llamar a WdfIoQueueCreate para crear tantos objetos de cola como necesite. Si un controlador crea varias colas, puede llamar a WdfDeviceConfigureRequestDispatching, lo que indica al marco que dirija distintos tipos de solicitudes a distintas colas. Por ejemplo, puede especificar que todas las solicitudes de lectura se entregarán a una cola y todas las solicitudes de escritura se entregarán a otra cola.
Si el controlador crea un conjunto de colas de E/S y llama a WdfDeviceConfigureRequestDispatching para dirigir cada tipo de solicitud que el controlador pueda recibir a una cola específica, el controlador no necesita una cola predeterminada.
Si un controlador no proporciona una cola de E/S para las solicitudes de un tipo determinado y, si el controlador es un controlador de función, el marco completa las solicitudes de ese tipo con un valor de estado de finalización de STATUS_INVALID_DEVICE_REQUEST. Si el controlador es un controlador de filtro y ha llamado WdfFdoInitSetFilter, el marco reenvía automáticamente estas solicitudes al controlador inferior siguiente en la pila de controladores. Por lo tanto, por ejemplo, un controlador de filtro que no procesa solicitudes de lectura no tiene que proporcionar una cola de E/S que reciba solicitudes de lectura.
Para obtener ejemplos de cómo los controladores pueden usar colas de E/S, vea Usos de ejemplo de colas de E/S.