Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Per sincronizzare l'accesso a una posizione di memoria a cui si accede sia dall'interno che dall'esterno di una routine CustomThreadedDpc , un driver può usare normali blocchi di selezione o blocchi di selezione 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 irQLs.
Per un normale blocco spin, si applicano le regole seguenti:
Per acquisire e rilasciare lo spin lock, il driver può chiamare KeAcquireSpinLock e KeReleaseSpinLock sia dall'interno che dall'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 gli spin lock in coda sono simili:
Per acquisire e rilasciare lo spin lock, il driver può chiamare KeAcquireInStackQueuedSpinLock e KeReleaseInStackQueuedSpinLock sia all'interno che all'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 vengono chiamati a DISPATCH_LEVEL, vengono eseguiti più velocemente, rispettivamente, di KeAcquireSpinLock e KeAcquireInStackQueuedSpinLock.
Per altre informazioni sui blocchi di selezione, vedere Spin Locks.