BSOD из-за DRIVER_POWER_STATE_FAILURE (9f) с виртуальным драйвером NIC
Я работаю над драйвером виртуального сетевого адаптера NDIS 6, который не обрабатывает IRP_MJ_POWER или IRP_MN_SET_POWER. Драйвер не регистрируется в функции DispatchPower для IRP_MJ_POWER. Он устанавливает это как NULL. Драйвер выполняет управление питанием, используя OID_PNP_CAPABILITIES и OID_PNP_SET_POWER.
Недавно я наблюдал сбой на компьютере с Windows 7 с кодом DRIVER_POWER_STATE_FAILURE (9f). Проведя некоторый анализ, я заметил, что сбой произошел, потому что драйвер не обрабатывал Power IRP (IRP_MJ_POWER) более 10 минут. Это первый раз, когда я заметил эту проблему.
Мне также любопытно узнать больше о доставке IRP_MJ_POWER/IRP_MN_SET_POWER водителям. Обязательно ли для драйверов NDIS обрабатывать эти IRP. Я видел несколько драйверов минипорта, у которых нет функции отправки, зарегистрированной для IRP_MJ_POWER. Если это не является обязательным, и драйверу не нужно регистрировать функцию отправки для IRP_MJ_POWER, при каких условиях может возникнуть такая проблема.
1 ответ
Мини-порты NDIS не (и не могут) обрабатывать IRP напрямую. NDIS обрабатывает их от имени минипорта. В общем, когда вы видите, что система демонстрирует некоторое поведение WDM (например, проверку ошибок, которая говорит о IRP), вам необходимо мысленно преобразовать это в эквивалентные концепции NDIS и обратные вызовы. К сожалению, поначалу это не всегда очевидно - для того, чтобы освоить это, требуется несколько лет работы с NDIS.
В частном случае с 9F - это очень распространенная ошибка проверки сетевого адаптера. Примерно в 70% случаев это происходит из-за того, что драйвер минипорта просочился через NET_BUFFER_LIST и не завершил NBL обратно в NDIS. Это распространенная ошибка в коде, потому что в противном случае нет никаких признаков утечки NBL, и она слишком упускает из виду небольшую утечку.
Приблизительно в 20% случаев 9F в сети вызван застреванием чего-то другого, например застрявшего OID или тупика в MiniportPause. Оставшиеся несколько процентов сетевых 9F вызваны ошибками в драйверах фильтров (которые также имеют тенденцию пропускать NBL) и случайной ошибкой ОС.
При отладке 9F в сетевом драйвере вы должны сосредоточиться (1) на определении того, что конкретно не выполняется, (NBL, OID, вызов функции и т. Д.), А затем (2) выяснить, почему оно не завершается. Иногда вам везет, и команда отладчика ядра !stacks 2 ndis!
есть все стеки в аккуратный маленький тупик для вас, чтобы распутать. В других случаях вам нужно добавить некоторые диагностики / счетчики, чтобы сузить, что случилось с NBL.
Удачи.