Condividi tramite


Sincronizzazione del minidriver

Gli sviluppatori di minidriver di streaming hanno la possibilità di consentire al driver di classe di gestire la sincronizzazione. Quando i minidriver si registrano con il driver di classe, possono optare per la sincronizzazione fornita dal driver di classe impostando il membro TurnOffSynchronization di HW_INITIALIZATION_DATA su FALSE.

Quando il driver di classe gestisce la sincronizzazione, garantisce che due parti del codice del minidriver non vengano mai eseguite contemporaneamente. Il driver di classe accoda tutte le richieste di flusso e le passa al minidriver uno alla volta.

Uno scopo di questa sincronizzazione è quello di risparmiare al writer di minidriver di dover gestire tutti i dettagli della sincronizzazione dei driver e richiedere l'accodamento in un ambiente multitasking, reentrant, multiprocessore. Tuttavia, alcuni minidriver non dovrebbero usarlo. Nell'argomento Esempi di sincronizzazione vengono forniti due esempi che illustrano cosa deve fare un minidriver per quanto riguarda la sincronizzazione.

La disattivazione della sincronizzazione della classe di flusso significa che tutte le richieste vengono immediatamente e richiamate in modo asincrono al minidriver nel contesto del thread di invio in PASSIVE_LEVEL. Le eccezioni alla regola precedente sono le routine HwCancelPacket, TimeoutHandler e Timer. Questi vengono chiamati in DISPATCH_LEVEL. Un'eccezione finale è il gestore di interrupt, che viene chiamato in DIRQL.

Quando la sincronizzazione è disattivata, il minidriver è responsabile dell'esecuzione della sincronizzazione in conformità al modello WDM. Se un minidriver viene richiamato in PASSIVE_LEVEL, può essere preceduto da qualsiasi evento IRQL superiore, ad esempio DPC o interrupt. Analogamente, se un minidriver viene richiamato in DISPATCH_LEVEL, può essere successivamente preceduto da interrupt. Le funzioni minidriver che modificano le risorse condivise devono sincronizzare gli accessi.

È possibile eseguire più richieste contemporaneamente agli stessi flussi o a flussi diversi quando la sincronizzazione della classe di flusso è disattivata. Il minidriver deve accodare le proprie richieste e gestire qualsiasi sincronizzazione hardware con altri thread e ISR. I blocchi di selezione, i mutex e KeSynchronizeExecution sono alcuni degli oggetti di sincronizzazione disponibili per trasmettere minidriver in esecuzione senza la sincronizzazione della classe di flusso.