Share via


Sincronización de la cancelación de IRP

Desde la perspectiva de un controlador, se puede cancelar un IRP en cualquier momento. La cancelación de IRP se produce de forma asincrónica; por lo tanto, los conductores deben ser capaces de controlar una serie de posibles condiciones de carrera, creados si el IRP se cancela en cualquiera de los puntos siguientes:

  • Después de llamar a una rutina de controlador, pero antes de poner en cola un IRP.

  • Después de llamar a una rutina de controlador, pero antes de intentar procesar un IRP. Por ejemplo, un IRP podría cancelarse después de llamar a la rutina StartIo de un controlador, pero antes de que la rutina StartIo quite el IRP de la cola del dispositivo.

  • Después de que la rutina del controlador pone en cola el IRP, pero antes de iniciar la E/S solicitada.

Tenga en cuenta que, después de que un controlador ponga en cola un IRP y libere los bloqueos de número que protegen la cola, otro subproceso puede acceder y cambiar el IRP. Cuando se reanuda el subproceso original (incluso en cuanto se inicia la siguiente línea de código), es posible que el IRP ya se haya cancelado o cambiado de otro modo.

El controlador puede usar el marco de cola irP seguro para cancelar para implementar la puesta en cola de IRP. A continuación, el sistema registra una rutina Cancel para el controlador que controla automáticamente la sincronización para cancelar IRP de forma segura. Consulte Cancel-Safe IRP Queues (Cancelar colas irP seguras ) para obtener más información. De lo contrario, los controladores deben implementar su propia sincronización.

Los siguientes miembros de un IRP contienen información sobre la cancelación:

  • Irp-> Cancelar indica si se está cancelando un IRP o se debe cancelar.

  • Irp-> CancelRoutine indica si se puede cancelar un IRP. Si este miembro contiene un puntero a una rutina de cancelación, el IRP se puede cancelar. Si este miembro es NULL, el IRP no se puede cancelar. Si este miembro es NULL, pero se establece Irp-Cancel>, eso indica que la rutina de cancelación se está ejecutando y el IRP está en proceso de cancelación.

Si un controlador controla irP cancelables, es responsable de establecer la rutina Cancel adecuada en cada IRP que contiene en un estado cancelable.

En esta sección se incluyen los temas siguientes sobre la sincronización de la cancelación de IRP.

Usar el bloqueo de número de cancelación del sistema

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

Sincronización de la cancelación en controladores de Higher-Level sin rutinas de cancelación

Uso de un bloqueo de número de Driver-Supplied