Utilisation du verrou d’annulation de rotation du système
Le système fournit un verrou de rotation d’annulation unique, qui est acquis ou libéré lorsque certaines routines système sont appelées.
Les routines de pilote qui modifient l’état des IRP annulables, y compris toutes les routines qui peuvent terminer un IRP avec STATUS_CANCELLED, doivent acquérir et libérer le verrou d’annulation du spin du système conformément aux instructions de cette section.
Dans les pilotes qui utilisent la file d’attente d’appareils fournie par le gestionnaire d’E/S, toute routine de pilote autre que la routine Cancel qui modifie l’état annulable d’un IRP doit d’abord appeler IoAcquireCancelSpinLock pour acquérir le verrou de rotation d’annulation du système.
L’acquisition du verrou de rotation d’annulation garantit que seul l’appelant peut modifier l’état annulable de cet IRP. Bien que l’appelant conserve le verrou de rotation, le gestionnaire d’E/S ne peut pas appeler la routine Cancel du pilote pour cette IRP. De même, une autre routine de pilote, telle qu’une routine DispatchCleanup , ne peut pas essayer simultanément de modifier l’état annulable de cette IRP.
Dans les pilotes qui gèrent leurs propres files d’attente d’irps et utilisent des verrous de rotation fournis par le pilote pour synchroniser l’accès à la file d’attente, les routines des pilotes n’ont pas besoin d’acquérir le verrou d’annulation de rotation avant d’appeler IoSetCancelRoutine. Toutefois, ces pilotes doivent case activée le pointeur de routine Cancel retourné par IoSetCancelRoutine pour déterminer si la routine Cancel a déjà démarré. Pour plus d’informations, consultez Utilisation d’un verrou de rotation Driver-Supplied .
Toute routine de pilote qui appelle IoAcquireCancelSpinLock doit appeler IoReleaseCancelSpinLock dès que possible.
Un pilote ne doit jamais appeler IoCompleteRequest avec un IRP tout en tenant un verrou de rotation. La tentative d’effectuer une IRP tout en tenant un verrou de rotation peut provoquer un blocage.