Правило RemoveLockMnRemove2 (wdm)

Правило RemoveLockMnRemove2 проверяет, правильно ли используются вызовы IoAcquireRemoveLock и IoReleaseRemoveLockAndWait при обработке запроса IRP_MN_REMOVE_DEVICE перед перенаправлением IRP в более низкие драйверы.

Это правило применяется только к драйверам FDO и FIDO.

Например, рассмотрим стек драйверов PnP, состоящий из драйвера фильтра, FDO и PDO.

Диспетчер PnP отправляет запрос на удаление через стек. Функция FDO включена в режим простоя во время работы системы. FDO решает отключиться в удаленном состоянии запроса, поэтому запрашивает D0 IRP. Перед поступлением D0 IRP диспетчер PnP отправляет IRP удаления PnP, и этот IRP обрабатывается драйвером фильтра. Драйвер фильтра отсоединяется от стека и очищает его состояние. D0 поступает в верхнюю часть стека, но драйвер фильтра не отправляет его в стек, так как у него нет контекста или данных, чтобы узнать, куда его отправлять. FDO висит в ожидании d0 IRP, чтобы прибыть, но что IRP никогда не будет.

Чтобы избежать этой ошибки

  1. Перед отсоединение устройства от стека устройств ioAcquireRemoveLock должно быть выполнено до перенаправления IRP в стек для следующих типов IRP:

    • IRP_MN_QUERY_REMOVE
    • IRP_MN_SUPRISE_REMOVAL
    • IRP_MN_REMOVE_DEVICE
  2. Перед вызовом IoDetachDevice или IoDeleteDevice необходимо вызвать IoRemoveLockAndWait. (Это гарантирует, что все блокировки снятия сняты в драйверах устройств.)

Модель драйвера: WDM

Как тестировать

Во время компиляции

Запустите средство проверки статических драйверов и укажите правило RemoveLockMnRemove2 .

Чтобы выполнить анализ кода, выполните следующие действия.
  1. Подготовьте код (используйте объявления типов ролей).
  2. Запустите средство проверки статических драйверов.
  3. Просмотр и анализ результатов.

Дополнительные сведения см. в статье Использование средства проверки статических драйверов для поиска дефектов в драйверах.

Применяется к

IoAcquireRemoveLockIoCallDriverIoReleaseRemoveLockReleaseRemoveLockAndWaitPoCallDriver