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

Um driver de miniporta deve fornecer um manipulador MiniportMessageInterruptDPC se o driver chamar a função NdisMRegisterInterruptEx para registrar uma interrupção.

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

Sintaxe

MINIPORT_MESSAGE_INTERRUPT_DPC MiniportMessageInterruptDpc;

void MiniportMessageInterruptDpc(
  [in] NDIS_HANDLE MiniportInterruptContext,
  [in] ULONG MessageId,
  [in] PVOID MiniportDpcContext,
  [in] PVOID ReceiveThrottleParameters,
       PVOID NdisReserved2 PULONG NdisReserved1,
  [in] PULONG NdisReserved2
)
{...}

Parâmetros

[in] MiniportInterruptContext

Um identificador para um bloco de informações de contexto de interrupção. O driver de miniporta 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 .

[in] MiniportDpcContext

Um ponteiro para uma área de contexto que o driver de miniporto forneceu quando chamou a função NdisMQueueDpcEx ou NdisMQueueDpc . Se o NDIS chamou MiniportMessageInterruptDPC porque o driver de miniporto retornou uma máscara de bits no parâmetro TargetProcessors do Função MiniportMessageInterrupt e, em seguida, MiniportDpcContext é NULL.

[in] ReceiveThrottleParameters

Um ponteiro para um NDIS_RECEIVE_THROTTLE_PARAMETERS estrutura especifica o número máximo de estruturas NET_BUFFER_LIST que um driver de miniporto deve indicar em um DPC.

Nota No NDIS 6.1 e anteriores, esse parâmetro é chamado NdisReserved1, seu tipo de dados é PULONG e é reservado para NDIS.
 

NdisReserved1

Reservado para NDIS.

[in] NdisReserved2

Reservado para NDIS.

Nota No NDIS 6.1 e anterior, o tipo de dados desse parâmetro é PULONG.
 

Retornar valor

Nenhum

Comentários

Os drivers de miniport que registram uma interrupção sinalizada por mensagem com a função NdisMRegisterInterruptEx devem fornecer uma função MiniportMessageInterruptDPC .

O NDIS chama MiniportMessageInterruptDPC para concluir o processamento adiado de uma interrupção. O driver de miniport pode chamar a função NdisMQueueDpcEx ou NdisMQueueDpc para solicitar DPCs (chamadas de procedimento adiado) adicionais para outros processadores.

Os drivers de miniporta determinam a origem de cada interrupção e tomam as medidas apropriadas. Por exemplo, se uma interrupção indicar a conclusão de uma operação de transmissão, o driver de miniporto concluirá uma solicitação de envio pendente. Se a causa da interrupção for uma alteração no estado do link, o driver de miniporto indicará que o novo link status para o NDIS. Se houver pacotes de recebimento pendentes, o driver de miniporto indicará os pacotes para NDIS.

Um driver de miniporta que dá suporte ao RSS (recebimento de dimensionamento lateral) e tem o recurso habilitado examina suas filas de recebimento no MiniportMessageInterruptDPC. A NIC já poderia ter enfileirado pacotes recebidos em filas separadas com base em valores de hash, se a NIC fornecesse esses recursos. Caso contrário, o driver de miniporto pode classificar os pacotes em filas separadas em MiniportMessageInterruptDPC.

MiniportMessageInterruptDPC chama o Função NdisMIndicateReceiveNetBufferLists para indicar os pacotes no processador atual. MiniportMessageInterruptDPC pode determinar o processamento necessário para outras CPUs e solicitar que o NDIS agende DPCs em CPUs em que um DPC não está pendente.

Se o DPC atual estiver em execução na mesma CPU que o Função MiniportMessageInterrupt , o driver de miniporte deve indicar todos os pacotes que não puderam ser mapeados para uma CPU. Se esse DPC for o último DPC agendado e não solicitar DPCs adicionais, MiniportMessageInterruptDPC deverá reabilitar as interrupções na NIC, para a mensagem especificada, antes de retornar.

Antes que o NDIS chame MiniportMessageInterruptDPC, as interrupções para a mensagem especificada na NIC normalmente foram desabilitadas no Função MiniportMessageInterrupt . Antes de retornar o controle, MiniportMessageInterruptDPC pode reabilitar interrupções. Se o driver de miniporta enfileirar DPCs adicionais enquanto as interrupções foram desabilitadas, o driver deverá habilitar as interrupções após a execução do último DPC.

Nota Para melhorar o desempenho, os drivers de miniporto só devem desabilitar interrupções para mensagens específicas. Eles não devem desabilitar todas as interrupções sinalizadas por mensagem.
 
Os drivers de miniporto devem limitar o número de buffers de recebimento que eles indicam enquanto estão processando um lote de DPC de interrupção para serem concluídos dentro do limite de tempo necessário. Um lote de DPC de interrupção é a coleção de todos os DPCs executados após o ISR e antes que as interrupções sejam reabilitadas.

Um driver de miniport pode chamar 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 MiniportMessageInterruptDPC em IRQL = DISPATCH_LEVEL.

Exemplos

Para definir uma função MiniportMessageInterruptDPC , 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 escrever drivers para o sistema operacional Windows.

Por exemplo, para definir uma função MiniportMessageInterruptDPC chamada "MyMessageInterruptDPC", use o tipo MINIPORT_MESSAGE_INTERRUPT_DPC conforme mostrado neste exemplo de código:

MINIPORT_MESSAGE_INTERRUPT_DPC MyMessageInterruptDPC;

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

_Use_decl_annotations_
VOID
 MyMessageInterruptDPC(
    NDIS_HANDLE  MiniportInterruptContext,
    ULONG  MessageId,
    PVOID  MiniportDpcContext,
    PVOID  ReceiveThrottleParameters,
    PVOID  NdisReserved2
    )
  {...}

O tipo de função MINIPORT_MESSAGE_INTERRUPT_DPC é 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_DPC 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 DISPATCH_LEVEL

Confira também

IO_INTERRUPT_MESSAGE_INFO

IO_INTERRUPT_MESSAGE_INFO_ENTRY

MiniportHaltEx

MiniportInitializeEx

MiniportMessageInterrupt

NDIS_RECEIVE_THROTTLE_PARAMETERS NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS

NET_BUFFER_LIST

NdisMDeregisterInterruptEx

NdisMIndicateReceiveNetBufferLists

NdisMQueueDpc

NdisMQueueDpcEx

NdisMRegisterInterruptEx

RSS (Receive Side Scaling)