Sincronizzazione e controller di dominio threadati
Per sincronizzare l'accesso a una posizione di memoria accessibile sia dall'interno che dall'esterno di una routine CustomThreadedDpc , un driver può usare blocchi di rotazione ordinari o blocchi di rotazione in coda. In questo caso, il driver deve rispettare determinate regole per eseguire correttamente la sincronizzazione in IRQL = PASSIVE_LEVEL e in IRQL = DISPATCH_LEVEL, perché una routine CustomThreadedDpc può essere eseguita in entrambi i runtime di integrazione.
Per un blocco di rotazione ordinario, si applicano le regole seguenti:
Per acquisire e rilasciare il blocco di selezione, il driver può chiamare KeAcquireSpinLock e KeReleaseSpinLock sia all'interno che all'esterno della routine CustomThreadedDpc .
Il driver può chiamare KeAcquireSpinLockForDpc e KeReleaseSpinLockForDpc dall'interno della routine CustomThreadedDpc . Si noti che la routine CustomThreadedDpc non deve chiamare KeAcquireSpinLockAtDpcLevel o KeReleaseSpinLockFromDpcLevel, perché queste routine possono essere chiamate in modo sicuro solo in IRQL = DISPATCH_LEVEL.
Le regole per i blocchi di rotazione in coda sono simili:
Per acquisire e rilasciare il blocco di selezione, il driver può chiamare KeAcquireInStackQueuedSpinLock e KeReleaseInStackQueuedSpinLock sia dall'interno che dall'esterno della routine CustomThreadedDpc .
Il driver può chiamare KeAcquireInStackQueuedSpinLockForDpc e KeReleaseInStackQueuedSpinLockForDpc dall'interno della routine CustomThreadedDpc . Si noti che la routine CustomThreadedDpc non deve chiamare KeAcquireInStackQueuedSpinLockAtDpcLevel o KeReleaseInStackQueuedSpinLockFromDpcLevel, perché queste routine possono essere chiamate in modo sicuro solo in IRQL = DISPATCH_LEVEL.
Poiché KeAcquireSpinLockForDpc e KeAcquireInStackQueuedSpinLockForDpc non reimpostano l'IRQL quando viene chiamato a DISPATCH_LEVEL, vengono eseguiti più velocemente di KeAcquireSpinLock e KeAcquireInStackQueuedSpinLock, rispettivamente.
Per altre informazioni sui blocchi di rotazione, vedere Blocchi di rotazione.