Uso del blocco di selezione annulla del sistema
Il sistema fornisce un singolo blocco di selezione di annullamento, che viene acquisito o rilasciato quando vengono chiamate determinate routine di sistema.
Le routine del driver che modificano lo stato dei runtime di integrazione annullabili, incluse tutte le routine che potrebbero completare un IRP con STATUS_CANCELLED, devono acquisire e rilasciare il blocco spin di annullamento del sistema in base alle linee guida riportate in questa sezione.
Nei driver che usano la coda di dispositivi fornita dal gestore di I/O, qualsiasi routine del driver diversa dalla routine Cancel che modifica lo stato annullabile di un IRP deve prima chiamare IoAcquireCancelSpinLock per acquisire il blocco spin di annullamento del sistema.
L'acquisizione del blocco di selezione di annullamento garantisce che solo il chiamante possa modificare lo stato annullabile di tale IRP. Mentre il chiamante mantiene il blocco di rotazione, il gestore di I/O non può chiamare la routine Cancel del driver per tale IRP. Analogamente, un'altra routine del driver, ad esempio una routine DispatchCleanup , non può tentare contemporaneamente di modificare lo stato annullabile di tale IRP.
Nei driver che gestiscono le proprie code di runtime di integrazione e usano blocchi di selezione forniti dal driver per sincronizzare l'accesso alla coda, le routine del driver non devono acquisire il blocco di selezione annulla prima di chiamare IoSetCancelRoutine. Tuttavia, questi driver devono controllare il puntatore di routine Cancel che IoSetCancelRoutine restituisce per determinare se la routine Cancel è già stata avviata. Per informazioni dettagliate, vedere Uso di un blocco spin Driver-Supplied .
Qualsiasi routine del driver che chiama IoAcquireCancelSpinLock deve chiamare IoReleaseCancelSpinLock appena possibile.
Un driver non deve mai chiamare IoCompleteRequest con un IRP tenendo premuto un blocco di rotazione. Il tentativo di completare un IRP tenendo premuto un blocco di rotazione può causare un deadlock.