Compartir a través de


Sincronización de la cancelación en rutinas de controlador que procesan los IRP

Cualquier rutina de controlador que quite la cola o se llame con un IRP que se mantiene en un estado cancelable, incluida la rutina StartIo de un controlador, debe hacer lo siguiente:

  1. Llame a IoAcquireCancelSpinLock.

  2. Asegúrese de que Irp es igual a DeviceObject-CurrentIrp>. Si no es así, llame a IoReleaseCancelSpinLock y devuelva el control.

    Si los dos no son iguales, es posible que CurrentIrp se haya cancelado entre el momento en que IoStartPacket liberó el bloqueo de giro de cancelación y esta rutina la adquirió.

  3. Llame a IoSetCancelRoutine con un puntero CancelRoutineNULL para quitar el IRP del estado cancelable.

  4. Compruebe el campo Irp-Cancel> para determinar si se debe 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 número de cancelación al llamar a IoSetCancelRoutine. Sin embargo, estos controladores deben comprobar el puntero 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 rutinas StartIo y ControllerControl debe procesar los IRP entrantes en ambas rutinas de controlador, como ya se ha descrito.