Lebenszyklus des Framework-Objekts

Der "Lebenszyklus" eines Frameworkobjekts erstreckt sich über die Zeit von der Erstellung eines Objekts bis zum Zeitpunkt des Löschens. Die Verweisanzahl eines Objekts steuert, wann es gelöscht wird.

Erstellen eines Framework-Objekts

Die meisten Frameworkobjekte werden durch den Aufruf eines Treibers für die Erstellungsmethode des Objekts erstellt. Beispielsweise muss jeder Frameworktreiber WdfDriverCreate aufrufen, um ein Frameworktreiberobjekt zu erstellen.

Andere Frameworkobjekte werden vom Framework erstellt. Wenn beispielsweise eine Benutzeranwendung ein Gerät für Lese- oder Schreibvorgänge öffnet, erstellt das Framework ein Frameworkdateiobjekt und übergibt es an die Rückruffunktion EvtDeviceFileCreate des Treibers.

Einige Frameworkobjekte können entweder vom Framework oder von einem Treiber erstellt werden. Wenn der E/A-Manager beispielsweise eine E/A-Anforderung an einen Treiber übermittelt, erstellt das Framework ein Framework-Anforderungsobjekt und übermittelt es an den Treiber, in der Regel durch Aufrufen eines der Anforderungshandler des Treibers. Ein Treiber kann auch Frameworkanforderungsobjekte erstellen und an andere Treiber übermitteln.

Verwenden von Verweisanzahlen

Das Framework verwaltet eine Verweisanzahl für jedes Objekt. Wenn ein Objekt erstellt wird, legt das Framework seine Verweisanzahl auf eins fest. Wenn die Verweisanzahl 0 ist, löscht das Framework das Objekt.

Treiber können die Verweisanzahl eines Objekts ändern, indem sie WdfObjectReference aufrufen, um die Verweisanzahl zu erhöhen, oder WdfObjectDereference , um die Verweisanzahl zu erhöhen. (Ein Treiber kann WdfObjectDereference nur aufrufen, wenn er zuvor WdfObjectReference aufgerufen hat.)

In den meisten Fällen müssen Treiber die Verweisanzahl eines Objekts nicht erhöhen oder verringern. Das Framework erhöht die Anzahl, bevor es das Handle des Objekts an den Treiber übergibt, und es verringert die Anzahl, wenn der Treiber das Objekt nicht mehr benötigt.

Treiber rufen WdfObjectReference auf, um sicherzustellen, dass ein Objekt (vom Framework oder von einem Treiberthread) nicht gelöscht wird, bevor der Treiber es verwendet hat. Eine Beispielsituation, in der ein Treiber WdfObjectReference und WdfObjectDereference aufrufen soll, finden Sie unter Synchronisieren des Abbruchs gesendeter Anforderungen.

Löschen eines Framework-Objekts

Objekte werden entweder gelöscht, weil ein Treiber WdfObjectDelete aufruft oder weil das Framework eine interne Löschroutine aufruft, aber ein Objekt wird nur gelöscht, wenn seine Verweisanzahl 0 ist. Nachdem der Treiber oder das Framework versucht hat, ein Objekt zu löschen, bleibt das Handle des Objekts gültig, bis die Verweisanzahl 0 ist. Ein Treiber kann ein Objekt nicht löschen, indem er einfach WdfObjectDereference aufruft , um die Verweisanzahl des Objekts auf Null zu erhöhen. Der Treiber muss auch WdfObjectDelete aufrufen.

Wenn ein Frameworkobjekt das untergeordnete Objekt eines übergeordneten Objekts ist und das übergeordnete Objekt gelöscht wird, versucht das Framework, das untergeordnete Objekt zu löschen, bevor es das übergeordnete Objekt löscht. Das Löschen von Objekten beginnt mit dem Objekt, das am weitesten vom übergeordneten Objekt entfernt ist, und arbeitet die Objekthierarchie in Richtung Stamm hoch.

Treiber können die folgenden beiden Rückruffunktionen registrieren, die das Framework aufruft, wenn der Treiber oder das Framework ein Objekt löscht:

Eine dieser Rückruffunktionen muss alle objektspezifischen Ressourcen behandeln, die der Treiber beim Erstellen des Objekts zugewiesen hat.

Das Framework verarbeitet immer das Löschen einiger Frameworkobjekte, und Treiber dürfen nicht versuchen, diese Objekte zu löschen. Eine Liste der Frameworkobjekte, die Treiber nicht löschen können, finden Sie unter WdfObjectDelete.