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