Compartilhar via


MINIPORT_MESSAGE_INTERRUPT função de retorno de chamada (ndis.h)

O NDIS chama a função MiniportMessageInterrupt quando uma NIC gera uma interrupção baseada em mensagem.

Nota Você deve declarar a função usando o tipo MINIPORT_MESSAGE_INTERRUPT . Para obter mais informações, consulte a seção Exemplos a seguir.
 

Sintaxe

MINIPORT_MESSAGE_INTERRUPT MiniportMessageInterrupt;

BOOLEAN MiniportMessageInterrupt(
  [in]  NDIS_HANDLE MiniportInterruptContext,
  [in]  ULONG MessageId,
  [out] PBOOLEAN QueueDefaultInterruptDpc,
  [out] PULONG TargetProcessors
)
{...}

Parâmetros

[in] MiniportInterruptContext

Um identificador para um bloco de informações de contexto de interrupção. O driver de miniporto forneceu esse identificador no parâmetro MiniportInterruptContext que o driver de miniporto passou para o Função NdisMRegisterInterruptEx .

[in] MessageId

Um identificador de mensagem MSI (interrupção sinalizada por mensagem). MessageId é um índice para um IO_INTERRUPT_MESSAGE_INFO_ENTRY estrutura dentro de um IO_INTERRUPT_MESSAGE_INFO estrutura. O NDIS passa um ponteiro para a estrutura IO_INTERRUPT_MESSAGE_INFO associada no membro MessageInfoTable quando o driver se registra com êxito para MSI com a função NdisMRegisterInterruptEx .

[out] QueueDefaultInterruptDpc

Um ponteiro para uma variável booliana que o driver de miniporte define antes de retornar dessa chamada. Um driver de miniporte define esse valor como TRUE para indicar que o driver requer um DPC na CPU padrão (atual). Se definido como TRUE, o NDIS ignorará o valor do parâmetro TargetProcessors . Se definido como FALSE, o NDIS usará o valor do parâmetro TargetProcessors para agendar DPCs.

[out] TargetProcessors

Uma máscara de bits que indica os processadores de destino para os quais o NDIS deve agendar um DPC. Essa máscara de bits representa os primeiros 32 processadores no grupo de processadores 0. Cada bit na máscara de bits identifica uma CPU. Se o chamador definir o bit 0, o NDIS agenda um DPC para CPU 0. Se o chamador definir o bit 1, o NDIS agenda um DPC para CPU 1 e assim por diante.

Nota Os drivers NDIS 6.20 e posteriores não devem usar esse parâmetro para agendar DPCs. Em vez disso, eles devem definir esse parâmetro como zero e usar a função NdisMQueueDpcEx para agendar DPCs.
 

Retornar valor

MiniportMessageInterrupt retornará TRUE se a NIC subjacente tiver gerado a interrupção; caso contrário, retornará FALSE.

Comentários

Os drivers de miniport que se registram para suporte a MSI (interrupções sinalizadas por mensagem) com a função NdisMRegisterInterruptEx devem fornecer uma função MiniportMessageInterrupt .

Um driver de miniporte deve fazer o menor trabalho possível em sua função MiniportMessageInterrupt . Ele deve adiar as operações de E/S para as interrupções que a NIC gera para o Função MiniportMessageInterruptDPC .

Quando uma NIC gera uma MSI, o NDIS chama a função MiniportMessageInterrupt do driver de miniport.

MiniportMessageInterrupt salva as informações de estado necessárias sobre a interrupção e adia o máximo possível do processamento de E/S para o Função MiniportMessageInterruptDPC .

Se o driver de miniporto solicitar DPCs (chamadas de procedimento adiadas) para uma mensagem especificada, o driver de miniporto deverá desabilitar todas as interrupções adicionais para essa mensagem e reabilitar as interrupções depois que todos os DPCs forem concluídos.

O driver de miniporte deve definir QueueDefaultInterruptDpc como TRUE para agendar um DPC somente para a CPU padrão. O driver pode fazer isso, por exemplo, se:

  • A NIC gerou a interrupção para sinalizar a conclusão de uma operação de envio ou qualquer outra solicitação que não seja executada em outras CPUs.
  • A NIC gerou a interrupção para sinalizar os dados recebidos e o driver de miniporto não pode processar pacotes recebidos em DPCs separados.
  • A interrupção indica os pacotes recebidos e o driver de miniporto pode processar pacotes recebidos em DPCs separados, mas o RSS (dimensionamento lateral de recebimento) não está habilitado para o driver de miniporte. Para obter mais informações, consulte OID_GEN_RECEIVE_SCALE_CAPABILITIES e OID_GEN_RECEIVE_SCALE_PARAMETERS.
  • O dimensionamento lateral de recebimento está habilitado para o driver de miniporto e o driver de miniporto pode gerar mensagens diferentes em cada fila de recebimento.
