Partager via


Synchronisation de minidriver

Les développeurs de minidriver en streaming ont la possibilité d’autoriser le pilote de classe à gérer la synchronisation. Lorsque les minidrivers s’inscrivent auprès du pilote de classe, ils peuvent choisir la synchronisation fournie par le pilote de classe en définissant le membre TurnOffSynchronization de HW_INITIALIZATION_DATA sur FALSE.

Lorsque le pilote de classe gère la synchronisation, il garantit que deux éléments du code minidriver ne sont jamais exécutés simultanément. Le pilote de classe met en file d’attente toutes les demandes de flux et les transmet au minidriver un par un.

L’un des objectifs de cette synchronisation est d’éviter au développeur de minipilote de devoir gérer tous les détails de la synchronisation des pilotes et la mise en file d’attente des requêtes dans un environnement multitâche, réentrant, multiprocesseur. Toutefois, certains minidrivers ne doivent pas l’utiliser. Deux exemples sont fournis dans la rubrique Exemples de synchronisation qui illustrent ce qu’un minidriver doit faire en ce qui concerne la synchronisation.

La désactivation de la synchronisation des classes de flux signifie que toutes les requêtes sont appelées immédiatement et de manière asynchrone sur le minidriver dans le contexte du thread d’envoi à PASSIVE_LEVEL. Les exceptions à la règle précédente sont les routines HwCancelPacket, TimeoutHandler et Timer. Elles sont appelées au niveau DISPATCH_LEVEL. Une dernière exception est le gestionnaire d’interruptions, qui est appelé à DIRQL.

Lorsque la synchronisation est désactivée, le minidriver est responsable de l’exécution de la synchronisation en conformité avec le modèle WDM. Si un minidriver est rappelé à PASSIVE_LEVEL, il peut ensuite être préempté par des événements IRQL de niveau supérieur, tels que les DPC ou les interruptions. De même, si un minidriver est rappelé à DISPATCH_LEVEL, il peut par la suite être préempté par des interruptions. Les fonctions minidriver qui manipulent des ressources partagées doivent synchroniser les accès.

Plusieurs requêtes peuvent être émises simultanément sur les mêmes flux ou différents lorsque la synchronisation de classes de flux est désactivée. Le minidriver doit mettre en file d’attente ses propres requêtes et gérer toute synchronisation matérielle avec d’autres threads et l’ISR. Les spinlocks, mutex et KeSynchronizeExecution sont quelques-uns des objets de synchronisation disponibles pour les minidrivers de flux fonctionnant sans synchronisation de classe de flux.