Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Um driver do WDF (Windows Driver Frameworks) que manipula as interrupções de hardware de um dispositivo deve criar um objeto de interrupção do framework para cada interrupção que o dispositivo pode suportar. Nas versões da estrutura 1.11 e posteriores em execução no Windows 8 ou versões posteriores do sistema operacional, os drivers KMDF (Kernel-Mode Driver Framework) e User-Mode Driver Framework (UMDF) podem criar objetos de interrupção que exigem manipulação de nível passivo. A menos que você esteja escrevendo um driver para uma plataforma SoC (System on a Chip), no entanto, seu driver deve usar objetos de interrupção DIRQL.
Um driver normalmente cria objetos de interrupção de framework em sua função de retorno de chamada EvtDriverDeviceAdd. Um driver pode, além disso, criar objetos de interrupção através de sua função de retorno de chamada EvtDevicePrepareHardware.
A estrutura chama a função de retorno de chamada EvtDriverDeviceAdd do driver antes que o gerenciador do Plug and Play (PnP) atribua recursos do sistema, como vetores de interrupção, ao dispositivo. Depois que o gerenciador PnP atribui recursos, a estrutura armazena recursos de interrupção no objeto de interrupção do dispositivo. (Drivers que não suportam Plug and Play não podem usar objetos de interrupção.)
Para criar um objeto de interrupção de estrutura, o driver deve inicializar uma estrutura WDF_INTERRUPT_CONFIG e passá-la para o método WdfInterruptCreate .
O UMDF dá suporte aos seguintes tipos de interrupções:
- Acionamento por nível (compartilhado ou exclusivo)
- Acionamento por borda (exclusivo)
- MSI (exclusivo por definição)
Nota O UMDF não dá suporte a interrupções compartilhadas por flanco.
A partir do UMDF versão 2.15, o UMDF dá suporte a interrupções para dispositivos simples, como botões de push de hardware, geralmente apoiados por pinos GPIO, que você não pode habilitar ou desabilitar explicitamente usando registros de hardware. Para dar suporte a esses dispositivos, um driver UMDF deve usar interrupções exclusivas disparadas por borda.
A partir da versão 1.15 do KMDF, o KMDF também oferece suporte a interrupções para esses dispositivos, sem a solução alternativa descrita na Manipulação de Interrupções Active-Both.
Também em WDF_INTERRUPT_CONFIG, o driver fornece ponteiros para as seguintes funções de callback de evento fornecidas pelo próprio driver:
EvtInterruptEnable
Habilita uma interrupção de hardware.
EvtInterruptDisable
Desabilita uma interrupção de hardware.
EvtInterruptIsr
ISR (rotina de serviço de interrupção) para a interrupção.
EvtInterruptDpc
Chamada de procedimento diferido (DPC) para a interrupção.
EvtInterruptWorkItem
Item de trabalho para uma interrupção de nível passivo.
Para drivers que usam a versão 1.11 ou posterior da estrutura no Windows 8 ou versões posteriores do sistema operacional, o driver pode definir explicitamente o pai de um objeto de interrupção de estrutura (DIRQL ou passivo) como um objeto de dispositivo de estrutura ou um objeto de fila de estrutura. Se o driver especificar um pai, o driver deverá definir o membro AutomaticSerialization da estrutura WDF_INTERRUPT_CONFIG do objeto de interrupção como TRUE. (Lembre-se de que, se AutomaticSerialization for TRUE, o framework sincronizará a execução da função de retorno de chamada EvtInterruptDpc ou EvtInterruptWorkItem do objeto de interrupção com funções de retorno de chamada de outros objetos subordinados ao objeto pai da interrupção.)
Por exemplo, um driver pode especificar uma fila como pai de uma interrupção para sincronizar os retornos de chamada da fila com o retorno de chamada da interrupção EvtInterruptDpc ou EvtInterruptWorkItem. Nessa configuração, o framework exclui o objeto de fila quando exclui o objeto do dispositivo.
Depois de chamar WdfInterruptCreate, o driver pode opcionalmente chamar WdfInterruptSetPolicy ou WdfInterruptSetExtendedPolicy para especificar parâmetros de interrupção adicionais. Normalmente, o driver chama esses métodos na função de retorno de chamada EvtDriverDeviceAdd.
A framework exclui automaticamente a interrupção antes de excluir o elemento pai da interrupção. Opcionalmente, um driver pode chamar WdfObjectDelete para excluir a interrupção em um momento anterior.
Suporte a interrupções sinalizadas por mensagem
O Windows Vista e versões posteriores dão suporte a MSIs (interrupções sinalizadas por mensagem). Para permitir que o sistema operacional dê suporte a MSIs para seu dispositivo, o arquivo INF do driver deve definir alguns valores no registro. Para obter informações sobre como definir esses valores, consulte Habilitação de Interrupções Sinalizadas por Mensagem no Registro.
O driver deve criar um objeto de interrupção de estrutura para cada vetor de interrupção ou mensagem MSI à qual o dispositivo dá suporte. Se o gerenciador PnP não conceder ao dispositivo todos os recursos de interrupção que o dispositivo suporta, o driver não usará os objetos de interrupção extras e não chamará sua função de retorno de chamada.
No Windows 7, o sistema operacional não dá suporte a solicitações de recursos para mais de 910 mensagens de interrupção por função de dispositivo. No Windows 8, o sistema operacional não dá suporte a solicitações de recursos para mais de 2.048 interrupções por função de dispositivo.
Se o driver do dispositivo exceder esse limite, o dispositivo poderá falhar ao iniciar. Para operar em um computador que contém muitos processadores lógicos, o driver não deve solicitar mais de uma interrupção por processador.
Um driver deve ser capaz de tolerar, sem falhas, o reequilíbrio de recursos de interrupção do sistema, onde o gerenciador PnP atribui ao dispositivo qualquer conjunto alternativo de recursos de interrupção da lista de requisitos de recursos. Por exemplo, o dispositivo pode receber um número menor de interrupções de mensagem do que o driver solicitou. Na pior das hipóteses, o driver deve estar preparado para operar o dispositivo com apenas uma interrupção baseada em linha.