Synchronisierungs- und Thread-DPCs
Um den Zugriff auf einen Speicherort zu synchronisieren, auf den sowohl innerhalb als auch außerhalb einer CustomThreadedDpc-Routine zugegriffen wird, kann ein Treiber normale Spinsperren oder Spinsperren in der Warteschlange verwenden. Dabei muss der Treiber bestimmte Regeln befolgen, um bei IRQL = PASSIVE_LEVEL und bei IRQL = DISPATCH_LEVEL ordnungsgemäß zu synchronisieren, da eine CustomThreadedDpc-Routine an beiden IRQLs ausgeführt werden kann.
Für eine normale Drehsperre gelten die folgenden Regeln:
Zum Abrufen und Freigeben der Drehsperre kann der Treiber KeAcquireSpinLock und KeReleaseSpinLock sowohl innerhalb als auch außerhalb der CustomThreadedDpc-Routine aufrufen.
Der Treiber kann KeAcquireSpinLockForDpc und KeReleaseSpinLockForDpc aus der CustomThreadedDpc-Routine aufrufen. Beachten Sie, dass die CustomThreadedDpc-RoutinekeAcquireSpinLockAtDpcLevel oder KeReleaseSpinLockFromDpcLevel nicht aufrufen darf, da diese Routinen sicher nur unter IRQL = DISPATCH_LEVEL aufgerufen werden können.
Die Regeln für Spinsperren in der Warteschlange sind ähnlich:
Zum Abrufen und Freigeben der Spin-Sperre kann der Treiber KeAcquireInStackQueuedSpinLock und KeReleaseInStackQueuedSpinLock sowohl innerhalb als auch außerhalb der CustomThreadedDpc-Routine aufrufen.
Der Treiber kann KeAcquireInStackQueuedSpinLockForDpc und KeReleaseInStackQueuedSpinLockForDpc aus der CustomThreadedDpc-Routine aufrufen. Beachten Sie, dass die CustomThreadedDpc-RoutinekeAcquireInStackQueuedSpinLockAtDpcLevel oder KeReleaseInStackQueuedSpinLockFromDpcLevel nicht aufrufen darf, da diese Routinen sicher nur unter IRQL = DISPATCH_LEVEL aufgerufen werden können.
Da KeAcquireSpinLockForDpc und KeAcquireInStackQueuedSpinLockForDpc die IRQL beim Aufruf bei DISPATCH_LEVEL nicht zurücksetzen, werden sie schneller ausgeführt als KeAcquireSpinLock bzw. KeAcquireInStackQueuedSpinLock.
Weitere Informationen zu Spinlocks finden Sie unter Spinlocks.