Uso del bloqueo de número de cancelación del sistema
El sistema proporciona un único bloqueo de número de cancelación, que se adquiere o libera cuando se llama a determinadas rutinas del sistema.
Las rutinas de controlador que cambian el estado de los IRP cancelables, incluidas todas las rutinas que podrían completar un IRP con STATUS_CANCELLED, deben adquirir y liberar el bloqueo de giro de cancelación del sistema según las directrices de esta sección.
En los controladores que usan la cola de dispositivos proporcionada por el administrador de E/S, cualquier rutina de controlador distinta de la rutina Cancelar que cambie el estado cancelable de un IRP debe llamar primero a IoAcquireCancelSpinLock para adquirir el bloqueo de número de cancelación del sistema.
La adquisición del bloqueo de número de cancelación garantiza que solo el autor de la llamada pueda cambiar el estado cancelable de ese IRP. Mientras el autor de la llamada mantiene el bloqueo de giro, el administrador de E/S no puede llamar a la rutina Cancel del controlador para ese IRP. Del mismo modo, otra rutina de controlador, como una rutina DispatchCleanup , no puede intentar cambiar simultáneamente el estado cancelable de ese IRP.
En los controladores que administran sus propias colas de IRP y usan bloqueos de número proporcionados por el controlador para sincronizar el acceso a la cola, las rutinas del controlador no necesitan adquirir el bloqueo de número de cancelación antes de llamar a IoSetCancelRoutine. Sin embargo, estos controladores deben comprobar el puntero de rutina Cancelar que IoSetCancelRoutine devuelve para determinar si la rutina Cancel ya se ha iniciado. Consulte Uso de un bloqueo de número de Driver-Supplied para obtener más información.
Cualquier rutina de controlador que llame a IoAcquireCancelSpinLock debe llamar a IoReleaseCancelSpinLock lo antes posible.
Un controlador nunca debe llamar a IoCompleteRequest con un IRP mientras mantiene presionado un bloqueo de número. Si se intenta completar un IRP mientras se mantiene presionado un bloqueo de giro, se puede producir un interbloqueo.