Partager via


Macro KeAcquireSpinLock (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 multiprocesseur sécurisée en générant 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 le runtime d’intégration actuel lorsque cet appel se produit.

Valeur retournée

Aucun

Remarques

KeAcquireSpinLock réinitialise d’abord le runtime d’intégration sur 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ée, tel qu’une variable globale, mais le pilote ne doit pas utiliser le même emplacement pour deux verrous différents. Sinon, une condition de concurrence 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 de blocage n’est effectuée et la répartition est désactivée pendant que le verrou de rotation est conservé. Donc:

  • Le code d’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 d’une région critique protégée par un verrou de rotation ne peut ni appeler aucune fonction externe qui peut accéder aux données paginables ou déclencher une exception, ni générer d’exceptions.

  • L’appelant doit libérer le verrou de rotation avec KeReleaseSpinLock le plus rapidement possible.

La tentative d’acquisition d’un verrou de rotation de manière récursive est garantie pour provoquer un blocage. Pour plus d’informations sur les verrous de rotation, consultez verrouillages de rotation.

Spécifications

Besoin Valeur
plateforme cible Universel
En-tête wdm.h (include 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(kmdf ),SpinLockRelease(storport), SpinLockRelease(storport), SpinlockRelease(wdm), SpinLockSafe(storport), SpinLockSafe(storport), SpinLockSafe(wdm)

Voir aussi

KeAcquireInStackQueuedSpinLock

KeAcquireSpinLockAtDpcLevel

KeInitializeSpinLock

KeReleaseSpinLock

Verrous de rotation