Administración de colas de E/S

Inicio de una cola de E/S

Cuando un controlador llama a WdfIoQueueCreate para crear una cola de E/S, el marco permite automáticamente a la cola recibir solicitudes de E/S y entregarlas a un controlador.

Los controladores suelen llamar a WdfIoQueueCreate desde una función de devolución de llamada EvtDriverDeviceAdd . El marco puede comenzar a entregar solicitudes de E/S al controlador después de que se devuelva la función de devolución de llamada EvtDriverDeviceAdd del controlador.

Si el controlador usa colas de E/S administradas por energía , el marco no puede empezar a entregar solicitudes al controlador hasta que el dispositivo entre en su estado de trabajo y el marco ha llamado a la función de devolución de llamada EvtDeviceD0Entry del controlador.

Detener y reiniciar una cola de E/S

El controlador puede llamar a WdfIoQueueStop o WdfIoQueueStopSynchronousmente para evitar temporalmente que el marco entregue solicitudes de E/S desde una cola de E/S. Para reanudar la entrega de solicitudes de E/S, el controlador llama a WdfIoQueueStart.

Si el controlador usa colas de E/S administradas por energía, el marco detiene automáticamente las colas de un dispositivo cuando el dispositivo deja su estado de trabajo (D0) y el marco reinicia las colas cuando el estado del dispositivo vuelve a D0.

Agregar solicitudes a una cola de E/S

Cuando el sistema envía una solicitud de control de E/S de lectura, escritura o dispositivo a un controlador, el marco coloca la solicitud en una cola de E/S. El controlador puede controlar los tipos de solicitudes que el marco almacena en cada cola llamando a WdfDeviceConfigureRequestDispatching.

Un controlador también puede volver a poner en cola las solicitudes que ha recibido del marco mediante una llamada a WdfRequestForwardToIoQueue.

Obtención de solicitudes de una cola de E/S

Si un controlador especifica el método de envío secuencial o paralelo para una cola de E/S, recibe solicitudes en los controladores de solicitudes.

Si un controlador especifica el método de distribución manual o secuencial, puede obtener solicitudes mediante una llamada a WdfIoQueueRetrieveNextRequest o WdfIoQueueRetrieveRequestByFileObject.

Búsqueda de una solicitud de E/S

Si un controlador especifica el método de distribución manual para una cola de E/S, puede usar los pasos siguientes para buscar solicitudes concretas en la cola:

  1. Llame a WdfIoQueueFindRequest para buscar una solicitud que coincida con los criterios especificados por el controlador.

  2. Llame a WdfIoQueueRetrieveFoundRequest para recuperar la solicitud que WdfIoQueueFindRequest encuentra.

Purgar o purgar una cola de E/S

Purgar una cola de E/S significa detener la inserción de solicitudes de E/S en la cola y cancelar las solicitudes que ya están en la cola.

Purgar una cola de E/S significa detener la inserción de solicitudes de E/S en la cola, al tiempo que permite que las solicitudes que ya están en la cola se entreguen al controlador.

Normalmente, los controladores purgan o purgan sus colas solo si las colas no están administradas por energía. En el caso de las colas de E/S administradas por energía, los controladores pueden proporcionar funciones de devolución de llamada EvtIoStop y EvtIoResume .

Si algunas de las colas del controlador no están administradas por energía, es posible que quiera purgar o purgar una cola si su dispositivo asociado o canal de E/S deja de estar disponible. Normalmente, purgará, en lugar de purgar, una cola a menos que haya una alta probabilidad de que cada solicitud contenga información muy importante. Por ejemplo, un controlador para un dispositivo de red podría purgar sus colas, mientras que un controlador para un dispositivo de almacenamiento probablemente purgaría sus colas.

Si desea que el controlador purgue o desagüe una cola de E/S, el controlador puede llamar a uno de los métodos de objeto de cola siguientes:

Tenga cuidado al llamar a WdfIoQueueDrain y WdfIoQueueDrainSynchronously. Dado que una operación de purga espera a que se completen las solicitudes, solo debe purgar una cola si está seguro de que las solicitudes pendientes de la cola se completarán de forma oportuna. Si no sabe cuánto tiempo tardarán las solicitudes de E/S en completarse y es aceptable cancelar las solicitudes pendientes, considere la posibilidad de purgar la cola.

Mover solicitudes de una cola de E/S a otra

Una vez que el controlador haya recibido una solicitud de E/S, es posible que quiera que el controlador vuelva a poner la solicitud en una cola de E/S diferente. Para ello, el controlador llama a WdfRequestForwardToIoQueue o WdfRequestForwardToParentDeviceIoQueue, que agrega la solicitud a la cola de una cola especificada. Finalmente, el marco entregará la solicitud al controlador de nuevo mediante el método de distribución de la cola especificada. Para obtener más información sobre cómo mover solicitudes de E/S de una cola de E/S a otra, consulte Requeuing I/O Requests (Requeuing I/O Requests).

Interceptación de una solicitud de E/S antes de ponerla en cola

Es posible que un controlador intercepte una solicitud de E/S antes de que el marco coloque la solicitud en una cola de E/S. Para interceptar las solicitudes de E/S, el controlador debe llamar a WdfDeviceInitSetIoInCallerContextCallback para registrar una función de devolución de llamada EvtIoInCallerContext .

El marco asocia la función de devolución de llamada EvtIoInCallerContext con un dispositivo. Como resultado, el marco llama a la función de devolución de llamada EvtIoInCallerContext cada vez que recibe una solicitud que el sistema envía al dispositivo.

Normalmente, cuando una función de devolución de llamada EvtIoInCallerContext recibe una solicitud, realiza algún procesamiento preliminar de la solicitud. A continuación, la función de devolución de llamada llama a WdfDeviceEnqueueRequest, que devuelve la solicitud al marco. Después, el marco de trabajo puede realizar la solicitud en la cola de E/S adecuada, tal como lo habría hecho si no hubiera llamado a la función de devolución de llamada EvtIoInCallerContext .

La razón principal por la que un controlador puede proporcionar una función de devolución de llamada EvtIoInCallerContext es que el controlador tiene que controlar las operaciones de E/S que admiten el método de E/S denominado ni almacenado en búfer ni E/S directa. Para este método de E/S, el controlador debe tener acceso a los búferes recibidos en el contexto de proceso del originador de la solicitud de E/S. Para obtener más información, consulte Acceso a búferes de datos en controladores de Framework-Based.

Obtención de propiedades de cola de E/S

Para obtener propiedades de un objeto de cola de marco, el controlador puede llamar a los métodos siguientes: