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


Удаление сетевого адаптера

Ниже описано, как NDIS участвует в удалении сетевого адаптера:

  1. Диспетчер PnP выдает запрос IRP_MN_QUERY_REMOVE_DEVICE для определения, можно ли удалить сетевой адаптер без нарушения работы компьютера.

  2. Когда NDIS получает этот IRP, он вызывает функцию FilterNetPnPEvent самого низкого драйвера фильтра, подключенного к сетевому адаптеру в стеке драйверов. В этом вызове NDIS указывает код события NetEventQueryRemoveDevice.

    Примечание NDIS выполняет этот шаг только для драйверов фильтров, которые объявляют точку входа для функции FilterNetPnPEvent. Драйвер фильтра объявляет эту точку входа при вызове функции NdisFRegisterFilterDriver.

  3. В контексте вызова функции FilterNetPnPEvent драйвер фильтра должен вызывать NdisFNetPnPEvent для пересылки события NetEventQueryRemoveDevice до следующего драйвера фильтра в стеке драйверов. Это приводит к вызову функции NDIS этого драйвера фильтра FilterNetPnPEvent с кодом события NetEventQueryRemoveDevice.

    Примечание: NDIS выполняет этот шаг только для следующего драйвера фильтра в стеке драйверов, объявляющего точку входа для функции FilterNetPnPEvent.

  4. Каждый драйвер фильтра в стеке драйверов повторяет предыдущий шаг, пока самый высокий драйвер фильтра в стеке не перенаправил событие netEventQueryRemoveDevice.

    В этом случае NDIS вызывает функцию ProtocolNetPnPEvent всех драйверов протокола, связанных с сетевым интерфейсом. В этом вызове NDIS указывает код события NetEventQueryRemoveDevice.

  5. Если драйвер протокола завершает событие NetEventQueryRemoveDevice с ошибкой, возвращая код ошибки NDIS_STATUS_FAILURE из ProtocolNetPnPEvent, NDIS или диспетчер PnP может игнорировать сбой, а затем может успешно завершить запрос IRP_MN_QUERY_REMOVE_DEVICE. Поэтому драйвер протокола должен быть готов к удалению сетевого адаптера, несмотря на отказ драйвера протокола всобытии NetEventQueryRemoveDevice.

  6. Диспетчер PnP выдает запрос IRP_MN_REMOVE_DEVICE на удаление программного представления (объектов устройств и т. д.) сетевого адаптера или запрос IRP_MN_CANCEL_REMOVE_DEVICE на отмену ожидающего удаления. Обратите внимание, что запрос IRP_MN_REMOVE_DEVICE не всегда предшествует запросу IRP_MN_QUERY_REMOVE_DEVICE.

  7. Если диспетчер PnP выдает запрос IRP_MN_CANCEL_REMOVE_DEVICE, NDIS вызывает функцию FilterNetPnPEvent самого низкого драйвера фильтра, подключенного к сетевому адаптеру в стеке драйверов. В этом вызове NDIS указывает код события NetEventCancelRemoveDevice.

    Примечание NDIS выполняет этот шаг только для драйверов фильтров, которые объявляют точку входа для функции FilterNetPnPEvent.

  8. В контексте вызова функции FilterNetPnPEvent драйвер фильтра должен вызвать NdisFNetPnPEvent для пересылки события NetEventCancelRemoveDevice до следующего драйвера фильтра в стеке драйверов. Это заставляет NDIS вызывать функцию драйвера фильтра FilterNetPnPEvent с кодом события NetEventCancelRemoveDevice.

    Примечание: NDIS выполняет этот шаг только для следующего драйвера фильтра в стеке драйверов, объявляющего точку входа для функции FilterNetPnPEvent.

  9. Каждый драйвер-фильтр в стеке драйверов повторяет предыдущий шаг до тех пор, пока верхний драйвер-фильтр в стеке не перенаправит событие NetEventCancelRemoveDevice.

    В этом случае NDIS вызывает функцию ProtocolNetPnPEvent всех драйверов протокола, связанных с сетевым интерфейсом. В этом вызове NDIS указывает код события NetEventCancelRemoveDevice. Этот код события завершает последовательность удаления.

  10. Если диспетчер PnP выдает запрос IRP_MN_REMOVE_DEVICE, NDIS выполняет следующие действия:

    1. Он приостанавливает все драйверы протокола, привязанные к сетевому адаптеру.

    2. Он приостанавливает все драйверы фильтров, подключенные к сетевой адаптеру.

    3. Он приостанавливает мини-драйвер сетевого адаптера.

    4. Он вызывает функцию ProtocolUnbindAdapterEx всех драйверов протоколов, которые привязаны к сетевому интерфейсу.

    5. Он вызывает функцию FilterDetach всех модулей фильтров, присоединенных к NIC.

  11. Если драйвер минипорта был успешно инициализирован, NDIS вызывает функцию miniport driver MiniportHaltEx. NDIS задает для параметра HaltAction функции MiniportHaltEx значение NdisHaltDeviceDisabled.

  12. NDIS отправляет запрос IRP_MN_REMOVE_DEVICE на следующий нижний объект устройства в стеке.

  13. Когда NDIS получает завершенный запрос IRP_MN_REMOVE_DEVICE из следующего нижнего объекта устройства в стеке, NDIS уничтожает объект функционального устройства (FDO), который оно создало для сетевой интерфейсной карты (NIC).