Configuración del modo de distribución para una cola de E/S
Advertencia
UMDF 2 es la versión más reciente de UMDF y sustituye a UMDF 1. Todos los controladores UMDF nuevos deben escribirse con UMDF 2. No se agregan nuevas características a UMDF 1 y hay compatibilidad limitada con UMDF 1 en versiones más recientes de Windows 10. Los controladores universales de Windows deben usar UMDF 2.
Los ejemplos de UMDF 1 archivados se pueden encontrar en la Windows 11, versión 22H2 : actualización de ejemplos de controladores de mayo de 2022.
Para obtener más información, consulta Introducción con UMDF.
Cuando llegan solicitudes de E/S desde aplicaciones, el marco coloca cada solicitud en la cola de E/S adecuada. Cómo y cuándo se entregan las solicitudes al controlador dependen de cómo el controlador configura el envío de la cola de E/S y de cómo especifica el controlador la sincronización de la función de devolución de llamada. La cola de E/S también interactúa con el subsistema de administración de energía y PnP de UMDF para contener solicitudes de E/S en la cola hasta que el dispositivo alcance el estado adecuado.
Nota El modo de distribución de la cola de E/S no está relacionado con el modo de sincronización. La configuración de distribución de la cola de E/S controla el número de solicitudes que el controlador puede aceptar para su procesamiento en cualquier momento dado, mientras que la sincronización controla la ejecución simultánea de funciones de devolución de llamada de eventos que presentan o cancelan solicitudes. Sin embargo, se crean varios modos de operación mediante la combinación de modos de distribución y sincronización.
El controlador configura el envío de una cola de E/S cuando el controlador llama al método IWDFDevice::CreateIoQueue para configurar la cola predeterminada o para crear una cola secundaria. El controlador puede especificar uno de los valores del tipo de enumeración WDF_IO_QUEUE_DISPATCH_TYPE en el parámetro DispatchType de IWDFDevice::CreateIoQueue para identificar el modo de distribución. Un objeto de cola de E/S puede admitir los siguientes modos de envío:
Secuencial
El modo de distribución secuencial se especifica mediante el valor WdfIoQueueDispatchSequential . En este modo de envío, una cola en el estado de procesamiento genera eventos para que un controlador solo procese una solicitud cada vez. La cola aplaza las solicitudes adicionales hasta que el controlador termine de procesar su solicitud actual o llame al método IWDFIoRequest::ForwardToIoQueue para volver a poner en cola la solicitud. Cuando la solicitud actual se completa o se reenvía, la cola genera un evento para proporcionar la siguiente solicitud.
Paralelo
El modo de distribución en paralelo se especifica mediante el valor WdfIoQueueDispatchParallel . En este modo de envío, una cola en el estado de procesamiento genera eventos en cuanto las solicitudes de E/S están listas para el controlador. Cuando el controlador recibe una solicitud de E/S, el controlador puede procesar la solicitud de E/S de una de las maneras siguientes:
- El controlador llama al método IWDFIoRequest::Complete o IWDFIoRequest::CompleteWithInformation para completar la solicitud de E/S inmediatamente. Un controlador completa la solicitud de E/S inmediatamente si la solicitud de E/S no es válida, nunca se puede atender o se puede completar copiando datos de un búfer o caché que tenga los datos.
- El controlador llama al método IWDFIoRequest::ForwardToIoQueue para volver a poner en cola la solicitud de E/S.
- El controlador llama al método IWDFIoRequest::Send para pasar la solicitud de E/S a un controlador de nivel inferior.
Manual
El modo de distribución manual se especifica mediante el valor WdfIoQueueDispatchManual . En este modo de envío, la cola de E/S no notifica automáticamente al controlador cuando llegan las solicitudes a la cola. El controlador debe llamar al método IWDFIoQueue::RetrieveNextRequest para recuperar las solicitudes manualmente de la cola. Se trata de un modelo de sondeo.
En las versiones 1.9 y posteriores de UMDF, si el controlador usa el modo de distribución manual, puede llamar a IWDFIoRequest2::Requeue 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 IWDFIoRequest2::Requeue, la siguiente llamada del controlador a IWDFIoQueue::RetrieveNextRequest recupera la solicitud requeued.
Para todos los modos de envío, el objeto de cola de E/S recibe y realiza un seguimiento de la solicitud hasta que el controlador controla la solicitud o se cancela la solicitud.
Si el controlador configura la cola para el envío serie o paralelo, el marco notifica al controlador de una solicitud a través de las funciones de devolución de llamada registradas por el controlador cuando el controlador crea la cola o configura la cola predeterminada. Para obtener más información, vea Funciones de devolución de llamada de eventos de cola de E/S.