Condividi tramite


Sincronizzazione del codice di interruzione (UMDF 1)

Avviso

UMDF 2 è la versione più recente di UMDF e sostituisce UMDF 1. Tutti i nuovi driver UMDF devono essere scritti usando UMDF 2. Nessuna nuova funzionalità viene aggiunta a UMDF 1 ed è disponibile un supporto limitato per UMDF 1 nelle versioni più recenti di Windows 10. I driver di Windows universali devono usare UMDF 2.

Gli esempi di UMDF 1 archiviati sono disponibili nell'Windows 11, versione 22H2 - Aggiornamento degli esempi di driver di maggio 2022.

Per altre informazioni, vedere Introduzione con UMDF.

Tutto il codice driver che accede al buffer dei dati di interruzione deve essere sincronizzato in modo che una sola routine accede ai dati alla volta.

È possibile sincronizzare il codice di interruzione usando il blocco dell'interruzione manuale o la serializzazione automatica del callback.

Blocco dell'interruzione manuale

UMDF acquisisce il blocco di interruzione prima di chiamare i callback OnInterruptIsr, OnInterruptDisable o OnInterruptEnable.

Se un driver deve sincronizzare qualsiasi codice usando il blocco di interruzione, chiama IWDFInterrupt::AcquireInterruptLock e IWDFInterrupt::ReleaseInterruptLock. Ad esempio, un driver acquisisce e rilascia il blocco di interruzione nella routine di callback OnInterruptWorkItem usando questi metodi. Tuttavia, nei callback di invio di I/O (ad esempio OnRead e OnWrite), il driver chiama prima IWDFInterrupt::TryToAcquireInterruptLock per decidere se accodare un elemento di lavoro o eseguire il lavoro nello stesso thread per evitare potenziali deadlock. Per un esempio di scenario di deadlock che può essere causato chiamando IWDFInterrupt::AcquireInterruptLock da un contesto di thread arbitrario, vedere la sezione Osservazioni di IWDFInterrupt::AcquireInterruptLock.

Se IWDFInterrupt::TryToAcquireInterruptLock restituisce TRUE, il driver ha acquisito il blocco di interruzione nello stesso thread. In questo caso, il driver esegue il lavoro necessario per il blocco e quindi chiama ReleaseInterruptLock. Se IWDFInterrupt::TryToAcquireInterruptLock restituisce FALSE, il driver accoda un elemento di lavoro ed esegue il lavoro nel callback onWorkItem . In questo caso, l'elemento di lavoro non deve usare la serializzazione automatica.

Uso della serializzazione automatica

Un driver UMDF può richiedere la sincronizzazione automatica del callback chiamando IWDFDeviceInitialize::SetLockingConstraint con il parametro LockType impostato su WdfDeviceLevel.

Il driver imposta quindi il membro AutomaticSerialization della relativa struttura WUDF_INTERRUPT_CONFIG su TRUE prima di chiamare CreateInterrupt.

Di conseguenza, UMDF serializza i callback onInterruptWorkItem del driver con code di I/O, l'annullamento delle richieste e le routine di callback dell'oggetto file. In questo scenario, UMDF usa il blocco callback anziché un blocco dell'oggetto per interruzione.