Compartir a través de


Error al comprobar el estado de un controlador

En el ejemplo siguiente, el controlador usa la macro ASSERT para comprobar el estado de dispositivo correcto en una versión de depuración de una imagen de controlador, pero no comprueba el estado del dispositivo en la compilación comercial del mismo origen de controlador:

   case IOCTL_WAIT_FOR_EVENT:

      ASSERT((!Extension->WaitEventIrp));
      Extension->WaitEventIrp = Irp;
      IoMarkIrpPending(Irp);
      status = STATUS_PENDING;

En la imagen de depuración del controlador, si el controlador ya contiene el IRP pendiente, el sistema generará una aserción. Sin embargo, en una compilación comercial, el controlador no comprueba si hay este error. Dos llamadas al mismo IOCTL hacen que el controlador pierda el seguimiento de un IRP.

En un sistema multiprocesador, este fragmento de código podría causar problemas adicionales. Suponga que al inicio esta rutina tiene la propiedad (el derecho a manipular) este IRP. Cuando la rutina guarda el puntero Irp en la estructura global en Extension-WaitEventIrp>, otro subproceso puede obtener la dirección IRP de esa estructura global y realizar operaciones en IRP. Para evitar este problema, el controlador debe marcar el IRP pendiente antes de guardar el IRP y debe incluir tanto la llamada a IoMarkIrpPending como la asignación en una secuencia interbloqueada. También podría ser necesaria una rutina de Cancelar para el IRP.