Criando um objeto Interrupt

Um driver WDF (Windows Driver Frameworks) que manipula as interrupções de hardware de um dispositivo deve criar um objeto de interrupção de estrutura para cada interrupção que cada dispositivo possa dar suporte. Nas versões de estrutura 1.11 e posteriores em execução em Windows 8 ou versões posteriores do sistema operacional, os drivers KMDF (Kernel-Mode Driver Framework) e UMDF (User-Mode Driver Framework) podem criar objetos de interrupção que exigem tratamento 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 estrutura em sua função de retorno de chamada EvtDriverDeviceAdd . Um driver também pode criar objetos de interrupção 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 de Plug and Play (PnP) tenha atribuído 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 dão suporte a 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:

  • Disparado em nível (compartilhado ou exclusivo)
  • Disparado por borda (somente exclusivo)
  • MSI (exclusivo por definição)

Nota O UMDF não dá suporte a interrupções disparadas por borda compartilhadas .

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 do KMDF versão 1.15, o KMDF também dá suporte a interrupções para esses dispositivos, sem a solução alternativa descrita em Tratamento Active-Both Interrupções.

Também em WDF_INTERRUPT_CONFIG, o driver fornece ponteiros para as seguintes funções de retorno de chamada de evento fornecidas pelo 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
DPC (chamada de procedimento adiado) para a interrupção.

EvtInterruptWorkItem
Item de trabalho para uma interrupção de nível passivo.

Para drivers que usam a estrutura versão 1.11 ou posterior em 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, a estrutura 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 que estão abaixo do 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 EvtInterruptDpc ou EvtInterruptWorkItem da interrupção . Nessa configuração, a estrutura 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 de sua função de retorno de chamada EvtDriverDeviceAdd .

A estrutura exclui automaticamente a interrupção antes de excluir o 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

Há suporte para MSIs (interrupções sinalizadas por mensagem) começando com o Windows Vista. 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 Habilitando interrupções de Message-Signaled no Registro.

O driver deve criar um objeto de interrupção de estrutura para cada vetor de interrupção ou mensagem MSI que o dispositivo possa dar suporte. Se o gerenciador PnP não conceder ao dispositivo todos os recursos de interrupção aos quais o dispositivo pode dar suporte, os objetos de interrupção extra não serão usados e suas funções de retorno de chamada não serão chamadas.

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. Em Windows 8, o sistema operacional não dá suporte a solicitações de recursos para mais de 2048 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 tolerar, sem falhas, o rebalanceamento do sistema de recursos de interrupção nos quais o gerenciador PnP atribui ao dispositivo qualquer conjunto de recursos alternativos 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 solicitado. Na pior das hipóteses, o driver deve estar preparado para operar o dispositivo com apenas uma interrupção baseada em linha.