Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Os desenvolvedores de minidrivers de streaming têm a opção de permitir que o driver de classe trate da sincronização. Quando os minidrivers se registram com o driver de classe, eles podem optar pela sincronização fornecida pelo driver de classe definindo o membro TurnOffSynchronization do HW_INITIALIZATION_DATA como FALSE.
Quando o driver de classe lida com a sincronização, ele garante que duas partes do código do minidriver nunca sejam executadas simultaneamente. O controlador de classe enfileira todas as solicitações de fluxo e as passa para o minidriver uma de cada vez.
O objetivo desta sincronização é poupar o programador de minidriver de ter que lidar com todos os detalhes da sincronização de drivers e filas de solicitações em um ambiente multitarefa, reentrante e multiprocessador. No entanto, alguns minidrivers não o devem usar. 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 classes de fluxo significa que todas as solicitações são chamadas imediata e assincronamente para o minidriver no contexto do thread de envio em PASSIVE_LEVEL. As exceções à regra anterior são as rotinas HwCancelPacket, TimeoutHandler e Timer. Estes são chamados no DISPATCH_LEVEL. Uma exceção final é o manipulador de interrupção, que é chamado de DIRQL.
Quando a sincronização está desativada, o minidriver é responsável por executar a sincronização em conformidade com o modelo WDM. Se um minidriver for invocado no PASSIVE_LEVEL, ele poderá ser preemptado por eventos IRQL de nível mais alto, como DPCs ou interrupções. Da mesma forma, se um minidriver for chamado de volta em DISPATCH_LEVEL, ele pode ser posteriormente antecipado 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 para fluxos diferentes quando a sincronização de classes de fluxo está desativada. O minidriver deve enfileirar suas próprias solicitações e lidar com 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.