Verwenden von Arbeitselementen

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 für neuere Versionen von Windows 10 ist eingeschränkt. Universelle Windows-Treiber müssen UMDF 2 verwenden.

Die archivierten UMDF 1-Beispiele finden Sie im Windows 11, Version 22H2 – Mai 2022 Treiberbeispiele Update.

Weitere Informationen finden Sie unter Erste Schritte mit UMDF.

Ein Arbeitselement ist eine Aufgabe, die ein Treiber in einer OnWorkItem-Ereignisrückruffunktion ausführt. Diese Funktionen werden asynchron ausgeführt.

UMDF-Treiber verwenden häufig Arbeitselemente, wenn ein OnInterruptIsr eine zusätzliche Verarbeitung durchführen muss, ohne die Ausführung der Interruptdienstanforderung (ISR) zu verzögern, da die Interruptleitung möglicherweise von mehreren Geräten gemeinsam genutzt wird.

In der Regel erstellt die OnInterruptIsr-Rückruffunktion eines Treibers ein Arbeitselementobjekt und fügt es der Arbeitselementwarteschlange des Systems hinzu. Anschließend wird das Objekt von einem Threadpoolthread dequent und die Rückruffunktion OnWorkItem des Arbeitselements aufgerufen.

Einrichten eines Arbeitselements

Zum Einrichten eines Arbeitselements muss Ihr Treiber Folgendes ausführen:

  1. Erstellen Sie das Arbeitselement.

    Ihr Treiber ruft IWDFDevice3::CreateWorkItem auf, um ein Arbeitselementobjekt zu erstellen und eine OnWorkItem-Rückruffunktion zu identifizieren, die das Arbeitselement verarbeitet.

  2. Speichern Sie Informationen zum Arbeitselement.

    In der Regel verwenden Treiber den Kontextspeicher des Arbeitselementobjekts, um Informationen zu der Aufgabe zu speichern, die die OnWorkItem-Rückruffunktion ausführen soll. Wenn die OnWorkItem-Rückruffunktion aufgerufen wird, kann sie die Informationen abrufen, indem sie auf diesen Kontextspeicher zugreift. Informationen zum Zuweisen und Zugreifen auf Kontextspeicher finden Sie unterIWDFObject::AssignContext.

  3. Fügen Sie das Arbeitselement der Arbeitselementwarteschlange des Systems hinzu.

    Ihr Treiber ruft IWDFWorkItem::Enqueue auf, wodurch das Arbeitselement des Treibers zur Arbeitselementwarteschlange hinzugefügt wird.

Wenn Ihr Treiber IWDFDevice3::CreateWorkItem aufruft, kann er optional ein übergeordnetes Objekt (z. B. ein Geräteobjekt oder ein Warteschlangenobjekt) bereitstellen. Wenn das System dieses Objekt löscht, löscht es auch alle vorhandenen Arbeitselemente, die dem Objekt zugeordnet sind.

Verwenden der WorkItem-Rückruffunktion

Nachdem das Arbeitselement der Arbeitselementwarteschlange hinzugefügt wurde, bleibt es in der Warteschlange, bis ein Systemarbeitsthread verfügbar wird. Der Systemarbeitsthread entfernt das Arbeitselement aus der Warteschlange und ruft dann die OnWorkItem-Rückruffunktion des Treibers auf, wobei das Arbeitselementobjekt als Eingabe übergeben wird.

In der Regel führt die OnWorkItem-Rückruffunktion die folgenden Schritte aus:

  1. Ruft vom Treiber bereitgestellte Informationen zum Arbeitselement ab, indem auf den Kontextspeicher des Arbeitselementobjekts zugegriffen wird.
  2. Führt die von Ihnen angegebene Aufgabe aus. Bei Bedarf kann die Rückruffunktion IWDFWorkItem::GetParentObject aufrufen, um das übergeordnete Objekt des Arbeitselements zu bestimmen.
  3. Wenn der Treiber das Arbeitselement erneut quediert, gibt an, dass das Handle für das Arbeitselement jetzt zur Wiederverwendung verfügbar ist.

Einige Treiber müssen möglicherweise IWDFWorkItem::Flush aufrufen, um ihre Arbeitselemente aus der Arbeitselementwarteschlange zu löschen. Wenn ein Treiber die Flush-Methode aufruft, wird die Methode erst zurückgegeben, wenn ein Workerthread das angegebene Arbeitselement aus der Arbeitselementwarteschlange entfernt und die OnWorkItem-Rückruffunktion des Treibers aufgerufen hat, und die OnWorkItem-Rückruffunktion nach der Verarbeitung des Arbeitselements zurückgegeben wurde.