Правило MarkingQueuedIrps (wdm)
Правило MarkingQueuedIrps указывает, что драйвер вызывает IoMarkIrpPending для IRP, который требует дальнейшей обработки только при удержании спиновой блокировки. Это правило применяется только в том случае, если драйвер добавляет IRP в очередь, управляемую драйвером.
В частности, драйвер нарушает это правило только в том случае, если происходят все перечисленные ниже события.
Драйвер вызывает KeAcquireSpinLock или KeAcquireInStackQueuedSpinLock , чтобы получить спиновую блокировку.
Драйвер вызывает одну из следующих процедур, чтобы добавить IRP в управляемую драйвером очередь:
Драйвер вызывает KeReleaseSpinLock или KeReleaseInStackQueuedSpinLock , чтобы освободить спиновую блокировку перед вызовом IoMarkIrpPending.
Драйвер возвращает состояние STATUS_PENDING для IRP.
Драйверы должны вызывать IoMarkIrpPending для очереди IRP только при удержании спин-блокировки. В противном случае IRP может быть выведен из очереди, завершен другой подпрограммой драйвера и освобожден системой до вызова IoMarkIrpPending , что приведет к сбою.
Дополнительные сведения см. в разделе Синхронизация отмены IRP.
Модель драйвера: WDM
Как тестировать
Во время компиляции |
---|
Запустите средство проверки статических драйверов и укажите правило MarkingQueuedIrps . Чтобы выполнить анализ кода, выполните следующие действия.
Дополнительные сведения см. в статье Использование средства проверки статических драйверов для поиска дефектов в драйверах. |
Применяется к
InsertHeadListIoCallDriverIoMarkIrpPendingKeAcquireInStackQueuedSpinLockKeAcquireSpinLockKeInsertByKeyDeviceQueueKeInsertDeviceQueueKeInsertQueueDpcKeReleaseInStackQueuedSpinLockKeReleaseSpinLockPoCallDriverRemoveHeadList