Правило 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 никогда не будет.
Чтобы избежать этой ошибки
Перед отсоединение устройства от стека устройств ioAcquireRemoveLock должно быть выполнено до перенаправления IRP в стек для следующих типов IRP:
- IRP_MN_QUERY_REMOVE
- IRP_MN_SUPRISE_REMOVAL
- IRP_MN_REMOVE_DEVICE
Перед вызовом IoDetachDevice или IoDeleteDevice необходимо вызвать IoRemoveLockAndWait. (Это гарантирует, что все блокировки снятия сняты в драйверах устройств.)
Модель драйвера: WDM
Как тестировать
Во время компиляции |
---|
Запустите средство проверки статических драйверов и укажите правило RemoveLockMnRemove2 . Чтобы выполнить анализ кода, выполните следующие действия.
Дополнительные сведения см. в статье Использование средства проверки статических драйверов для поиска дефектов в драйверах. |
Применяется к
IoAcquireRemoveLockIoCallDriverIoReleaseRemoveLockReleaseRemoveLockAndWaitPoCallDriver