Manutenção de uma interrupção

Este tópico descreve como atender a uma interrupção DIRQL. Para obter informações sobre como atender a uma interrupção de nível passivo, consulte Suporte a interrupções de nível passivo.

A manutenção de uma interrupção consiste em duas e, às vezes, três etapas:

  1. Salvar informações voláteis (como registrar conteúdo) rapidamente, em uma rotina de serviço de interrupção executada em IRQL = DIRQL.

  2. Processando as informações voláteis salvas em uma DPC (chamada de procedimento adiado) executada em IRQL = DISPATCH_LEVEL.

  3. Executando trabalho adicional em IRQL = PASSIVE_LEVEL, se necessário.

Quando um dispositivo gera uma interrupção de hardware, a estrutura chama a ISR (rotina de serviço de interrupção) do driver, que os drivers baseados em estrutura implementam como uma função de retorno de chamada EvtInterruptIsr .

A função de retorno de chamada EvtInterruptIsr , que é executada no DIRQL do dispositivo, deve salvar rapidamente informações de interrupção, como conteúdo de registro, que serão perdidas se ocorrer outra interrupção.

Normalmente, a função de retorno de chamada EvtInterruptIsr agenda uma DPC (chamada de procedimento adiado) para processar as informações salvas posteriormente em um IRQL inferior (DISPATCH_LEVEL). Os drivers baseados em estrutura implementam rotinas de DPC como funções de retorno de chamada EvtInterruptDpc ou EvtDpcFunc .

A maioria dos drivers usa uma única função de retorno de chamada EvtInterruptDpc para cada tipo de interrupção. Para agendar a execução de uma função de retorno de chamada EvtInterruptDpc , um driver deve chamar WdfInterruptQueueDpcForIsr de dentro da função de retorno de chamada EvtInterruptIsr .

Se o driver criar vários objetos de fila de estrutura para cada dispositivo, você poderá considerar o uso de um objeto DPC separado e uma função de retorno de chamada EvtDpcFunc para cada fila. Para agendar a execução de uma função de retorno de chamada EvtDpcFunc , o driver deve primeiro criar um ou mais objetos DPC chamando WdfDpcCreate, normalmente na função de retorno de chamada EvtDriverDeviceAdd do driver. Em seguida, a função de retorno de chamada EvtInterruptIsr do driver pode chamar WdfDpcEnqueue.

Os drivers normalmente completam solicitações de E/S em suas funções de retorno de chamada EvtInterruptDpc ou EvtDpcFunc .

Às vezes, um driver deve executar algumas operações de manutenção de interrupção em IRQL = PASSIVE_LEVEL. Nesses casos, a função de retorno de chamada EvtInterruptDpc ou EvtDpcFunc do driver, executada em IRQL = DISPATCH_LEVEL, pode agendar a execução de um ou mais itens de trabalho de estrutura, que são executados em IRQL = PASSIVE_LEVEL.

Para obter um exemplo de um driver que usa itens de trabalho durante a manutenção de interrupções do dispositivo, consulte o driver de exemplo PCIDRV .