Partilhar via


Ativação e desativação de interrupções

Se o driver lida com interrupções de dispositivo, ele deve fornecer as funções de retorno de chamada EvtInterruptEnable e EvtInterruptDisable, que habilitam e desabilitam as interrupções. Normalmente, essas funções de retorno de chamada são executadas no DIRQL do dispositivo e devem fazer o que for necessário para ativar e desativar o mecanismo de interrupção de um dispositivo. Para interrupções de nível passivo, essas funções callback são executadas em IRQL = PASSIVE_LEVEL enquanto mantêm o bloqueio de interrupção de nível passivo.

Se o driver precisar executar operações adicionais relacionadas à ativação ou desativação de interrupções, e se essas operações adicionais não puderem ser executadas em IRQL = DIRQL, o driver também poderá fornecer EvtDeviceD0EntryPostInterruptsEnabled e EvtDeviceD0ExitPreInterruptsDisabled funções de retorno de chamada. Essas duas funções de callback são executadas em IRQL = PASSIVE_LEVEL, onde não há retenção de bloqueio de interrupção, podendo, assim, chamar métodos de objetos da estrutura que estão indisponíveis em IRQL = DIRQL.

A estrutura invoca as funções de retorno de chamada EvtInterruptEnable e EvtDeviceD0EntryPostInterruptsEnabled do driver cada vez que o dispositivo entra no seu estado de trabalho (D0), após a estrutura ter chamado a função de retorno de chamada EvtDeviceD0Entry do driver.

A estrutura chama as funções de retorno de chamada EvtDeviceD0ExitPreInterruptsDisabled e EvtInterruptDisable do driver sempre que o dispositivo sai de seu estado de funcionamento, antes que a estrutura chame a função de retorno de chamada EvtDeviceD0Exit do driver. Para obter mais informações sobre quando o framework chama as funções de retorno de chamada de um driver, consulte PnP e cenários de gerenciamento de energia.

Você não deve presumir que um dispositivo usará os mesmos recursos de interrupção cada vez que a estrutura chamar a função de retorno de chamada EvtInterruptEnable do driver. Às vezes, o gerenciador PnP redistribui recursos do sistemae pode atribuir novos recursos de interrupção ao seu dispositivo.

O driver pode chamar WdfInterruptGetInfo para determinar os recursos de interrupção de um dispositivo. O driver pode chamar WdfInterruptGetDevice para determinar o dispositivo ao qual pertence um objeto de interrupção. (Alguns drivers podem chamar WdfInterruptWdmGetInterrupt.)

Para habilitar e desabilitar interrupções diretamente, o driver pode chamar os métodos WdfInterruptEnable e WdfInterruptDisable do objeto de interrupção, que chamam as funções de retorno de chamada de evento do driver, EvtInterruptEnable e EvtInterruptDisable. No entanto, a maioria dos drivers deve apenas permitir que a estrutura chame as funções de retorno de chamada EvtInterruptEnable e EvtInterruptDisable nos momentos adequados.