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.
Um den Zugriff auf einen Speicherort zu synchronisieren, auf den sowohl innerhalb als auch außerhalb einer CustomThreadedDpc-Routine zugegriffen wird, kann ein Treiber gewöhnliche Spinlocks oder Warteschlangensperren 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 bei beiden IRQLs ausgeführt werden kann.
Für eine normale Drehsperre gelten die folgenden Regeln:
Um die Drehsperre zu erwerben und freizugeben, 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 bei IRQL = DISPATCH_LEVEL aufgerufen werden können.
Die Regeln für Drehsperren in der Warteschlange sind ähnlich:
Um die Drehsperre zu erwerben und freizugeben, 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 bei IRQL = DISPATCH_LEVEL aufgerufen werden können.
Da KeAcquireSpinLockForDpc und KeAcquireInStackQueuedSpinLockForDpc die IRQL nicht zurücksetzen, wenn sie bei DISPATCH_LEVEL aufgerufen werden, werden sie schneller ausgeführt als KeAcquireSpinLock und KeAcquireInStackQueuedSpinLock.
Weitere Informationen zu Drehsperren finden Sie unter Spin Locks.