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


Обработка неожиданного удаления сетевой карты

Неожиданное удаление возникает, когда пользователь удаляет карту сетевого интерфейса (NIC) из работающей системы, не уведомляя систему заранее через пользовательский интерфейс.

Драйверы минипортов для Windows Vista и более поздних версий операционной системы должны уметь обрабатывать неожиданные удаления. В частности, минипортовые драйверы NDIS с нижней границей модели драйверов Windows (WDM) должны иметь возможность обрабатывать такие события. Если драйвер минипорта NDIS-WDM не обрабатывает неожиданное удаление, все ожидающие IRP, которые драйвер минипорта отправил базовому драйверу шины до неожиданного удаления, не могут быть завершены.

Для Windows Vista и более поздних версий минипорт-драйвер (например, минипорт-драйвер с нижним уровнем WDM), который не управляет оборудованием напрямую, должен установить флаг атрибута NDIS_MINIPORT_ATTRIBUTES_SURPRISE_REMOVE_OK при вызове NdisMSetMiniportAttributes. Установка этого флага предотвращает отображение предупреждения при неожиданном удалении сетевого адаптера пользователем. Минипорт-драйвер, который не может справиться с неожиданным удалением, не должен устанавливать этот флаг.

Минипорт-драйвер, поддерживающий неожиданное удаление, должен попытаться обнаружить неожиданное удаление во время обычных операций вне контекста MiniportDevicePnPEventNotify. После удаления сетевой карты попытка считывания портов ввода-вывода сетевого адаптера обычно приводит к возвращаемым значениям, имеющим все биты, равные одному. Если минипорт-драйвер считывает такое значение, он должен проверить, присутствует ли оборудование более достоверным образом. Например, минипорт-драйвер может записать значение в порт ввода-вывода, а затем попытаться считывать значение из этого порта. Минипорт-драйвер также может проверить допустимые значения в регистрах ввода-вывода сетевого адаптера. Обнаружение неожиданного удаления таким образом предотвращает зависание минипорт-драйвера в бесконечном цикле при попытке считывать регистры удаленного сетевого интерфейсного контроллера в контексте DPC. Минипорт-драйвер, который перестает отвечать таким образом, мешает NDIS вызывать функцию MiniportDevicePnPEventNotify.