Partilhar via


Sincronização do Código de Interrupção (UMDF 1)

Advertência

UMDF 2 é a versão mais recente do UMDF e substitui UMDF 1. Todos os novos drivers UMDF devem ser escritos usando UMDF 2. Nenhum novo recurso está sendo adicionado ao UMDF 1 e há suporte limitado para UMDF 1 em versões mais recentes do Windows 10. Os drivers universais do Windows devem usar UMDF 2.

Os exemplos de UMDF 1 arquivados podem ser encontrados na Windows 11, versão 22H2 - Atualização de Amostras de Driver de maio de 2022.

Para obter mais informações, consulte Introdução ao UMDF.

Todo o código do driver que acessa o buffer de dados de interrupção deve ser sincronizado para que apenas uma rotina acesse os dados de cada vez.

Você pode sincronizar o código de interrupção usando o bloqueio manual de interrupção ou a serialização automática de retorno de chamada.

Bloqueio manual de interrupção

UMDF adquire o bloqueio de interrupção antes de chamar as callbacks OnInterruptIsr, OnInterruptDisable ou OnInterruptEnable.

Se um driver precisar sincronizar qualquer código usando o bloqueio de interrupção, ele chamará IWDFInterrupt::AcquireInterruptLock e IWDFInterrupt::ReleaseInterruptLock. Por exemplo, um driver adquire e libera o bloqueio de interrupção em sua rotina de retorno de chamada OnInterruptWorkItem usando esses métodos. No entanto, em retornos de chamada de despacho de E/S (como OnRead e OnWrite), o driver primeiro chama IWDFInterrupt::TryToAcquireInterruptLock para decidir se enfileira um item de trabalho ou faz o trabalho na mesma thread para evitar um possível impasse. Para obter um exemplo de um cenário de deadlock que pode ser causado ao chamar IWDFInterrupt::AcquireInterruptLock a partir de um contexto de thread arbitrário, consulte a seção Comentários de IWDFInterrupt::AcquireInterruptLock.

Se IWDFInterrupt::TryToAcquireInterruptLock retornar TRUE, o driver adquiriu o bloqueio de interrupção na mesma thread. Nesse caso, o driver executa o trabalho que exigiu esse bloqueio e, em seguida, chama ReleaseInterruptLock. Se IWDFInterrupt::TryToAcquireInterruptLock retornar FALSE, o driver enfileira um item de trabalho e executa o trabalho através da sua função de retorno OnWorkItem. Nesse caso, o item de trabalho não deve usar serialização automática.

Usando a serialização automática

Um driver UMDF pode solicitar a sincronização automática de chamadas de retorno ao chamar IWDFDeviceInitialize::SetLockingConstraint com o parâmetro LockType definido como WdfDeviceLevel.

Em seguida, o driver define o membro AutomaticSerialization de sua estrutura WUDF_INTERRUPT_CONFIG como TRUE antes de chamar CreateInterrupt.

Como resultado, o UMDF serializa os retornos de chamada OnInterruptWorkItem do driver com fila de E/S, cancelamento de solicitação e rotinas de retorno de chamada de objeto de arquivo. Nesse cenário, UMDF usa o bloqueio de retorno de chamada em vez de um bloqueio de objeto por interrupção.