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.
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 de 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 miniporto define antes de retornar dessa chamada. Um driver de miniporto 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.
Valor de retorno
MiniportMessageInterrupt retornará verdadeiro se a NIC subjacente tiver gerado a interrupção; caso contrário, ele retornará FALSE .
Observações
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 miniporto deve fazer o mínimo de 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 de 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 de MiniportMessageInterruptDPC.
Se o driver de miniporto solicitar DPCs (chamadas de procedimento adiado) para uma mensagem especificada, o driver de miniporto deverá desabilitar todas as interrupções adicionais para essa mensagem e reabilitar as interrupções após a conclusão de todos os DPCs.
O driver de miniporto deve definir QueueDefaultInterruptDpc para 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 que os pacotes recebidos e o driver de miniporto podem processar pacotes recebidos em DPCs separados, mas receber o RSS (dimensionamento lateral) não está habilitado para o driver de miniporto. 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 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 deverá chamar a função função NdisMSynchronizeWithInterruptEx. Isso garante que a função MiniportSynchronizeMessageInterrupt do driver acesse os recursos compartilhados de maneira sincronizada e multiprocessador segura.
Um driver de miniporto pode chamar o função NdisMDeregisterInterruptEx de sua função MiniportInitializeEx ou MiniportHaltEx para liberar recursos alocados com NdisMRegisterInterruptEx. Depois que NdisMDeregisterInterruptEx retorna, o NDIS não chama a função MiniportMessageInterrupt ou miniportMessageInterruptDPC.
O NDIS chama MiniportMessageInterrupt no DIRQL da 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 funções, que são seguras de chamar em qualquer IRQL.
exemplos de
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 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 |
---|---|
de cliente com suporte mínimo | Com suporte no NDIS 6.0 e posterior. |
da Plataforma de Destino | Windows |
cabeçalho | ndis.h (inclua Ndis.h) |
IRQL | Consulte a seção Comentários |
Consulte também
IO_INTERRUPT_MESSAGE_INFO_ENTRYMiniportSynchronizeMessageInterrupt
NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS NdisMSynchronizeWithInterruptEx OID_GEN_RECEIVE_SCALE_CAPABILITIES OID_GEN_RECEIVE_SCALE_PARAMETERS