Поделиться через


Сбой при проверке состояния драйвера

В следующем примере драйвер использует макрос 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.