Обработка событий PnP и событий управления питанием в драйвере протокола
Когда операционная система выдает пакет запроса Plug and Play (PnP) или IRP управления питанием целевому объекту устройства, который представляет сетевой интерфейс карта (NIC), NDIS перехватывает IRP. NDIS указывает событие для каждого связанного драйвера протокола и каждого связанного промежуточного драйвера путем вызова функции ProtocolNetPnPEvent драйвера. При вызове ProtocolNetPnPEvent NDIS передает указатель на NET_PNP_EVENT_NOTIFICATION , содержащий структуру NET_PNP_EVENT. Структура NET_PNP_EVENT описывает событие PnP или событие управления питанием. Дополнительные сведения об интерфейсе PnP драйвера протокола см. в разделе Обработка уведомлений о событиях PnP в драйвере протокола.
Следующий список содержит события PnP и управления питанием, как указано в коде NetEvent в структуре NET_PNP_EVENT:
NetEventSetPower
Указывает запрос на настройку питания, который указывает, что адаптер минипорта должен перейти в определенное состояние питания. Драйвер протокола, поддерживающий управление питанием, всегда должен выполнять это событие, возвращая NDIS_STATUS_SUCCESS. Старый драйвер протокола может вернуть NDIS_STATUS_NOT_SUPPORTED, чтобы указать, что NDIS должен отменить привязку к адаптеру мини-порта.
После отправки запроса на питание NDIS приостанавливает стек драйверов, если адаптер минипорта переходит в состояние с низким энергопотреблением. NDIS перезапускает стек драйверов перед запросом set-power, если адаптер минипорта переходит в рабочее состояние (D0). Дополнительные сведения о приостановке и перезапуске стека драйверов см. в разделе Приостановка стека драйверов.
Если адаптер мини-порта находится в малом энергопотреблении, драйвер протокола не может выдавать запросы OID. Это требование является дополнительным ограничением управления питанием, которое добавляется к другим ограничениям, которые применяются, когда стек драйверов находится в состоянии Приостановлено.
Если базовый адаптер минипорта не поддерживает управление питанием, драйвер мини-порта устанавливает для элемента PowerManagementCapabilitiesNDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTESзначение NULL , а NDIS — для элемента PowerManagementCapabilitiesNDIS_BIND_PARAMETERSзначение NULL.
Примечание Начиная с версии NDIS 6.30, после уведомления об этом событии драйвер протокола должен прекратить создание новых запросов ввода-вывода и не ждать завершения ожидающих запросов ввода-вывода в контексте вызова ProtocolNetPnPEvent.
Дополнительные сведения о событиях set-power см. в разделе Обработка событий PnP и событий управления питанием в промежуточном драйвере.
NetEventQueryPower
Указывает запрос на питание запроса, который запрашивает, может ли базовый адаптер минипорта перейти в определенное состояние питания. Драйвер протокола всегда должен успешно выполнять NetEventQueryPower . После установки активного подключения драйвер протокола может вызвать PoRegisterSystemState для регистрации состояния непрерывной занятости. До тех пор, пока действует государственная регистрация, диспетчер питания не пытается переводить систему в спящий режим. Когда подключение становится неактивным, драйвер протокола отменяет регистрацию состояния, вызывая PoUnregisterSystemState. Драйвер протокола никогда не должен пытаться предотвратить переход системы в спящее состояние путем сбоя NetEventQueryRemoveDevice. Обратите внимание, что за NetEventQueryPower всегда следует NetEventSetPower. NetEventSetPower, задающий текущее состояние питания устройства, фактически отменяет NetEventQueryPower.
Примечание Начиная с версии NDIS 6.30, после уведомления об этом событии драйвер протокола не должен ждать завершения любых ожидающих запросов ввода-вывода в контексте вызова ProtocolNetPnPEvent.
NetEventQueryRemoveDevice
Указывает запрос на удаление устройства, который запрашивает возможность удаления сетевой карты без нарушения работы. Если драйвер протокола не может освободить устройство (например, из-за того, что устройство используется), он должен завершить ошибку NetEventQueryRemoveDevice , возвратив NDIS_STATUS_FAILURE.
NetEventCancelRemoveDevice
Указывает запрос отмены удаления устройства, который отменяет удаление базового сетевого адаптера. Драйвер протокола всегда должен выполнять это событие, возвращая NDIS_STATUS_SUCCESS.
NetEventReconfigure
Указывает, что конфигурация для сетевого компонента изменилась. Например, если пользователь изменяет IP-адрес для TCP/IP, NDIS указывает это событие на протокол TCP/IP с помощью кода NetEventReconfigure . Драйвер протокола может в редких случаях возвращать код сбоя, если он не может применить указанные изменения конфигурации и нет доступных значений по умолчанию. Неудачная попытка выделить память является примером случая, когда протокол возвращает код сбоя. Возврат кода ошибки может привести к тому, что пользователю будет предложено перезапустить систему.
Протокол должен проверять данные, связанные с NetEventReconfigure, переданные его функции ProtocolNetPnPEvent . Дополнительные сведения о таких данных см. в разделе NET_PNP_EVENT для драйверов протоколов.
NetEventBindList
Указывает драйверу протокола, что порядок обработки списка привязок был перенастроен. Этот список указывает относительный порядок применения к привязкам протокола при обработке, например, запроса пользователя, который может быть перенаправлен в одну из нескольких привязок. Буфер, передаваемый с этим событием, содержит список имен устройств, отформатированных в виде строк Юникода, завершаемых значением NULL. Формат каждого имени устройства идентичен параметру DeviceName , который передается вызову ProtocolBindAdapterEx.
Протокол должен проверять данные, связанные с NetEventBindList, переданные его функции ProtocolNetPnPEvent . Дополнительные сведения о таких данных см. в разделе NET_PNP_EVENT для драйверов протоколов.
Протокол должен проверять данные, связанные с NetEventBindList, переданные его функции ProtocolNetPnPEvent . Дополнительные сведения о таких данных см. в разделе NET_PNP_EVENT для драйверов протоколов.
NetEventBindsComplete
Указывает, что драйвер протокола привязывается ко всем сетевым адаптерам, к которым он может привязаться. NDIS не будет указывать больше привязок к драйверу протокола, если, например, сетевой адаптер PnP не подключен к системе.
NetEventPnPCapabilities
Указывает, что пользователь включил или отключил возможности пробуждения базового адаптера. (Параметр ProtocolBindingContext , который NDIS передает в ProtocolNetPnPEvent , указывает привязку .)
NetEventPause
Указывает, что указанная привязка протокола должна перейти в состояниеPausing. Привязка перейдет в состояние Приостановлено после того, как NDIS завершит все незавершенные запросы на отправку привязки. Дополнительные сведения о приостановке привязки см. в разделе Приостановка привязки.
NetEventRestart
Указывает, что указанная привязка протокола перешла в состояние Перезапуск. Когда драйвер протокола будет готов к возобновлению операций отправки и получения для привязки, привязка переходит в состояние Выполняется. Дополнительные сведения о перезапуске привязки см. в разделе Перезапуск привязки.
NetEventPortActivation
Указывает активацию списка портов, связанных с указанной привязкой. Дополнительные сведения о приостановке привязки см. в разделе Обработка события PnP активации порта.
NetEventPortDeactivation
Указывает на деактивацию списка портов, связанных с указанной привязкой. Дополнительные сведения о приостановке привязки см. в разделе Обработка события PnP деактивации порта.
NetEventIMReEnableDevice
Указывает, что конфигурация изменилась для виртуального мини-порта промежуточного драйвера NDIS 6.0 или более поздней версии. NetEventIMReEnableDevice похож на событие NetEventReconfigure , за исключением того, что промежуточный драйвер получает это событие для одного виртуального мини-порта, а событие NetEventReconfigure применяется ко всем виртуальным минипортам промежуточного драйвера. Например, промежуточный драйвер получает событие NetEventIMReEnableDevice, когда пользователь отключает, а затем включает один виртуальный мини-порт из диспетчер устройств или другого источника. Примеры управления питанием промежуточных драйверов см. в примерах NDIS MUX Intermediate Driver and Notify Object Driver в репозитории примеров драйверов Windows на сайте GitHub.
Элемент Buffer структуры NET_PNP_EVENT указывает на буфер, содержащий сведения, относящиеся к указанному событию.
Драйвер протокола может выполнять вызов ProtocolNetPnPEvent асинхронно с помощью NdisCompleteNetPnPEvent.