Métodos de distribución para solicitudes de E/S
Cuando un controlador llama a WdfIoQueueCreate para crear una cola de E/S, especifica un método de distribución para la cola. El marco proporciona tres métodos de distribución: secuenciales, paralelos y manuales. El controlador puede especificar cualquiera de estos métodos de envío para cualquier cola de E/S, incluida la cola de E/S predeterminada de un dispositivo.
El controlador establece el método de distribución de una cola especificando un valor con tipo WDF_IO_QUEUE_DISPATCH_TYPE en la estructura WDF_IO_QUEUE_CONFIG de la cola.
Para ver usos de ejemplo de cada método de distribución, vea Usos de ejemplo de colas de E/S.
Distribución secuencial
Si el controlador o dispositivo solo puede procesar una solicitud de E/S de una cola a la vez, debe configurar las colas de E/S del dispositivo para usar el envío secuencial, que también se denomina distribución sincrónica. Con este tipo de envío, el marco entrega solicitudes al controlador de uno en uno. El marco de trabajo no entrega la siguiente solicitud hasta que el controlador finalice, cancele o vuelva a poner en cola la solicitud anterior.
Después de que el marco entregue una solicitud a uno de los controladores de solicitudes del controlador, el controlador procesa la solicitud. Si el controlador reenvía la solicitud a un destino de E/S general, normalmente llama a uno de los métodos sincrónicos del objeto de destino de E/S. Para obtener más información sobre estos métodos, vea Envío de solicitudes de E/S de forma sincrónica. El controlador debe completar o cancelar cada solicitud que reciba de una cola de E/S.
Un controlador que ha configurado una cola de E/S para el envío secuencial puede llamar a WdfIoQueueRetrieveNextRequest o WdfIoQueueRetrieveRequestByFileObject para obtener otra solicitud de la cola antes de que se haya completado o cancelado la última solicitud recibida. Es posible que quiera hacerlo en un controlador de función para que el controlador pueda iniciar la siguiente operación de hardware mientras la función de devolución de llamada EvtInterruptDpc del controlador sigue procesando datos de la operación de hardware anterior.
Si crea varias colas de E/S y las configura para el envío secuencial, el marco envía solicitudes de cada cola secuencialmente, pero las colas se ejecutan en paralelo. Si el controlador o dispositivo solo puede procesar una solicitud a la vez de cualquier tipo, debe usar una sola cola de E/S con una función de devolución de llamada EvtIoDefault .
Distribución en paralelo
Si el controlador y el dispositivo pueden procesar varias solicitudes de E/S simultáneamente, puede configurar las colas de E/S del dispositivo para usar el envío paralelo para que el controlador pueda procesar las solicitudes de forma asincrónica. Este método de distribución también se denomina distribución asincrónica.
Si un controlador configura una cola de E/S para usar el envío paralelo, el marco entrega solicitudes de E/S al controlador tan pronto como estén disponibles en la cola. El resultado es que el controlador puede tener que procesar varias solicitudes a la vez.
Cada vez que uno de los controladores de solicitudes del controlador recibe una solicitud, el controlador debe procesar la solicitud y, a continuación, completar la solicitud. Si el controlador reenvía la solicitud a un destino de E/S general, normalmente llama a uno de los métodos asincrónicos del objeto de destino de E/S. Para obtener más información sobre estos métodos, consulte Envío de solicitudes de E/S de forma asincrónica. El controlador debe completar o cancelar cada solicitud que reciba de una cola de E/S.
Un controlador que usa el envío paralelo puede llamar a WdfIoQueueStop o WdfIoQueueStopSynchronously para detener temporalmente una cola y, a continuación, llamar a WdfIoQueueStart para reiniciar la cola.
Distribución manual
Si desea que el controlador tenga control total sobre la entrega de solicitudes de E/S, puede configurar la cola de E/S de un dispositivo para usar el envío manual, lo que significa que el marco no entrega solicitudes al controlador a menos que el controlador solicite explícitamente uno.
Para obtener una solicitud de una cola manual, el controlador puede llamar a WdfIoQueueRetrieveNextRequest o WdfIoQueueRetrieveRequestByFileObject en un bucle que sondee la cola. Como alternativa, el controlador puede llamar a WdfIoQueueReadyNotify para registrar una función de devolución de llamada a la que el marco llamará cuando una o varias solicitudes estén disponibles en la cola. Una vez que el marco llama a la función de devolución de llamada, el controlador puede llamar a WdfIoQueueRetrieveNextRequest o WdfIoQueueRetrieveRequestByFileObject en un bucle para recuperar las solicitudes.
Después de que el controlador obtenga una solicitud de la cola, debe procesar la solicitud. El controlador debe completar o cancelar cada solicitud.