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


Обработка событий PnP и событий управления питанием в драйвере протокола

Когда операционная система выдает запрос на ввод-вывод Plug and Play (PnP) или запрос на управление питанием для целевого объекта устройства, представляющего собой сетевую карту, NDIS перехватывает этот запрос. NDIS указывает событие для каждого драйвера привязанного протокола и каждого привязанного промежуточного драйвера путем вызова функции ProtocolNetPnPEvent. В вызове ProtocolNetPnPEventNDIS передает указатель на NET_PNP_EVENT_NOTIFICATION, содержащий структуру NET_PNP_EVENT. Структура NET_PNP_EVENT описывает событие PnP или событие управления питанием. Дополнительные сведения об интерфейсе PnP драйвера протокола см. в разделе Обработка уведомлений о событиях PnP в драйвере протокола.

Следующий список содержит события PnP и управления питанием, как указано в коде NetEvent в структуре NET_PNP_EVENT:

  • NetEventSetPower

    Указывает запрос Set Power, указывающий, что минипорт-адаптер должен переходить в определенное состояние питания. Драйвер протокола, поддерживающий управление питанием, всегда должен успешно выполнять это событие, возвращая NDIS_STATUS_SUCCESS. Старый драйвер протокола может вернуть NDIS_STATUS_NOT_SUPPORTED, чтобы указать, что NDIS должен отвязать его от минипорт-адаптера.

    После выдачи запроса на установку питания NDIS приостанавливает стек драйверов, если минипорт-адаптер переходит в состояние низкой мощности. NDIS перезапускает стек драйверов перед запросом на установку режима питания, если минипорт-адаптер переходит в рабочее состояние (D0). Дополнительные сведения о приостановке и перезапуске стека драйверов см. в разделе Pausing a Driver Stack.

    Если мини-адаптер находится в состоянии низкой мощности, драйвер протокола не может выдавать запросы OID. Это требование является дополнительным ограничением управления питанием, которое добавляется к другим ограничениям, которые применяются, когда стек драйверов находится в приостановленном состоянии.

    Если базовый минипорт-адаптер не учитывает управление питанием, драйвер минипорта задает член PowerManagementCapabilitiesNDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES равным NULL, и NDIS задает член PowerManagementCapabilitiesNDIS_BIND_PARAMETERS равным NULL.

    Примечание начиная с NDIS 6.30, после уведомления об этом событии драйвер протокола должен прекратить создание новых запросов ввода-вывода и не должен ждать завершения ожидающих запросов ввода-вывода в контексте вызова ProtocolNetPnPEvent.

    Дополнительные сведения о событиях управления питанием см. в разделе Обработка событий PnP и событий управления питанием в промежуточном драйвере.

  • NetEventQueryPower

    Указывает запрос Power Query, который запрашивает, может ли базовый минипорт-адаптер перейти к определенному состоянию питания. Драйвер протокола должен всегда успешно обрабатывать NetEventQueryPower. После установления активного подключения драйвер протокола может вызывать PoRegisterSystemState для регистрации непрерывного состояния занятости. До тех пор, пока регистрация состояния действует, диспетчер питания не пытается поставить систему в спящий режим. После неактивного подключения драйвер протокола отменяет регистрацию состояния путем вызова PoUnregisterSystemState. Драйвер протокола никогда не должен пытаться предотвратить переход системы в спящее состояние путем сбоя NetEventQueryRemoveDevice. Обратите внимание, что за NetEventQueryPower всегда следует NetEventSetPower. NetEventSetPower, задающий текущее состояние питания устройства, фактически отменяет NetEventQueryPower.

    Примечание начиная с NDIS 6.30, после уведомления об этом событии драйвер протокола не должен ждать завершения ожидающих запросов ввода-вывода в контексте вызова ProtocolNetPnPEvent.

  • NetEventЗапросУдаленияУстройства

    Указывает запрос на удаление устройства, который запрашивает возможность удаления сетевого адаптера без нарушения операций. Если драйвер протокола не может освободить устройство (например, потому что устройство используется), он должен завершить NetEventQueryRemoveDevice с ошибкой, возвращая NDIS_STATUS_FAILURE.

  • NetEventCancelRemoveDevice

    Указывает запрос отмены удаления устройства, который отменяет удаление сетевого интерфейсного контроллера. Драйвер протокола всегда должен успешно выполнять это событие, возвращая NDIS_STATUS_SUCCESS.

  • NetEventReconfigure

    Указывает, что конфигурация изменилась для сетевого компонента. Например, если пользователь изменяет IP-адрес для TCP/IP, NDIS указывает это событие на протокол TCP/IP с кодом NetEventReconfigure. Драйвер протокола может, в редких случаях, вернуть код сбоя, если он не может применить указанные изменения конфигурации и нет доступных значений по умолчанию. Неудачная попытка выделить память является примером случая, в котором протокол возвращает код сбоя. Возврат кода ошибки может привести к запросу пользователя перезапустить систему.

    Протокол должен проверять данные, относящиеся к NetEventReconfigure, которые передаются в функцию ProtocolNetPnPEvent. Дополнительные сведения об этих данных см. в NET_PNP_EVENT для драйверов протокола.

  • Список привязки сетевых событий

    Указывает драйверу протокола, что его порядок обработки списка привязок был перенастроен. Этот список указывает относительный порядок применения к привязкам протокола при обработке, например запрос пользователя, который может быть перенаправлен на одну из нескольких привязок. Буфер, переданный с этим событием, содержит список имен устройств, отформатированных как строки Юникода, завершаемые null. Формат каждого имени устройства идентичен параметру DeviceName, который передается вызову ProtocolBindAdapterEx.

    Протокол должен проверять данные, связанные с NetEventBindList, передаваемые для функции ProtocolNetPnPEvent. Дополнительные сведения об этих данных см. в NET_PNP_EVENT для драйверов протокола.

    Протокол должен проверять данные, связанные с NetEventBindList, передаваемые для функции ProtocolNetPnPEvent. Дополнительные сведения об этих данных см. в NET_PNP_EVENT для драйверов протокола.

  • NetEventBindsComplete

    Указывает, что драйвер протокола привязан ко всем сетевым адаптерам, к которым он может привязаться. NDIS не будет указывать никаких привязок к драйверу протокола, если только, например, сетевой адаптер PnP не подключен к системе.

  • NetEventPnPCapabilities

    Указывает, что пользователь включил или отключил возможности пробуждения базового адаптера. (Параметр ProtocolBindingContext, который NDIS передает ProtocolNetPnPEvent указывает привязку.)

  • NetEventPause

    Указывает, что указанная привязка протокола должна перейти в состояние на паузу. Привязка перейдет в состояние паузы после того, как NDIS завершит все невыполненные запросы на отправку для привязки. Дополнительные сведения о приостановке привязки см. в разделе Приостановка привязки.

  • NetEventRestart

    Указывает, что указанная привязка протокола вошла в состояние перезапуска. После того как драйвер протокола будет готов возобновить операции отправки и получения для привязки, привязка переходит в состояние "Работа". Дополнительные сведения о перезапуске привязки см. в разделе .

  • NetEventPortActivation

    Указывает активацию списка портов, связанных с указанной привязкой. Дополнительные сведения о приостановке привязки см. в разделе Обработка события активации порта PnP.

  • NetEventPortDeactivation

    Указывает деактивацию списка портов, связанных с указанной привязкой. Дополнительные сведения о приостановке привязки см. в разделе Обработка события деактивации порта PnP.

  • NetEventIMReEnableDevice

    Указывает, что конфигурация изменилась для виртуального минипорта промежуточного драйвера NDIS 6.0 или более поздней версии. NetEventIMReEnableDevice аналогично событию NetEventReconfigure, за исключением того, что промежуточный драйвер получает это событие для одного виртуального минипорта, а событие NetEventReconfigure применяется ко всем виртуальным минипортам промежуточного драйвера. Например, промежуточный драйвер получает событие NetEventIMReEnableDevice при отключении пользователя, а затем включает один виртуальный минипорт из диспетчера устройств или другого источника. Примеры управления питанием промежуточного драйвера см. в примере промежуточного драйвера Microsoft NDIS MUX и объекте уведомления, доступных в репозитории образцов драйверов Windows на GitHub.

Элемент буфера структуры NET_PNP_EVENT указывает на буфер, содержащий сведения, относящиеся к указанному событию.

Драйвер протокола может выполнить вызов ProtocolNetPnPEvent асинхронно с NdisCompleteNetPnPEvent.