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

O NDIS chama a função MiniportInterrupt quando uma NIC ou outro dispositivo que compartilha a interrupção com a NIC gera uma interrupção.

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

Sintaxe

MINIPORT_ISR MiniportIsr;

BOOLEAN MiniportIsr(
  [in]  NDIS_HANDLE MiniportInterruptContext,
  [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 .

[out] QueueDefaultInterruptDpc

Um ponteiro para uma variável BOOLEAN 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 esse valor for definido como TRUE, o NDIS ignorará o valor do parâmetro TargetProcessors . Se estiver definido como FALSE, o NDIS usará o valor do parâmetro TargetProcessors para agendar DPCs. Se QueueDefaultInterruptDpc for TRUE, o NDIS agendará um DPC independentemente do valor retornado de MiniportInterrupt.

[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. Se QueueDefaultInterruptDpc estiver definido como FALSE e TargetProcessors estiver definido como zero, o NDIS não agendará nenhum DPCs. Caso contrário, o NDIS agendará DPCs independentemente do valor retornado de MiniportInterrupt.

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

MiniportInterrupt retorna um dos seguintes valores:

Código de retorno Descrição
VERDADE

MiniportInterrupt determinou que a NIC subjacente gerou a interrupção.

FALSE

MiniportInterrupt determinou que a NIC subjacente não gerou a interrupção.

 
Nota O NDIS enfileirará DPCs com base nos valores especificados nos parâmetros QueueDefaultInterruptDpc e TargetProcessors , independentemente do valor retornado por MiniportInterrupt . No entanto, MiniportInterrupt ainda deve retornar o valor correto.
 

Comentários

Os drivers de miniport que registram uma interrupção com a função NdisMRegisterInterruptEx devem fornecer uma função MiniportInterrupt .

Um driver de miniporte deve fazer o menor trabalho possível em sua função MiniportInterrupt . Ele deve adiar as operações de E/S para as interrupções geradas pela NIC para a função MiniportInterruptDPC .

Quando ocorre uma interrupção na linha de interrupção de uma NIC, o NDIS chama a função MiniportInterrupt do driver de miniport.

Todas as NICs podem compartilhar interrupções baseadas em linha com outros dispositivos no barramento de E/S. Se a NIC não gerou a interrupção, MiniportInterrupt deverá retornar FALSE imediatamente para que o sistema possa chamar o driver do dispositivo que gerou a interrupção. Se QueueDefaultInterruptDpc estiver definido como FALSE e o parâmetro TargetProcessors estiver definido como zero, o NDIS não agendará nenhum DPCs. Caso contrário, o NDIS agendará DPCs independentemente do valor de turno reMiniportInterruptde MiniportInterrupt.

Se a interrupção for para a NIC, MiniportInterrupt descartará a interrupção na NIC, salvará qualquer estado necessário sobre a interrupção e adiará o máximo possível do processamento de E/S para a função MiniportInterruptDPC .

Se a NIC subjacente gerou a interrupção especificada e o driver de miniporto solicitará DPCs (chamadas de procedimento adiadas), o driver de miniporte deverá desabilitar todas as interrupções adicionais da NIC 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 poderia 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.
Se um driver de miniporte processar pacotes recebidos em DPCs separados, o driver 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.
Nota O NDIS enfileirará DPCs com base nos valores especificados nos parâmetros QueueDefaultInterruptDpc e TargetProcessors , independentemente do valor retornado por MiniportInterrupt . No entanto, MiniportInterrupt ainda deve retornar o valor correto.
 
Se o MiniportInterrupt compartilhar recursos, 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 MiniportSynchronizeInterrupt do driver acesse os recursos compartilhados de maneira sincronizada e multiprocessador segura.

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 MiniportInterrupt ou MiniportInterruptDPC de um driver de miniport.

O NDIS chama MiniportInterrupt no DIRQL da interrupção que o driver de miniporto registrou em uma chamada anterior para NdisMRegisterInterruptEx. Portanto, MiniportInterrupt 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 MiniportInterrupt , 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 MiniportInterrupt chamada "MyInterrupt", use o tipo MINIPORT_ISR conforme mostrado neste exemplo de código:

MINIPORT_ISR MyInterrupt;

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

_Use_decl_annotations_
BOOLEAN
 MyInterrupt(
    NDIS_HANDLE  MiniportInterruptContext,
    PBOOLEAN  QueueDefaultInterruptDpc,
    PULONG  TargetProcessors
    )
  {...}

O tipo de função MINIPORT_ISR é 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_ISR 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

MiniportHaltEx

MiniportInitializeEx

MiniportInterruptDPC

MiniportSynchronizeInterrupt NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS

NdisMDeregisterInterruptEx

NdisMQueueDpcEx

NdisMRegisterInterruptEx

NdisMSynchronizeWithInterruptEx OID_GEN_RECEIVE_SCALE_CAPABILITIES OID_GEN_RECEIVE_SCALE_PARAMETERS

RSS (Receive Side Scaling)