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.
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.
Retornar valor
MiniportInterrupt retorna um dos seguintes valores:
Código de retorno | Descrição |
---|---|
|
MiniportInterrupt determinou que a NIC subjacente gerou a interrupção. |
|
MiniportInterrupt determinou que a NIC subjacente não gerou a interrupção. |
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.
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 |