Правило RemoveLockQueryMnRemove (wdm)
Правило RemoveLockQueryMnRemove проверяет правильное использование вызовов IoAcquireRemoveLock и IoReleaseRemoveLock при обработке IRP_MJ_PNP с IRP_MN_QUERY_REMOVE_DEVICE MinorFunction. Драйвер должен получить блокировку remove перед перенаправлением IRP вниз стека.
Это правило применяется только к драйверам FDO и FIDO.
Например, рассмотрим стек драйверов PnP, который состоит из драйвера фильтра, FDO и PDO.
Диспетчер PnP отправляет запрос на удаление через стек. FDO включен в режим простоя во время работы системы. FDO принимает решение о выключении питания в удаленном состоянии запроса, поэтому он запрашивает D0 IRP. Перед поступлением D0 IRP диспетчер PnP отправляет IRP удаления PnP, и этот IRP обрабатывается драйвером фильтра. Драйвер фильтра отсоединяется от стека и очищает его состояние. D0 поступает в верхнюю часть стека, но драйвер фильтра не отправляет его вниз по стеку, так как у него нет контекста или данных, чтобы узнать, куда его отправлять. FDO висит в ожидании d0 IRP, чтобы прибыть, но что IRP никогда не будет.
Чтобы избежать этой ошибки
Прежде чем устройство будет отсоединяться от стека устройств, ioAcquireRemoveLock должно завершиться успешно, прежде чем IRP будет перенаправляться в стек для следующих типов IRP:
- IRP_MN_QUERY_REMOVE
- IRP_MN_SUPRISE_REMOVAL
- IRP_MN_REMOVE_DEVICE
Перед вызовом IoDetachDevice или IoDeleteDevice необходимо вызвать IoReleaseRemoveLockAndWait. (Это гарантирует, что все блокировки снятия сняты в драйверах устройств.)
Модель драйвера: WDM
Как тестировать
Во время компиляции |
---|
Запустите средство проверки статических драйверов и укажите правило RemoveLockQueryMnRemove . Выполните следующие действия, чтобы выполнить анализ кода.
Дополнительные сведения см. в разделе Использование средства проверки статических драйверов для поиска дефектов в драйверах. |
Применяется к
IoAcquireRemoveLockIoCallDriverIoReleaseRemoveLockPoCallDriver