Synchronisieren von Interruptcode (UMDF 1)
Warnung
UMDF 2 ist die neueste Version von UMDF und ersetzt UMDF 1. Alle neuen UMDF-Treiber sollten mit UMDF 2 geschrieben werden. UMDF 1 werden keine neuen Features hinzugefügt, und die Unterstützung für UMDF 1 in neueren Versionen von Windows 10 ist eingeschränkt. Universelle Windows-Treiber müssen UMDF 2 verwenden.
Die archivierten UMDF 1-Beispiele finden Sie im Treiberbeispielupdate Windows 11, Version 22H2 – Mai 2022.
Weitere Informationen finden Sie unter Erste Schritte mit UMDF.
Der gesamte Treibercode, der auf den Interruptdatenpuffer zugreift, muss synchronisiert werden, sodass jeweils nur eine Routine auf die Daten zugreift.
Sie können Interruptcode entweder mithilfe der manuellen Interruptsperre oder der automatischen Rückrufserialisierung synchronisieren.
Manuelle Unterbrechungssperre
UMDF ruft die Interruptsperre ab, bevor die Rückrufe OnInterruptIsr, OnInterruptDisable oder OnInterruptEnable aufgerufen werden .
Wenn ein Treiber Code mithilfe der Interruptsperre synchronisieren muss, ruft er IWDFInterrupt::AcquireInterruptLock und IWDFInterrupt::ReleaseInterruptLock auf. Beispielsweise ruft ein Treiber die Interruptsperre in seiner OnInterruptWorkItem-Rückrufroutine mit diesen Methoden ab und gibt sie frei. Bei E/A-Dispatch-Rückrufen (z. B. OnRead und OnWrite) ruft der Treiber jedoch zuerst IWDFInterrupt::TryToAcquireInterruptLock auf, um zu entscheiden, ob ein Arbeitselement in die Warteschlange gestellt oder die Arbeit im selben Thread ausgeführt werden soll, um potenzielle Deadlocks zu vermeiden. Ein Beispiel für ein Deadlockszenario, das durch aufrufen von IWDFInterrupt::AcquireInterruptLock aus einem beliebigen Threadkontext verursacht werden kann, finden Sie im Abschnitt Hinweise von IWDFInterrupt::AcquireInterruptLock.
Wenn IWDFInterrupt::TryToAcquireInterruptLockTRUE zurückgibt, hat der Treiber die Interruptsperre im selben Thread abgerufen. In diesem Fall führt der Treiber die Arbeit aus, die diese Sperre erfordert, und ruft dann ReleaseInterruptLock auf. Wenn IWDFInterrupt::TryToAcquireInterruptLockFALSE zurückgibt, stellt der Treiber ein Arbeitselement in die Warteschlange und führt die Arbeit in seinem OnWorkItem-Rückruf aus. In diesem Fall darf das Arbeitselement keine automatische Serialisierung verwenden.
Verwenden der automatischen Serialisierung
Ein UMDF-Treiber kann die automatische Rückrufsynchronisierung anfordern, indem er IWDFDeviceInitialize::SetLockingConstraint aufruft, wobei der LockType-Parameter auf WdfDeviceLevel festgelegt ist.
Der Treiber legt dann den AutomaticSerialization-Member seiner WUDF_INTERRUPT_CONFIG-Struktur auf TRUE fest, bevor CreateInterrupt aufgerufen wird.
Daher serialisiert UMDF die OnInterruptWorkItem-Rückrufe des Treibers mit E/A-Warteschlange, Anforderungsabbruch und Dateiobjektrückrufroutinen. In diesem Szenario verwendet UMDF die Rückrufsperre anstelle einer Objektsperre pro Interrupt.