Partager via


Synchronisation du code d’interruption (UMDF 1)

Avertissement

UMDF 2 est la dernière version d’UMDF et remplace UMDF 1. Tous les nouveaux pilotes UMDF doivent être écrits à l’aide d’UMDF 2. Aucune nouvelle fonctionnalité n’est ajoutée à UMDF 1 et la prise en charge d’UMDF 1 est limitée sur les versions plus récentes de Windows 10. Les pilotes Windows universels doivent utiliser UMDF 2.

Les exemples UMDF 1 archivés se trouvent dans la Windows 11, version 22H2 - Mise à jour des exemples de pilotes de mai 2022.

Pour plus d’informations, consultez Prise en main avec UMDF.

Tout le code de pilote qui accède à la mémoire tampon de données d’interruption doit être synchronisé afin qu’une seule routine accède aux données à la fois.

Vous pouvez synchroniser le code d’interruption à l’aide du verrouillage d’interruption manuel ou de la sérialisation automatique du rappel.

Verrouillage manuel des interruptions

UMDF acquiert le verrou d’interruption avant d’appeler les rappels OnInterruptIsr, OnInterruptDisable ou OnInterruptEnable .

Si un pilote doit synchroniser un code à l’aide du verrou d’interruption, il appelle IWDFInterrupt::AcquireInterruptLock et IWDFInterrupt::ReleaseInterruptLock. Par exemple, un pilote acquiert et libère le verrou d’interruption dans sa routine de rappel OnInterruptWorkItem à l’aide de ces méthodes. Toutefois, dans les rappels de distribution d’E/S (tels que OnRead et OnWrite), le pilote appelle D’abord IWDFInterrupt::TryToAcquireInterruptLock pour décider s’il faut mettre en file d’attente un élément de travail ou effectuer le travail dans le même thread afin d’éviter un blocage potentiel. Pour obtenir un exemple de scénario d’interblocage pouvant être provoqué par l’appel de IWDFInterrupt::AcquireInterruptLock à partir d’un contexte de thread arbitraire, consultez la section Remarques de IWDFInterrupt::AcquireInterruptLock.

Si IWDFInterrupt::TryToAcquireInterruptLock retourne TRUE, le pilote a acquis le verrou d’interruption dans le même thread. Dans ce cas, le pilote effectue le travail qui a requis ce verrouillage, puis appelle ReleaseInterruptLock. Si IWDFInterrupt::TryToAcquireInterruptLock retourne FALSE, le pilote met en file d’attente un élément de travail et effectue le travail dans son rappel OnWorkItem . Dans ce cas, l’élément de travail ne doit pas utiliser la sérialisation automatique.

Utilisation de la sérialisation automatique

Un pilote UMDF peut demander la synchronisation de rappel automatique en appelant IWDFDeviceInitialize::SetLockingConstraint avec le paramètre LockType défini sur WdfDeviceLevel.

Le pilote définit ensuite le membre AutomaticSerialization de sa structure WUDF_INTERRUPT_CONFIG sur TRUE avant d’appeler CreateInterrupt.

Par conséquent, UMDF sérialise les rappels OnInterruptWorkItem du pilote avec la file d’attente d’E/S, l’annulation de la demande et les routines de rappel d’objet de fichier. Dans ce scénario, UMDF utilise le verrou de rappel au lieu d’un verrou d’objet par interruption.