Partager via


Synchronisation du minidriver

Les développeurs de minidriver de 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 opter pour 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 parties du code minidriver ne sont jamais exécutées simultanément. Le pilote de classe met en file d’attente toutes les demandes de flux et les transmet au minidriver une par une.

L’un des objectifs de cette synchronisation est d’éviter au rédacteur de minidriver d’avoir à gérer tous les détails de la synchronisation des pilotes et de demander la file d’attente dans un environnement multitâche, réentrant et multiprocesseur. Toutefois, certains minidrivers ne devraient 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 immédiatement et asynchronement appelées vers le bas vers 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 DISPATCH_LEVEL. Une dernière exception est le gestionnaire d’interruptions, appelé au niveau DIRQL.

Lorsque la synchronisation est désactivée, le minidriver est chargé d’effectuer la synchronisation conformément au modèle WDM. Si un minidriver est rappelé à PASSIVE_LEVEL, il peut alors être préempté par des événements IRQL plus élevés tels que des DPC ou des interruptions. De même, si un minidriver est rappelé à DISPATCH_LEVEL, il peut ensuite être préempté par des interruptions. Les fonctions minidriver qui manipulent des ressources partagées doivent synchroniser les accès.

Plusieurs demandes peuvent être émises simultanément vers le même flux ou des flux différents lorsque la synchronisation de classe de flux est désactivée. Le minidriver doit mettre en file d’attente ses propres demandes et gérer toute synchronisation matérielle avec d’autres threads et l’ISR. Les verrous de rotation, les mutexes et KeSynchronizeExecution sont quelques-uns des objets de synchronisation disponibles pour diffuser en continu des mini-disques s’exécutant sans synchronisation de classe de flux.