Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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) |