Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Os desenvolvedores de minidriver de streaming têm a opção de permitir que o driver de classe lide com 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 manipula a sincronização, ele garante que duas partes do código do minidriver nunca sejam executadas simultaneamente. O driver de classe coloca todas as solicitações de fluxo na fila e as passa para o minidriver uma de cada vez.
Uma finalidade dessa sincronização é poupar o escritor do minidriver de ter que lidar com todos os detalhes da sincronização de driver e gestão de filas de solicitações 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 da classe de fluxo significa que todas as solicitações são chamadas de forma imediata e assíncrona para o minidriver no contexto da thread de envio em PASSIVE_LEVEL. As exceções à regra anterior são as 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 preempido 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 posteriormente preempido por interrupções. As funções do 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 gerenciar 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 minidrivers de fluxo que operam sem sincronização de classe de fluxo.