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


Отключение порта NDIS

Чтобы отключить порты NDIS, драйвер минипорта отправляет событие деактивации порта Plug and Play (PnP) в NDIS. После успешной активации порта минипорт-драйвер должен отключить порт, прежде чем его можно будет освободить. Кроме того, драйвер может отключить порт по причинам, связанным с конкретным приложением. Порт можно повторно активировать после деактивации, но порт нельзя повторно активировать, если он освобожден.

Чтобы отправить событие деактивации порта PnP, драйверы минипорта используют код события PnP NetEventPortDeactivation в вызове функции NdisMNetPnPEvent. Чтобы отключить порты, драйвер минипорта должен задать члены структуры NET_PNP_EVENT_NOTIFICATION, на которую указывает параметр NetPnPEvent функции NdisMNetPnPEvent.

номерПорта
Исходный порт уведомления о событии. Задайте для этого элемента нулевое значение, так как номера портов указаны в элементе буфера структуры, указанной элементом NetPnPEvent.

NetPnPEvent
Структура NET_PNP_EVENT, описывающая событие деактивации порта. Задайте элементы этой структуры следующим образом:

NetEvent
Код события, описывающий событие. Задайте для этого члена значение NetEventPortDeactivation.

буфер
Указатель на массив элементов с типом NDIS_PORT_NUMBER. Массив содержит номера портов всех портов, которые драйвер мини-порта деактивирует.

BufferLength
Количество байтов, указанных в буфере . Задайте BufferLength размер массива, на который указывает буфер. Чтобы получить количество элементов в массиве, разделите значение в BufferLength на размер типа данных NDIS_PORT_NUMBER.

Другие члены
Задайте для остальных членов NET_PNP_EVENT значение NULL.

Минипорт-драйвер может предоставить массив со списком портов для деактивации. Однако если порт мини-адаптера по умолчанию является целью события NetEventPortDeactivation PnP, этот порт должен быть единственным портом, указанным в массиве.

Драйверы минипортов могут деактивировать активные порты в любое время. Тем не менее, прежде чем мини-порт драйвер деактивирует порт, он должен убедиться, что нет незавершённых индикаторов состояния или индикаторов приёма, связанных с этим портом. После отправки события деактивации порта PnP драйвер мини-порта не должен инициировать какие-либо состояния или получать признаки, связанные с деактивированными портами.

Минипортный драйвер также может повторно активировать порт. Дополнительные сведения об активации портов NDIS см. в разделе Активация портов NDIS.

Если минипорт-драйвер деактивирует порты, NDIS уведомляет все драйверы протокола, привязанные к нему, с событием PnP NetEventPortDeactivation. Это событие PnP выводит список тех портов, которые изменились на выделенное состояние и не включают порты, которые уже деактивированы. Дополнительные сведения о том, как обрабатывать PnP-событие деактивации порта в драйвере протокола, см. в разделе Обработка события деактивации порта.

Перед тем как минипорт-драйвер выделит порт NDIS, драйвер должен вызвать функцию NdisMSetMiniportAttributes, чтобы задать атрибуты регистрации в структуре NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES. Драйверы минипорта могут управлять активацией порта по умолчанию, задав флаг атрибута NDIS_MINIPORT_CONTROLS_DEFAULT_PORT при вызове NdisMSetMiniportAttributes. Если драйвер минипорта несет ответственность за активацию порта по умолчанию и драйвер минипорта активировал порт по умолчанию, он должен отключить порт по умолчанию перед возвратом из функции MiniportHaltEx.

Все порты, указанные массивом элементов NDIS_PORT_NUMBER, должны находиться в активированном состоянии. Минипорт-драйвер не должен пытаться деактивировать порт, который уже деактивирован.

Если NDIS не удается отключить порты в массиве портов, ни один из портов в массиве портов не изменит состояние. Если деактивация завершается ошибкой из-за отсутствия некоторых указанных портов, функция NdisMNetPnPEvent возвращает значение NDIS_STATUS_INVALID_PORT. Если деактивация завершается ошибкой, так как некоторые порты не находятся в активированном состоянии, NdisMNetPnPEvent возвращает значение NDIS_STATUS_INVALID_PORT_STATE.

Пока вызов NdisMNetPnPEvent не завершён, порт не деактивирован, и минипорт-драйверы должны иметь возможность обрабатывать запросы OID и отправлять запросы, связанные с этим портом.

Когда минипорт-драйвер деактивирует порт по умолчанию, NDIS закрывает все привязки между вышележащими драйверами протокола и минипорт-адаптером. Если минипорт пытается отключить порт по умолчанию, а этот порт уже отключен, NdisMNetPnPEvent завершится ошибкой и вернет значение NDIS_STATUS_INVALID_PORT_STATE. Если минипорт-драйвер пытается отключить порт по умолчанию, и этот порт не является единственным в массиве элементов NDIS_PORT_NUMBER, операция NdisMNetPnPEvent завершается с ошибкой и возвращает код возврата NDIS_STATUS_INVALID_PORT. Если драйвер минипорта задает член буфера значение NULL или член BufferLength равным ноль, NDIS отклоняет вызов NdisMNetPnPEvent и возвращает значение NDIS_STATUS_INVALID_PARAMETER.

После успешной деактивации порта порт находится в выделенном состоянии. Минипорт-драйверы не могут указывать полученные данные или состояние порта в выделенном состоянии.