Habilitar e desabilitar interrupções

Se o driver manipular interrupções de dispositivo, ele deverá fornecer 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 habilitar e desabilitar o mecanismo de interrupção de um dispositivo. Para interrupções de nível passivo, essas funções de retorno de chamada são executadas em IRQL = PASSIVE_LEVEL mantendo o bloqueio de interrupção de nível passivo.

Se o driver precisar executar operações adicionais relacionadas à habilitação ou desabilitação de interrupções e se essas operações adicionais não puderem ser executadas em IRQL = DIRQL, o driver também poderá fornecer funções de retorno de chamada EvtDeviceD0EntryPostInterruptsEnabled e EvtDeviceD0ExitPreInterruptsDisabled . Essas duas funções de retorno de chamada são executadas em IRQL = PASSIVE_LEVEL sem bloqueio de interrupção mantido e podem chamar métodos de objeto de estrutura que não estão disponíveis em IRQL = DIRQL.

A estrutura chama as funções de retorno de chamada EvtInterruptEnable e EvtDeviceD0EntryPostInterruptsEnabled do driver sempre que o dispositivo entra em seu estado de trabalho (D0), depois que a estrutura chamar 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 deixa seu estado de trabalho, antes que a estrutura chame a função de retorno de chamada EvtDeviceD0Exit do driver. Para obter mais informações sobre quando a estrutura chama as funções de retorno de chamada de um driver, consulte Cenários de gerenciamento de energia e PnP.

Você não deve assumir que um dispositivo usará os mesmos recursos de interrupção sempre que a estrutura chamar a função de retorno de chamada EvtInterruptEnable do driver. Às vezes, o gerenciador de PnP redistribui os recursos do sistema e 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 EvtInterruptEnable e EvtInterruptDisable do driver. No entanto, a maioria dos drivers deve apenas permitir que a estrutura chame as funções de retorno de chamada EvtInterruptEnable e EvtInterruptDisable nos horários adequados.