无法检查驱动程序的状态

在以下示例中,驱动程序使用 ASSERT 宏在驱动程序映像的调试版本中检查正确的设备状态,但不在同一驱动程序源的零售版本中检查设备状态:

   case IOCTL_WAIT_FOR_EVENT:

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

在调试驱动程序映像中,如果驱动程序已保留 IRP 挂起,系统将断言。 但是,在零售版本中,驱动程序不会检查此错误。 对同一 IOCTL 的两次调用会导致驱动程序失去 IRP 的跟踪。

在多处理器系统上,此代码片段可能会导致其他问题。 假设此例程在输入时拥有 (操作此 IRP) 权限。 当例程将 Irp 指针保存在 Extension-WaitEventIrp> 的全局结构中时,另一个线程可以从该全局结构获取 IRP 地址,并在 IRP 上执行操作。 若要防止此问题,驱动程序应在保存 IRP 之前将 IRP 标记为挂起,并且应在互锁序列中包含对 IoMarkIrpPending 的 调用和分配。 可能还需要 IRP 的 Cancel 例程。