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


Правило RemoveLockMnSurpriseRemove (wdm)

Правило RemoveLockMnSurpriseRemove проверяет правильное использование вызовов IoAcquireRemoveLock и IoReleaseRemoveLockAndWait при обработке IRP_MJ_PNP с IRP_MN_SUPRISE_REMOVAL MinorFunction. Драйвер должен получить блокировку remove перед перенаправлением 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 необходимо вызвать IoReleaseRemoveLockAndWait. (Это гарантирует, что все блокировки снятия сняты в драйверах устройств.)

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

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

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

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

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

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

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

IoAcquireRemoveLockIoCallDriverIoReleaseRemoveLockPoCallDriverRemoveHeadList