Freigeben über


KeAcquireSpinLock-Makro (wdm.h)

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

Syntax

void KeAcquireSpinLock(
  SpinLock,
  OldIrql
);

Die Parameter

SpinLock

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

OldIrql

Zeiger auf eine KIRQL-Variable, die auf den aktuellen IRQL festgelegt ist, wenn dieser Aufruf auftritt.

Rückgabewert

Nichts

Bemerkungen

KeAcquireSpinLock setzt zuerst die IRQL auf DISPATCH_LEVEL zurück und erwirbt dann die Sperre. Die vorherige IRQL wird nach dem Erwerb der Sperre in OldIrql geschrieben.

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

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

Drehsperren können schwerwiegende Probleme verursachen, wenn sie nicht sorgfältig verwendet werden. Insbesondere wird kein Deadlockschutz ausgeführt, und die Verteilerfunktion wird deaktiviert, während die Drehsperre gehalten wird. Deshalb:

  • Der Code innerhalb eines kritischen Bereichs, der durch eine Drehsperre geschützt ist, darf weder seitenfähig sein noch Verweise auf seitenfähige Daten erstellen.

  • Der Code innerhalb eines kritischen Bereichs, der durch eine Drehungssperre geschützt ist, kann weder externe Funktionen aufrufen, die auf seitenfähige Daten zugreifen oder eine Ausnahme auslösen können, noch können Ausnahmen generiert werden.

  • Der Anrufer sollte die Drehsperre mit KeReleaseSpinLock so schnell wie möglich freigeben.

Wenn Sie versuchen, eine Drehsperre rekursiv zu erwerben, wird garantiert ein Deadlock verursacht. Weitere Informationen zu Drehsperren finden Sie unter Spin Locks.

Anforderungen

Anforderung Wert
Zielplattform universell
Überschrift wdm.h (einschließlich Wdm.h, Ntddk.h, Ntifs.h)
Bibliothek Hal.lib
IRQL <= DISPATCH_LEVEL
DDI-Complianceregeln 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)

Siehe auch

KeAcquireInStackQueuedSpinLock

KeAcquireSpinLockAtDpcLevel

KeInitializeSpinLock

KeReleaseSpinLock

Drehsperren