Деактивация порта NDIS
Чтобы отключить порты NDIS, драйвер мини-порта отправляет событие деактивации порта Plug and Play (PnP) в NDIS. После того как драйвер мини-порта успешно активирует порт, драйвер должен отключить порт, прежде чем он сможет освободить порт. Кроме того, драйвер может отключить порт для конкретных приложений. Порт можно повторно активировать после его деактивации, но порт нельзя повторно активировать, если он освобожден.
Чтобы отправить событие PnP деактивации порта, драйверы miniport используют код события NetEventPortDeactivation PnP в вызове функции NdisMNetPnPEvent . Чтобы отключить порты, драйвер мини-порта должен задать элементы структуры NET_PNP_EVENT_NOTIFICATION , на которую указывает параметр NetPnPEventNdisMNetPnPEvent , следующим образом:
Номер порта
Исходный порт уведомления о событии. Задайте для этого элемента нулевое значение, так как номера портов указаны в элементе Buffer структуры, указанной элементом NetPnPEvent .
NetPnPEvent
Структура NET_PNP_EVENT , описывающая событие деактивации порта. Задайте элементы этой структуры следующим образом:
NetEvent
Код события, описывающий событие. Задайте для этого элемента значение NetEventPortDeactivation.
Буфера
Указатель на массив NDIS_PORT_NUMBER типизированных элементов. Массив содержит номера портов всех портов, которые драйвер мини-порта деактивирует.
BufferLength
Число байтов, указанных в буфере . Задайте для BufferLength размер массива, на который указывает Buffer . Чтобы получить количество элементов в массиве, разделите значение в BufferLength на размер типа данных NDIS_PORT_NUMBER.
Другие члены
Задайте для остальных членов NET_PNP_EVENT значение NULL.
Драйвер мини-порта может предоставить массив со списком портов для деактивации. Однако если порт по умолчанию адаптера мини-порта является целевым для события PnP NetEventPortDeactivation , порт по умолчанию должен быть единственным портом, указанным в массиве.
Драйверы мини-порта могут в любое время отключить активные порты. Тем не менее, прежде чем драйвер минипорта отключит порт, он должен убедиться, что нет индикаторов состояния или получения, связанных с этим портом. После того как драйвер мини-порта отправляет событие 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. Если драйвер минипорта задает для элемента Bufferзначение NULL или элемент BufferLength в значение 0, NDIS завершает вызов NdisMNetPnPEvent и возвращает возвращаемое значение NDIS_STATUS_INVALID_PARAMETER.
После успешной деактивации порта порт находится в выделенном состоянии. Драйверы минипорта не могут указывать полученные данные или состояние порта в выделенном состоянии.