Compartir vía


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 del controlador de depuración, si el controlador ya contiene el IRP pendiente, el sistema se validará. 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 puede causar problemas adicionales. Supongamos que en la entrada esta rutina tiene la propiedad de (el derecho a manipular) de este IRP. Cuando la rutina guarda el puntero Irp en la estructura global de 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 la llamada a IoMarkIrpPending y la asignación en una secuencia interbloqueada. También podría ser necesaria una rutina Cancel para irP.