Escritura de un minidriver de stream
El objetivo de diseño principal del controlador de clase de flujo es controlar el trabajo tanto de controlar el sistema operativo, que incluye las complejidades de admitir máquinas multiprocesador, y de admitir la semántica de streaming del kernel. Requiere que el minidriver controle solo la parte específica del dispositivo de cualquier operación que debe realizar. El controlador de clase asigna memoria para el minidriver, realiza la contabilidad de los recursos del kernel NT que el minidriver puede requerir y (opcionalmente) controla todos los problemas de sincronización.
El controlador de clase se comunica con el minidriver a través de un conjunto de devoluciones de llamada proporcionadas por minidriver. La mayoría del trabajo de escritura de un minidriver de streaming se produce al escribir estas devoluciones de llamada.
En esta documentación, nos referimos a cada tipo de rutinas proporcionadas por minidriver como StrMiniXxx. Es posible que el minidriver tenga que proporcionar una o varias versiones de cada rutina, dependiendo de cuántas funciones diferentes pueda realizar el hardware subyacente.
Normalmente, un controlador de streaming puede admitir varios flujos de datos diferentes. Por ejemplo, un reproductor de DVD genera una secuencia de audio y vídeo. Dentro del contexto del streaming del kernel, cada flujo de datos se representa mediante un pin.
El controlador de clase stream realiza un seguimiento de cada pin en el minidriver. En la terminología del controlador de clase, cada tipo de patilla es una secuencia. Las secuencias, como los tipos de patillas, pueden tener varias instancias. Dado que las secuencias pueden recibir solicitudes de E/S, el controlador debe proporcionar devoluciones de llamada para cada secuencia.
A continuación se muestran las rutinas que puede tener que proporcionar el minidriver. Se documentan más adelante y en la guía de referencia.
Rutinas que proporciona cada minidriver
Rutinas que proporciona el minidriver para cada flujo individual
StrMiniReceiveStreamDataPacket
StrMiniReceiveStreamControlPacket
Es posible que el minidriver use la misma devolución de llamada para varias secuencias diferentes. La devolución de llamada puede determinar la secuencia en cuyo nombre se llamó desde sus parámetros.
El minidriver debe, al igual que todos los controladores WDM, proporcionar también una rutina DriverEntry . La tarea principal de la rutina DriverEntry de un minidriver es registrar el minidriver con el controlador de clase.
El controlador de clase recibe todas las solicitudes de E/S en nombre del minidriver. Para obtener la información que necesita para completar la solicitud, el controlador de clase crea un bloque de solicitud de secuencia (SRB) y lo pasa a una de las rutinas de paquetes StrMiniXXX. El controlador de clase envía solicitudes de E/S al dispositivo en su conjunto a la rutina StrMiniReceiveDevicePacket . Pasa solicitudes a flujos individuales a StrMiniReceiveStreamDataPacket (para solicitudes de lectura y escritura de streaming de kernel) o StrMiniReceiveStreamControlPacket (para otras solicitudes).
Normalmente, el controlador de clase pone en cola sus solicitudes y los pasa de uno en uno al minidriver. El minidriver puede realizar opcionalmente su propia sincronización; El minidriver es responsable de las solicitudes de puesta en cola que no puede controlar inmediatamente. Consulte Sincronización de minidriver para obtener más información.
El minidriver debe proporcionar dos rutinas adicionales para manipular bloques de solicitudes de flujo. El controlador de clase llama a StrMiniCancelPacket cuando recibe un IRP de cancelación y necesita indicar al minidriver que cancele un paquete específico. El controlador de clase también realiza un seguimiento del tiempo que tarda el minidriver en completar su control de un bloque de solicitud de flujo. Si el minidriver tarda demasiado, el controlador de clase agota el tiempo de espera de la solicitud y llama a la rutina StrMiniRequestTimeout del minidriver.
Cuando se produce una interrupción de hardware, el sistema operativo señala al controlador de clase, que a continuación llama a la rutina StrMiniInterrupt del minidriver para controlar la interrupción.