Sincronizando código de interrupção (UMDF 1)

Aviso

O UMDF 2 é a versão mais recente do UMDF e substitui o UMDF 1. Todos os novos drivers UMDF devem ser gravados 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 o UMDF 2.

Os exemplos de UMDF 1 arquivados podem ser encontrados no Windows 11, versão 22H2 – Atualização de exemplos de driver de maio de 2022.

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

Todo o código de 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 de interrupção manual ou a serialização automática de retorno de chamada.

Bloqueio manual de interrupção

O UMDF adquire o bloqueio de interrupção antes de chamar os retornos de chamada 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 expedição de E/S (como OnRead e OnWrite), o driver primeiro chama IWDFInterrupt::TryToAcquireInterruptLock para decidir se deseja enfileirar um item de trabalho ou fazer o trabalho no mesmo thread para evitar um possível deadlock. Para obter um exemplo de um cenário de deadlock que pode ser causado chamando IWDFInterrupt::AcquireInterruptLock 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 no mesmo thread. Nesse caso, o driver executa o trabalho que exigia esse bloqueio e, em seguida, chama ReleaseInterruptLock. Se IWDFInterrupt::TryToAcquireInterruptLock retornar FALSE, o driver enfileira um item de trabalho e executa o trabalho em seu retorno de chamada OnWorkItem . Nesse caso, o item de trabalho não deve usar a serialização automática.

Usando a serialização automática

Um driver UMDF pode solicitar a sincronização automática de retorno de chamada chamando 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, o UMDF usa o bloqueio de retorno de chamada em vez de um bloqueio de objeto por interrupção.