MINIPORT_INTERRUPT_DPC função de retorno de chamada (ndis.h)
Um driver de miniporte deverá fornecer uma função MiniportInterruptDPC se o driver chamar a função NdisMRegisterInterruptEx para registrar uma interrupção.
Sintaxe
MINIPORT_INTERRUPT_DPC MiniportInterruptDpc;
void MiniportInterruptDpc(
[in] NDIS_HANDLE MiniportInterruptContext,
[in] PVOID MiniportDpcContext,
[in] PVOID ReceiveThrottleParameters,
[in] PVOID NdisReserved2
)
{...}
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] MiniportDpcContext
Um ponteiro para uma área de contexto que o driver de miniporto forneceu quando chamou a função NdisMQueueDpcEx ou NdisMQueueDpc . Se NDIS chamado MiniportInterruptDPC porque o driver de miniporto retornou uma máscara de bits no parâmetro TargetProcessors da função MiniportInterrupt , MiniportDpcContext será NULL.
[in] ReceiveThrottleParameters
Um ponteiro para um NDIS_RECEIVE_THROTTLE_PARAMETERS estrutura. Essa estrutura especifica o número máximo de estruturas de NET_BUFFER_LIST que um driver de miniporte deve indicar em um DPC.
[in] NdisReserved2
Reservado para NDIS.
Retornar valor
Nenhum
Comentários
Os drivers de miniport que registram uma interrupção com a função NdisMRegisterInterruptEx devem fornecer uma função MiniportInterruptDPC .
O NDIS chama MiniportInterruptDPC 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 adiadas) adicionais para outros processadores.
Os drivers de miniporte 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 origem da interrupção for uma alteração no estado do link, o driver de miniporto indicará que o novo link status ao NDIS. Se houver pacotes de recebimento pendentes, o driver de miniporto indicará os pacotes para o NDIS.
Um driver de miniporte que dá suporte ao RSS (dimensionamento lateral de recebimento) e tem o recurso habilitado, examina suas filas de recebimento no MiniportInterruptDPC. A NIC pode já ter enfileirado pacotes recebidos em filas separadas com base em valores de hash, se a NIC fornecer tais recursos. Caso contrário, o driver de miniporto pode classificar os pacotes em filas separadas em MiniportInterruptDPC.
MiniportInterruptDPC chama o Função NdisMIndicateReceiveNetBufferLists para indicar pacotes no processador atual. MiniportInterruptDPC pode identificar 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 a função MiniportInterrupt , o driver de miniporto deverá 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, MiniportInterruptDPC deverá reabilitar as interrupções na NIC antes de retornar.
Normalmente, as interrupções já estão desabilitadas na NIC na função MiniportInterrupt antes que o NDIS chame MiniportInterruptDPC. Antes de retornar o controle, MiniportInterruptDPC pode reabilitar interrupções. Se o driver de miniporto enfileirar DPCs adicionais enquanto as interrupções foram desabilitadas, o driver deverá habilitar as interrupções antes que o último DPC retorne.
Os drivers de miniporte devem limitar o número de buffers de recebimento que eles indicam enquanto estão processando um lote de DPC de interrupção para ser concluído 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 reenabled.
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 MiniportInterruptDPC em IRQL = DISPATCH_LEVEL.
Exemplos
Para definir uma função MiniportInterruptDPC , 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 MiniportInterruptDPC chamada "MyInterruptDPC", use o tipo MINIPORT_INTERRUPT_DPC conforme mostrado neste exemplo de código:
MINIPORT_INTERRUPT_DPC MyInterruptDPC;
Em seguida, implemente sua função da seguinte maneira:
_Use_decl_annotations_
VOID
MyInterruptDPC(
NDIS_HANDLE MiniportInterruptContext,
PVOID MiniportDpcContext,
PVOID ReceiveThrottleParameters,
PVOID NdisReserved2
)
{...}
O tipo de função MINIPORT_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_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 |