Se um driver de miniporte processar pacotes recebidos em DPCs separados, o driver de miniporto definirá o parâmetro QueueDefaultInterruptDpc como FALSE. O driver de miniporto deve definir o bit TargetProcessors para a CPU associada a cada fila de recebimento não vazio. O NDIS agendará um DPC em cada uma das CPUs indicadas no grupo de processadores 0.

Se MiniportMessageInterrupt compartilhar recursos para uma mensagem especificada, como registros NIC ou variáveis de estado, com outra função MiniportXxx que é executada em um IRQL inferior, essa função MiniportXxx deve chamar o Função NdisMSynchronizeWithInterruptEx . Isso garante que a função MiniportSynchronizeMessageInterrupt do driver acesse os recursos compartilhados de maneira sincronizada e multiprocessado.

Um driver de miniporte pode chamar o Função NdisMDeregisterInterruptEx de sua função MiniportInitializeEx ou MiniportHaltEx para liberar recursos alocados com NdisMRegisterInterruptEx. Depois que NdisMDeregisterInterruptEx retornar, o NDIS não chamará a função MiniportMessageInterrupt ou MiniportMessageInterruptDPC de um driver de miniport.

O NDIS chama MiniportMessageInterrupt no DIRQL do MSI que o driver de miniporto registrou em uma chamada anterior para NdisMRegisterInterruptEx. Portanto, MiniportMessageInterrupt deve chamar o subconjunto das funções NDIS, como as funções NdisRawXxx ou NdisRead/WriteRegisterXxx , que são seguras para chamar em qualquer IRQL.

Exemplos

Para definir uma função MiniportMessageInterrupt , primeiro você deve fornecer uma declaração de função que identifique o tipo de função que você está definindo. O Windows fornece um conjunto de tipos de função para drivers. Declarar uma função usando os tipos de função ajuda a Análise de Código para Drivers, SDV ( Verificador de Driver Estático ) e outras ferramentas de verificação a encontrar erros e é um requisito para gravar drivers para o sistema operacional Windows.

Por exemplo, para definir uma função MiniportMessageInterrupt chamada "MyMessageInterrupt", use o tipo MINIPORT_MESSAGE_INTERRUPT conforme mostrado neste exemplo de código:

MINIPORT_MESSAGE_INTERRUPT MyMessageInterrupt;

Em seguida, implemente sua função da seguinte maneira:

_Use_decl_annotations_
BOOLEAN
 MyMessageInterrupt(
    NDIS_HANDLE  MiniportInterruptContext,
    ULONG  MessageId,
    PBOOLEAN  QueueDefaultInterruptDpc,
    PULONG  TargetProcessors
    )
  {...}

O tipo de função MINIPORT_MESSAGE_INTERRUPT é definido no arquivo de cabeçalho Ndis.h. Para identificar erros com mais precisão ao executar as ferramentas de análise de código, adicione a anotação Use_decl_annotations à sua definição de função. A anotação Use_decl_annotations garante que as anotações aplicadas ao tipo de função MINIPORT_MESSAGE_INTERRUPT no arquivo de cabeçalho sejam usadas. Para obter mais informações sobre os requisitos para declarações de função, consulte Declarando funções usando tipos de função de função para drivers NDIS.

Para obter informações sobre Use_decl_annotations, consulte Anotando o comportamento da função.

Requisitos

Requisito Valor
Cliente mínimo com suporte Com suporte no NDIS 6.0 e posterior.
Plataforma de Destino Windows
Cabeçalho ndis.h (inclua Ndis.h)
IRQL Consulte a seção Comentários

Confira também

IO_INTERRUPT_MESSAGE_INFO

IO_INTERRUPT_MESSAGE_INFO_ENTRY

MiniportHaltEx

MiniportInitializeEx

MiniportMessageInterruptDPC

MiniportSynchronizeMessageInterrupt

NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS

NdisMDeregisterInterruptEx

NdisMQueueDpcEx

NdisMRegisterInterruptEx

NdisMSynchronizeWithInterruptEx OID_GEN_RECEIVE_SCALE_CAPABILITIES OID_GEN_RECEIVE_SCALE_PARAMETERS

RSS (Receive Side Scaling)