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.
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) |