Verwalten der Lebensdauer von Objekten

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.

UMDF verwendet ein Verweiszählungsschema, um die Lebensdauer von Rückrufobjekten und Frameworkobjekten zu verwalten.

Verwalten von Verweisen auf Driver-Supplied Rückrufobjekte

In den meisten Fällen muss ein Treiber keinen Verweis auf ein Rückrufobjekt beibehalten. Wenn Methoden der Rückrufobjektschnittstelle nur vom Framework und von Objekten aufgerufen werden, deren Lebensdauer vom Rückrufobjekt und dem gekoppelten Frameworkobjekt des Rückrufobjekts abhängt, muss der Treiber keinen Verweis beibehalten. Anders ausgedrückt: Der Treiber oder das Framework kann methoden von Objektschnittstellen, die höher in der Objekthierarchie liegen, sicher aufrufen.

Verwalten von Verweisen auf Frameworkobjekte

In UMDF bestimmen allgemeine COM-Lebensdauerprinzipien und das WDF-spezifische Lebensdauermodell die Lebensdauer von Frameworkobjekten. Ihr Treiber muss die Kriterien für beide Modelle erfüllen, damit Frameworkobjekte zu geeigneten Zeiten aus dem Arbeitsspeicher freigegeben werden.

COM-Lebensdauerverwaltung

In COM behält ein Aufrufer in der Regel einen Verweis auf das Objekt bei, während das Objekt verwendet wird, und der Aufrufer gibt den Verweis dann frei, wenn er das Objekt nicht mehr benötigt. Ein UMDF-Treiber muss jedoch keinen Verweis auf ein Frameworkobjekt beibehalten. Tatsächlich kann der Treiber einen Frameworkobjektverweis sofort freigeben, nachdem der Treiber das Frameworkobjekt erstellt hat.

Beispielsweise geben UMDF-Beispiele das Geräteobjekt frei, nachdem sie IWDFDriver::CreateDevice aufgerufen haben. Obwohl der Verweis frühzeitig freigegeben wird, besteht das Geräteobjekt weiterhin, bis das Gerät entfernt wird, da die WDF-Objektstruktur einen Verweis darauf enthält.

Da UMDF alle Frameworkobjekte in einer Objektstruktur nachverfolgt, muss der Treiber keinen Verweis auf Frameworkobjekte beibehalten.

Wenn Ihr Treiber jedoch einen Verweis auf ein Framework-Objekt behält, muss der Treiber den Verweis freigeben, wenn er das -Objekt nicht mehr benötigt. Ein Zirkelverweis bleibt bestehen, bis der Treiber seinen Verweis freigibt. Um Zirkelverweise zu vermeiden, sollte der Treiber in der Regel keinen expliziten Verweis auf ein Frameworkobjekt beibehalten.

Wenn der Treiber einen Verweis auf ein Framework-Objekt beibehalten muss, muss das Rückrufobjekt des Treibers auch die IObjectCleanup-Schnittstelle implementieren. Wenn der Treiber IWDFObject::D eleteWdfObject für das Frameworkobjekt aufruft, ruft das Frameworkobjekt die IObjectCleanup::OnCleanup-Methode des entsprechenden Rückrufobjekts auf. Die Implementierung von IObjectCleanup::OnCleanup muss den Verweis auf das Frameworkobjekt freigeben, damit das Framework das Framework-Objekt abreißen kann.

WDF-Lebensdauerverwaltung

Wenn Sie ein Objekt eines Typs erstellen, mit dem Sie das standardmäßige übergeordnete Element überschreiben können, sollten Sie ein übergeordnetes Element mit einer Lebensdauer auswählen, die der Lebensdauer Ihres Objekts entspricht. Weitere Informationen zu übergeordneten Standardobjekten und dazu, ob der Treiber das übergeordnete Standardobjekt überschreiben kann, finden Sie in der Tabelle unter Framework-Objekte.

Wenn Sie die Lebensdauer des Objekts abgleichen, löscht das Framework das Objekt, wenn das übergeordnete Objekt gelöscht wird. Wenn Sie die Objektlebensdauer nicht übereinstimmen und das Objekt gelöscht werden soll, bevor das übergeordnete Standardobjekt gelöscht wird, können Sie das Objekt explizit löschen, indem Sie DeleteWdfObject aufrufen, wenn das Objekt nicht mehr benötigt wird.

Wenn Sie beispielsweise ein neues Anforderungsobjekt erstellen und dann IWDFDriver::CreateWdfMemory aufrufen, um ein Speicherobjekt für diese Anforderung zu erstellen, können Sie das Anforderungsobjekt als übergeordnetes Element des neuen Speicherobjekts angeben. Da WDF untergeordnete Objekte löscht, wenn das übergeordnete Objekt gelöscht wird, muss der Treiber DeleteWdfObject nicht aufrufen, um das Speicherobjekt zu löschen.

Wenn jedoch kein übergeordnetes Element vorhanden ist, dessen Lebensdauer der Lebensdauer Ihres Objekts entspricht, und wenn Sie möchten, dass das Objekt gelöscht wird, bevor das standardmäßige übergeordnete Element gelöscht wird, müssen Sie explizit löschen. Beispielsweise könnte ein Treiber mehrere Anforderungsobjekte erstellen, die für eine kurze Dauer verwendet werden. In diesem Fall kann der Treiber Arbeitsspeicher sparen, indem er die Anforderungen explizit löscht, wenn sie nicht mehr benötigt werden.

Wenn Sie ein -Objekt erstellen, das das Überschreiben des übergeordneten Standardobjekts nicht zulässt, und wenn Sie möchten, dass das Objekt vor dem Löschen des übergeordneten Standardobjekts gelöscht wird, muss der Treiber das Objekt explizit löschen.