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.
La tentative d’acquisition d’un verrou de rotation récursive est garantie de provoquer un blocage. Pour plus d’informations sur les verrous de rotation, consultez Spin Locks.

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)

Voir aussi

KeAcquireInStackQueuedSpinLock

KeAcquireSpinLockAtDpcLevel

KeInitializeSpinLock

KeReleaseSpinLock