Sincronización de minicontrolador

Los desarrolladores de minidriver de streaming tienen la opción de permitir que el controlador de clase controle la sincronización. Cuando los minidrivers se registran con el controlador de clase, pueden optar por la sincronización proporcionada por el controlador de clase estableciendo el miembro TurnOffSynchronization de HW_INITIALIZATION_DATA en FALSE.

Cuando el controlador de clase controla la sincronización, garantiza que nunca se ejecuten simultáneamente dos partes del código de minidriver. El controlador de clase pone en cola todas las solicitudes de flujo y las pasa al minidriver de uno en uno.

Un propósito de esta sincronización es evitar que el sistema de escritura de minidriver tenga que lidiar con todos los detalles de la sincronización de controladores y la puesta en cola de solicitudes en un entorno multitarea, reentrant, multiprocesador. Sin embargo, algunos minidrivers no deben usarlo. Se proporcionan dos ejemplos en el tema Ejemplos de sincronización que ilustran lo que un minidriver debe hacer con respecto a la sincronización.

Desactivar la sincronización de clases de secuencia significa que todas las solicitudes se llaman de forma inmediata y asincrónica al minidriver en el contexto del subproceso de envío en PASSIVE_LEVEL. Las excepciones a la regla anterior son las rutinas HwCancelPacket, TimeoutHandler y Timer. Se llaman en DISPATCH_LEVEL. Una excepción final es el controlador de interrupciones, al que se llama en DIRQL.

Cuando la sincronización está desactivada, el minidriver es responsable de realizar la sincronización conforme al modelo WDM. Si se vuelve a llamar a un minidriver en PASSIVE_LEVEL, se puede adelantar por cualquier evento IRQL superior, como DPC o interrupciones. De forma similar, si se llama a un minidriver en DISPATCH_LEVEL, posteriormente se puede adelantar mediante interrupciones. Las funciones de minidriver que manipulan los recursos compartidos deben sincronizar los accesos.

Se pueden emitir simultáneamente varias solicitudes a las mismas secuencias o diferentes cuando la sincronización de clases de secuencia está desactivada. El minidriver debe poner en cola sus propias solicitudes y controlar cualquier sincronización de hardware con otros subprocesos y el ISR. Bloqueos de número, exclusiones mutuas y KeSynchronizeExecution son algunos de los objetos de sincronización disponibles para transmitir minidrivers que se ejecutan sin sincronización de clases de flujo.