Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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) |