Freigeben über


KeAcquireSpinLock-Makro (wdm.h)

Die KeAcquireSpinLock-Routine ruft eine Drehsperre ab, damit der Aufrufer den Zugriff auf freigegebene Daten auf multiprozessorsichere Weise synchronisieren kann, indem IRQL ausgelöst wird.

Syntax

void KeAcquireSpinLock(
   SpinLock,
   OldIrql
);

Parameter

SpinLock

Zeiger auf eine initialisierte KSPIN_LOCK Drehsperre, für die der Aufrufer den Speicher bereitstellt.

OldIrql

Zeiger auf eine KIRQL-Variable, die bei diesem Aufruf auf die aktuelle IRQL festgelegt ist.

Rückgabewert

Keine

Bemerkungen

KeAcquireSpinLock setzt die IRQL zunächst auf DISPATCH_LEVEL zurück und ruft dann die Sperre ab. Der vorherige IRQL wird nach dem Abrufen der Sperre in OldIrql geschrieben.

Der OldIrql-Wert muss angegeben werden, wenn die Drehsperre mit KeReleaseSpinLock aufgehoben wird.

Die meisten Treiber verwenden eine lokale Variable, um den alten IRQL-Wert zu speichern. Ein Treiber kann auch einen freigegebenen Speicherspeicher verwenden, z. B. eine globale Variable, aber der Treiber darf nicht denselben Speicherort für zwei verschiedene Sperren verwenden. Andernfalls kann eine Racebedingung auftreten.

Spinsperren können schwerwiegende Probleme verursachen, wenn sie nicht vernünftig verwendet werden. Insbesondere wird kein Deadlockschutz ausgeführt und die Verteilung deaktiviert, während die Drehsperre gehalten wird. Deshalb gilt Folgendes:

  • Der Code in einem kritischen Bereich, der durch eine Drehsperre geschützt wird, darf weder ausgelagert werden können noch auf auslagerungsfähige Daten verweisen.
  • Der Code in einem kritischen Bereich, der durch eine Spin-Sperre geschützt wird, kann weder externe Funktionen aufrufen, die auf auslagerungsfähige Daten zugreifen oder eine Ausnahme auslösen, noch kann er Ausnahmen generieren.
  • Der Aufrufer sollte die Drehsperre mit KeReleaseSpinLock so schnell wie möglich freigeben.
Der Versuch, rekursiv eine Spin-Sperre abzurufen, führt garantiert zu einem Deadlock. Weitere Informationen zu Spinlocks finden Sie unter Spinlocks.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Verfügbar ab Windows 2000.
Zielplattform Universell
Header wdm.h (einschließlich Wdm.h, Ntddk.h, Ntifs.h)
Bibliothek Hal.lib
IRQL <= DISPATCH_LEVEL
DDI-Complianceregeln HwStorPortProhibitedDIs(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)

Weitere Informationen

KeAcquireInStackQueuedSpinLock

KeAcquireSpinLockAtDpcLevel

KeInitializeSpinLock

KeReleaseSpinLock