KeAcquireSpinLock, macro (wdm.h)
La routine KeAcquireSpinLock acquiert un verrou de rotation afin que l’appelant puisse synchroniser l’accès aux données partagées d’une manière sécurisée multiprocesseur en mettant en place l’IRQL.
Syntaxe
void KeAcquireSpinLock(
SpinLock,
OldIrql
);
Paramètres
SpinLock
Pointeur vers un verrou de rotation initialisé KSPIN_LOCK pour lequel l’appelant fournit le stockage.
OldIrql
Pointeur vers une variable KIRQL définie sur l’IRQL actuel lorsque cet appel se produit.
Valeur de retour
None
Remarques
KeAcquireSpinLock réinitialise d’abord l’IRQL à DISPATCH_LEVEL, puis acquiert le verrou. L’IRQL précédent est écrit dans OldIrql après l’acquisition du verrou.
La valeur OldIrql doit être spécifiée lorsque le verrou de rotation est libéré avec KeReleaseSpinLock.
La plupart des pilotes utilisent une variable locale pour stocker l’ancienne valeur IRQL. Un pilote peut également utiliser un emplacement de mémoire partagé, tel qu’une variable globale, mais il ne doit pas utiliser le même emplacement pour deux verrous différents. Sinon, une condition de race peut se produire.
Les verrous de rotation peuvent causer de graves problèmes s’ils ne sont pas utilisés judicieusement. En particulier, aucune protection contre les interblocages n’est effectuée et la répartition est désactivée pendant que le verrou de rotation est tenu. Par conséquent :
- Le code dans une région critique protégée par un verrou de rotation ne doit pas être paginable ni faire référence à des données paginables.
- Le code dans une région critique protégée par un verrou de rotation ne peut pas appeler une fonction externe susceptible d’accéder à des données paginables ou de générer une exception, ni générer d’exceptions.
- L’appelant doit libérer le verrou de rotation avec KeReleaseSpinLock aussi rapidement que possible.
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Disponible à partir de Windows 2000. |
Plateforme cible | Universal |
En-tête | wdm.h (inclure Wdm.h, Ntddk.h, Ntifs.h) |
Bibliothèque | Hal.lib |
IRQL | <= DISPATCH_LEVEL |
Règles de conformité DDI | HwStorPortProhibitedDDIs(storport),IrqlKeDispatchLte(wdm), MarkingQueuedIrps(wdm), ReqSendWhileSpinlock(kmdf), Spinlock(kmdf), Spinlock(kmdf), SpinLock(storport), SpinLock(storport), SpinLock(wdm), SpinlockDpc(kmdf), SpinlockDpc(kmdf), SpinLockDpc(storport), SpinLockDpc(storport), SpinLockDpc(wdm), SpinlockRelease(kmdf), SpinlockRelease(kmdf), SpinLockRelease(storport), SpinLockRelease(storport), SpinlockRelease(wdm), SpinLockSafe(storport), SpinLockSafe(storport), SpinLockSafe(wdm) |