Manipulando eventos PnP e eventos de gerenciamento de energia em um driver de protocolo

Quando o sistema operacional emite um IRP (pacote de solicitação de E/S) de Plug and Play (PnP) ou um IRP de gerenciamento de energia para um objeto de dispositivo de destino que representa uma NIC (cartão de interface de rede), o NDIS intercepta o IRP. O NDIS indica o evento para cada driver de protocolo associado e cada driver intermediário associado chamando a função ProtocolNetPnPEvent do driver. Na chamada para ProtocolNetPnPEvent, o NDIS passa um ponteiro para um NET_PNP_EVENT_NOTIFICATION que contém uma estrutura NET_PNP_EVENT. A estrutura NET_PNP_EVENT descreve o evento PnP ou o evento de gerenciamento de energia que está sendo indicado. Para obter mais informações sobre a interface PnP do driver de protocolo, consulte Manipulando notificações de eventos PnP em um driver de protocolo.

A lista a seguir contém eventos de gerenciamento de energia e PnP, conforme indicado pelo código NetEvent na estrutura NET_PNP_EVENT:

  • NetEventSetPower

    Indica uma solicitação Definir Energia, que especifica que o adaptador de miniporta deve fazer a transição para um estado de energia específico. Um driver de protocolo com reconhecimento de gerenciamento de energia sempre deve ter êxito nesse evento retornando NDIS_STATUS_SUCCESS. Um driver de protocolo antigo pode retornar NDIS_STATUS_NOT_SUPPORTED para indicar que o NDIS deve desassociá-lo do adaptador de miniporta.

    Depois de emitir a solicitação de energia definida, o NDIS pausará a pilha do driver se o adaptador de miniporta estiver fazendo a transição para um estado de baixa potência. O NDIS reiniciará a pilha de driver antes da solicitação set-power se o adaptador de miniporto estiver fazendo a transição para o estado de trabalho (D0). Para obter mais informações sobre como pausar e reiniciar a pilha de driver, consulte Pausando uma pilha de driver.

    Se o adaptador de miniporta estiver em um estado de baixa potência, o driver de protocolo não poderá emitir nenhuma solicitação de OID. Esse requisito é uma restrição de gerenciamento de energia adicional que é adicionada às outras restrições que se aplicam quando a pilha de driver está no estado Pausado.

    Se o adaptador de miniporto subjacente não tiver reconhecimento de gerenciamento de energia, o driver de miniporto definirá o membro PowerManagementCapabilities de NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES como NULL e o NDIS definirá o membro PowerManagementCapabilities de NDIS_BIND_PARAMETERS como NULL.

    Nota A partir do NDIS 6.30, depois de ser notificado sobre esse evento, o driver de protocolo deve parar de gerar novas solicitações de E/S e não deve aguardar a conclusão de quaisquer solicitações de E/S pendentes dentro do contexto da chamada para ProtocolNetPnPEvent.

    Para obter mais informações sobre eventos de set-power, consulte Manipulando eventos PnP e eventos de gerenciamento de energia em um driver intermediário.

  • NetEventQueryPower

    Indica uma solicitação de Energia de Consulta, que consulta se o adaptador de miniporta subjacente pode fazer uma transição para um estado de energia específico. Um driver de protocolo sempre deve ter êxito em um NetEventQueryPower . Depois de estabelecer uma conexão ativa, um driver de protocolo pode chamar PoRegisterSystemState para registrar um estado ocupado contínuo. Enquanto o registro de estado estiver em vigor, o power manager não tentará colocar o sistema em suspensão. Depois que a conexão se torna inativa, o driver de protocolo cancela o registro de estado chamando PoUnregisterSystemState. Um driver de protocolo nunca deve tentar impedir que o sistema faça a transição para o estado de suspensão falhando em um NetEventQueryRemoveDevice. Observe que um NetEventQueryPower é sempre seguido por um NetEventSetPower. Um NetEventSetPower que define o estado de energia atual do dispositivo, na verdade, cancela o NetEventQueryPower.

    Nota A partir do NDIS 6.30, após ser notificado sobre esse evento, o driver de protocolo não deve aguardar a conclusão de solicitações de E/S pendentes no contexto da chamada para ProtocolNetPnPEvent.

  • NetEventQueryRemoveDevice

    Indica uma solicitação Remover Dispositivo de Consulta, que consulta se a NIC pode ser removida sem interromper as operações. Se um driver de protocolo não puder liberar um dispositivo (por exemplo, porque o dispositivo está em uso), ele deverá falhar em um NetEventQueryRemoveDevice retornando NDIS_STATUS_FAILURE.

  • NetEventCancelRemoveDevice

    Indica uma solicitação Cancelar Remover Dispositivo, que cancela a remoção de uma NIC subjacente. O driver de protocolo sempre deve ter êxito nesse evento retornando NDIS_STATUS_SUCCESS.

  • NetEventReconfigure

    Indica que a configuração foi alterada para um componente de rede. Por exemplo, se um usuário alterar o endereço IP para TCP/IP, o NDIS indicará esse evento para o protocolo TCP/IP com o código NetEventReconfigure . O driver de protocolo poderá, em circunstâncias raras, retornar um código de falha se não for capaz de aplicar as alterações de configuração indicadas e não houver valores padrão disponíveis. Uma tentativa com falha de alocar memória é um exemplo de um caso em que o protocolo retorna um código de falha. Retornar um código de erro pode resultar em solicitar que o usuário reinicie o sistema.

    Um protocolo deve validar os dados relacionados a NetEventReconfigure passados para sua função ProtocolNetPnPEvent . Para obter mais informações sobre esses dados, consulte NET_PNP_EVENT para Drivers de Protocolo.

  • NetEventBindList

    Indica a um driver de protocolo que sua ordem de processamento de lista de associação foi reconfigurada. Essa lista indica uma ordem relativa a ser aplicada às associações do protocolo ao processar, por exemplo, uma solicitação de usuário que pode ser roteada para uma das várias associações. O buffer passado com esse evento contém uma lista de nomes de dispositivo formatados como cadeias de caracteres Unicode terminadas em NULL. O formato de cada nome de dispositivo é idêntico ao parâmetro DeviceName que é passado para uma chamada para ProtocolBindAdapterEx.

    Um protocolo deve validar os dados relacionados a NetEventBindList passados para sua função ProtocolNetPnPEvent . Para obter mais informações sobre esses dados, consulte NET_PNP_EVENT para Drivers de Protocolo.

    Um protocolo deve validar os dados relacionados a NetEventBindList passados para sua função ProtocolNetPnPEvent . Para obter mais informações sobre esses dados, consulte NET_PNP_EVENT para Drivers de Protocolo.

  • NetEventBindsComplete

    Indica que um driver de protocolo está associado a todas as NICs às quais ele pode se associar. O NDIS não indicará mais associações ao driver de protocolo, a menos que, por exemplo, uma NIC PnP esteja conectada ao sistema.

  • NetEventPnPCapabilities

    Indica que o usuário habilitou ou desabilitou os recursos de ativação do adaptador subjacente. (O parâmetro ProtocolBindingContext que o NDIS passa para ProtocolNetPnPEvent especifica a associação .)

  • NetEventPause

    Indica que a associação de protocolo especificada deve entrar no estadoPausing. A associação entrará no estado Pausado depois que o NDIS concluir todas as solicitações de envio pendentes para a associação. Para obter mais informações sobre como pausar uma associação, consulte Pausando uma associação.

  • NetEventRestart

    Indica que a associação de protocolo especificada entrou no estado De reinicialização. Depois que o driver de protocolo estiver pronto para retomar as operações de envio e recebimento para a associação, a associação entrará no estado Em execução. Para obter mais informações sobre como reiniciar uma associação, consulte Reiniciando uma associação.

  • NetEventPortActivation

    Indica a ativação de uma lista de portas associadas à associação especificada. Para obter mais informações sobre como pausar uma associação, consulte Manipulando o evento PnP de ativação de porta.

  • NetEventPortDeactivation

    Indica a desativação de uma lista de portas associadas à associação especificada. Para obter mais informações sobre como pausar uma associação, consulte Manipulando o evento PnP de desativação de porta.

  • NetEventIMReEnableDevice

    Indica que a configuração foi alterada para um miniporto virtual de um driver intermediário NDIS 6.0 ou posterior. NetEventIMReEnableDevice é semelhante ao evento NetEventReconfigure , exceto que o driver intermediário recebe esse evento para um único miniporto virtual e o evento NetEventReconfigure se aplica a todos os miniportos virtuais do driver intermediário. Por exemplo, um driver intermediário recebe o evento NetEventIMReEnableDevice quando um usuário desabilita e habilita um único miniporto virtual do Gerenciador de Dispositivos ou de outra fonte. Para obter exemplos de gerenciamento de energia de driver intermediário, consulte o driver intermediário do NDIS MUX e o exemplo de driver notify object disponíveis no repositório de exemplos de driver do Windows no GitHub.

O membro Buffer da estrutura NET_PNP_EVENT aponta para um buffer que contém informações específicas para o evento que está sendo indicado.

Um driver de protocolo pode concluir a chamada para ProtocolNetPnPEvent de forma assíncrona com NdisCompleteNetPnPEvent.