Appel de routines de support qui utilisent des verrous de rotation
L’appel de KeAcquireSpinLock ou KeAcquireInStackQueuedSpinLock définit l’IRQL sur le processeur actuel sur DISPATCH_LEVEL jusqu’à ce qu’un appel correspondant à KeReleaseSpinLock ou KeReleaseInStackQueuedSpinLock restaure l’IRQL précédent. Par conséquent, les pilotes doivent s’exécuter sur IRQL <= DISPATCH_LEVEL lorsqu’ils appellent KeAcquireSpinLock ou KeAcquireInStackQueuedSpinLock.
Les appelants de KeAcquireSpinLockAtDpcLevel, KeAcquireInStackQueuedSpinLockAtDpcLevel, KeReleaseInStackQueuedSpinLockFromDpcLevel et KeReleaseSpinLockFromDpcLevel s’exécutent plus rapidement, car ils s’exécutent déjà sur IRQL = DISPATCH_LEVEL de sorte que ces routines de prise en charge n’ont pas besoin de réinitialiser IRQL sur le processeur actuel. Par conséquent, il s’agit d’une erreur irrécupérable sur la plupart des plateformes Windows d’appeler KeAcquireSpinLockAtDpcLevel ou KeAcquireInStackQueuedSpinLockAtDpcLevel lors de l’exécution à IRQL inférieure à DISPATCH_LEVEL. La libération d’un verrou de rotation acquis avec KeAcquireSpinLock en appelant KeReleaseSpinLockFromDpcLevel est également une erreur, car l’IRQL d’origine de l’appelant n’est pas restauré.
Les routines qui contiennent un verrou de rotation exécutif, comme l’ExInterlockedXxx, s’exécutent généralement à IRQL = DISPATCH_LEVEL jusqu’à ce qu’elles libèrent le verrou de rotation et retournent le contrôle à l’appelant. Toutefois, il est possible pour la routine InterruptService d’un pilote et les routines SynchCritSection (qui s’exécutent sur DIRQL) d’appeler certaines routines ExInterlockedXxx, telles que les routines ExInterlockedXxxList, tant que le verrouillage de rotation passé à la routine est utilisé exclusivement par les routines ISR et SynchCritSection.
Chaque routine qui contient un verrou de rotation d’interruption s’exécute au niveau du DIRQL d’un ensemble d’objets d’interruption associé. Par conséquent, un pilote ne doit pas appeler KeAcquireSpinLock et KeReleaseSpinLock ni toute autre routine qui utilise un verrou de rotation exécutif à partir de ses routines ISR ou SynchCritSection . Un tel appel est une erreur qui peut provoquer un interblocage du système, obligeant l’utilisateur à redémarrer son ordinateur. Notez que si la routine ISR ou SynchCritSection d’un pilote appelle une routine de liste ExInterlockedXxx, le pilote ne peut pas réutiliser le verrou de rotation qu’il transmet aux routines de liste ExInterlockedXxx dans les appels aux routines de prise en charge KeXxxSpinLock ou KeXxxSpinLockXxxDpcLevel.
Si un pilote a un ISR multivéticeur ou plusieurs ISR, ses routines peuvent appeler KeSynchronizeExecution lors de l’exécution à n’importe quel IRQL jusqu’à la valeur SynchronizeIrql spécifiée pour les objets d’interruption associés lorsqu’ils ont été connectés.