Sincronização de minidriver
Os desenvolvedores de minidriver de streaming têm a opção de permitir que o driver de classe manipule a sincronização. Quando os minidrivers se registram no driver de classe, eles podem optar pela sincronização fornecida pelo driver de classe definindo o membro TurnOffSynchronization de HW_INITIALIZATION_DATA como FALSE.
Quando o driver de classe lida com a sincronização, ele garante que duas partes do código minidriver nunca sejam executadas simultaneamente. O driver de classe enfileira todas as solicitações de fluxo e as passa para o minidriver uma de cada vez.
Uma das finalidades dessa sincronização é poupar o gravador de minidriver de ter que lidar com todos os detalhes da sincronização de driver e solicitar a fila em um ambiente multitarefa, reentrante e multiprocessador. No entanto, alguns minidrivers não devem usá-lo. Dois exemplos são fornecidos no tópico Exemplos de Sincronização que ilustram o que um minidriver precisa fazer em relação à sincronização.
Desativar a sincronização de classe de fluxo significa que todas as solicitações são chamadas de forma imediata e assíncrona para o minidriver no contexto do thread de envio em PASSIVE_LEVEL. Exceções à regra anterior são rotinas HwCancelPacket, TimeoutHandler e Timer. Eles são chamados em DISPATCH_LEVEL. Uma exceção final é o manipulador de interrupção, que é chamado em DIRQL.
Quando a sincronização está desativada, o minidriver é responsável por executar a sincronização em conformidade com o modelo do WDM. Se um minidriver for chamado novamente em PASSIVE_LEVEL, ele poderá ser precedido por quaisquer eventos IRQL mais altos, como DPCs ou interrupções. Da mesma forma, se um minidriver for chamado novamente em DISPATCH_LEVEL, ele poderá ser precedido posteriormente por interrupções. As funções de minidriver que manipulam recursos compartilhados devem sincronizar os acessos.
Várias solicitações podem ser emitidas simultaneamente para os mesmos fluxos ou fluxos diferentes quando a sincronização de classe de fluxo está desativada. O minidriver deve enfileirar suas próprias solicitações e manipular qualquer sincronização de hardware com outros threads e o ISR. Bloqueios de rotação, mutexes e KeSynchronizeExecution são alguns dos objetos de sincronização disponíveis para transmitir minidrivers em execução sem sincronização de classe de fluxo.