Compartilhar via


Função WdfInterruptAcquireLock (wdfinterrupt.h)

[Aplica-se a KMDF e UMDF]

O método WdfInterruptAcquireLock inicia uma sequência de código que é executada no DIRQL (nível de solicitação de interrupção do dispositivo) do dispositivo enquanto mantém o bloqueio de rotação de um objeto de interrupção.

Para objetos de interrupção de nível passivo, o método inicia uma sequência de código que é executada no nível passivo enquanto mantém o bloqueio passivo de um objeto de interrupção.

Sintaxe

void WdfInterruptAcquireLock(
  [in] WDFINTERRUPT Interrupt
);

Parâmetros

[in] Interrupt

Um identificador para um objeto de interrupção de estrutura.

Comentários

Um bug marcar ocorrerá se o driver fornecer um identificador de objeto inválido.

Quando um driver chama WdfInterruptAcquireLock em um objeto de interrupção DIRQL, o sistema aciona o IRQL do processador para o DIRQL do dispositivo e adquire o bloqueio de rotação especificado pelo driver na estrutura WDF_INTERRUPT_CONFIG do objeto de interrupção. Como resultado, as funções de retorno de chamada EvtInterruptIsr e EvtInterruptSynchronize do objeto de interrupção (e qualquer outro código que chame WdfInterruptAcquireLock para o mesmo objeto de interrupção) não podem ser executados.

Quando o driver chama WdfInterruptReleaseLock, o sistema retorna o IRQL do processador para seu nível anterior e libera o bloqueio de rotação.

Quando um driver chama WdfInterruptAcquireLock em um objeto de interrupção de nível passivo, o sistema adquire o bloqueio de interrupção de nível passivo que o driver configurou na estrutura WDF_INTERRUPT_CONFIG do objeto de interrupção.

Quando o driver chama WdfInterruptReleaseLock, o sistema libera o bloqueio de interrupção.

Para interrupções de nível passivo, o driver deve chamar WdfInterruptAcquireLock em IRQL = PASSIVE_LEVEL.

Não chame WdfInterruptAcquireLock de um contexto de thread arbitrário, como um manipulador de solicitação.

Você pode usar WdfInterruptAcquireLock e WdfInterruptReleaseLock se o driver precisar executar algumas linhas de código sem ser preempção e com a manutenção de interrupções de dispositivo efetivamente desabilitadas. Para seções maiores de código, o driver deve fornecer uma função de retorno de chamada EvtInterruptSynchronize .

Seu driver não pode chamar WdfInterruptAcquireLock antes que a estrutura tenha chamado a função de retorno de chamada EvtInterruptEnable do driver ou depois que a estrutura tiver chamado a função de retorno de chamada EvtInterruptDisable do driver.

Depois que o driver chama WdfInterruptAcquireLock, ele não deve chamar o método novamente para o mesmo objeto de interrupção antes de chamar WdfInterruptReleaseLock.

Para obter mais informações sobre o método WdfInterruptAcquireLock , confira Sincronizando o código de interrupção.

Para obter mais informações sobre como lidar com interrupções em drivers baseados em estrutura, consulte Tratamento de interrupções de hardware.

Para objetos de interrupção de nível passivo, os drivers devem chamar WdfInterruptTryToAcquireLock em vez de WdfInterruptAcquireLock, ao executar em um thread arbitrário, como uma função de retorno de chamada de objeto de fila. Por exemplo, o driver pode chamar WdfInterruptTryToAcquireLock de EvtIoRead.

Isso evita a possibilidade de deadlock, conforme descrito no cenário a seguir.

  1. Para determinar se seu dispositivo foi interrompido, o driver de função de um dispositivo periférico SPB envia E/S para seu barramento de dentro de seu ISR, com o bloqueio de interrupção de nível passivo mantido.
  2. O motorista do ônibus conclui uma segunda solicitação no mesmo thread em que recebeu a solicitação acima.
  3. A rotina de conclusão da segunda solicitação envia uma solicitação para o driver periférico.
  4. A rotina de expedição de E/S do driver periférico chama WdfInterruptAcquireLock, que, em seguida, bloqueia a tentativa de adquirir o bloqueio passivo do objeto de interrupção.

Requisitos

Requisito Valor
Plataforma de Destino Universal
Versão mínima do KMDF 1.0
Versão mínima do UMDF 2,0
Cabeçalho wdfinterrupt.h (inclua Wdf.h)
IRQL <= DIRQL
Regras de conformidade da DDI DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), WdfInterruptLock(kmdf), WdfInterruptLockRelease(kmdf)

Confira também