Sincronización de la cancelación en rutinas de controlador que procesan IRP
Cualquier rutina de controlador que se desqueue o se llame con un IRP que se mantiene en un estado cancelable, incluida la rutina StartIo de un controlador, debe hacer lo siguiente:
Llame a IoAcquireCancelSpinLock.
Compruebe que Irp es igual a DeviceObject-CurrentIrp>. Si no es así, llame a IoReleaseCancelSpinLock y devuelva el control.
Si los dos no son iguales, currentIrp podría haberse cancelado entre el momento en que IoStartPacket lanzó el bloqueo de giro de cancelación y esta rutina la adquirió.
Llame a IoSetCancelRoutine con un puntero CancelRoutine NULL para quitar el IRP del estado cancelable.
Compruebe el campo Irp-Cancel> para determinar si desea cancelar el IRP o comenzar a procesar la solicitud de E/S.
Si Irp-Cancel> está establecido en TRUE, haga lo siguiente:
Llame a IoReleaseCancelSpinLock.
Establezca Irp-IoStatus.Status> en STATUS_CANCELLED.
Establezca Irp-IoStatus.Information> en 0.
Llame a IoStartNextPacket (en una rutina StartIo) para iniciar el siguiente paquete.
Llame a IoCompleteRequest con un aumento de prioridad de IO_NO_INCREMENT para completar el IRP.
Si Irp-Cancel> está establecido en FALSE, llame a IoReleaseCancelSpinLock e inicie el procesamiento solicitado de la solicitud de E/S o pase el IRP al siguiente controlador inferior, según corresponda.
Los controladores que administran sus propias colas de IRP, en lugar de usar la cola de dispositivos proporcionada por el administrador de E/S, no necesitan adquirir el bloqueo de giro de cancelación al llamar a IoSetCancelRoutine. Sin embargo, estos controladores deben comprobar el puntero de rutina Cancelar que IoSetCancelRoutine devuelve para determinar si la rutina de cancelación ya se ha iniciado.
En cualquier controlador que controle irP cancelables, todas las rutinas de controlador que procesan un IRP antes de que el dispositivo subyacente se programe para la operación de E/S solicitada deben comprobar el estado cancelable de todos los IRP entrantes. En concreto, un controlador de dispositivo de nivel superior con las rutinas StartIo y ControllerControl debe procesar los IRP entrantes en ambas rutinas de controlador, como ya se ha descrito.