Lebenszyklus eines Objekts

In diesem Thema wird der "Lebenszyklus" eines Objekts beschrieben, d. h. wie vom Objekt-Manager auf Objekte verwiesen und nachverfolgt wird. In diesem Thema wird auch beschrieben, wie Objekte temporär oder dauerhaft erstellt werden.

Objektverweisanzahl

Der Objekt-Manager verwaltet die Anzahl der Verweise auf ein Objekt. Wenn ein Objekt erstellt wird, legt der Objekt-Manager die Verweisanzahl des Objekts auf eins fest. Sobald dieser Indikator auf 0 (null) fällt, wird das Objekt freigegeben.

Treiber müssen sicherstellen, dass der Objekt-Manager über eine genaue Verweisanzahl für alle Objekte verfügt, die sie bearbeiten. Ein Objekt, das vorzeitig freigegeben wird, kann dazu führen, dass das System abstürzt. Ein Objekt, dessen Verweisanzahl falsch hoch ist, wird nie freigegeben.

Auf Objekte kann entweder mit dem Handle oder mit dem Zeiger verwiesen werden. Zusätzlich zur Verweisanzahl verwaltet der Objekt-Manager die Anzahl der geöffneten Handles für ein Objekt. Jede Routine, die ein Handle öffnet, erhöht sowohl die Objektverweisanzahl als auch die Objekthandleanzahl um eins. Jeder Aufruf einer solchen Routine muss mit einem entsprechenden Aufruf von ZwClose abgeglichen werden. Weitere Informationen finden Sie unter Objekthandles.

Im Kernelmodus kann mit einem Zeiger auf das -Objekt auf Objekte verwiesen werden. Routinen, die Zeiger auf Objekte zurückgeben, z. B . IoGetAttachedDeviceReference, erhöhen die Verweisanzahl um eins. Sobald der Treiber mit dem Zeiger fertig ist, muss er ObDereferenceObject aufrufen, um die Verweisanzahl um 1 zu verringern.

Die folgenden Routinen erhöhen die Verweisanzahl eines Objekts um eins:

ExCreateCallback

IoGetAttachedDeviceReference

IoGetDeviceObjectPointer

IoWMIOpenBlock

ObReferenceObject

ObReferenceObjectByHandle

ObReferenceObjectByPointer

Jeder Aufruf, der an eine der vorherigen Routinen erfolgt, muss mit einem entsprechenden Aufruf von ObDereferenceObject abgeglichen werden.

Die Routinen ObReferenceObject und ObReferenceObjectByPointer werden bereitgestellt, damit Treiber die Verweisanzahl eines bekannten Objektzeigers um eins erhöhen können. ObReferenceObject erhöht einfach die Verweisanzahl. ObReferenceObjectByPointer führt eine Zugriffsüberprüfung durch, bevor die Verweisanzahl erhöht wird.

Die ObReferenceObjectByHandle-Routine empfängt ein Objekthandle und stellt einen Zeiger auf das zugrunde liegende Objekt bereit. Auch die Verweisanzahl wird um eins erhöht.

Temporäre und permanente Objekte

Die meisten Objekte sind temporär; sie existieren, solange sie verwendet werden, und dann werden sie vom Objekt-Manager freigegeben. Objekte können erstellt werden, die dauerhaft sind. Wenn ein Objekt dauerhaft ist, enthält der Objekt-Manager selbst einen Verweis auf das -Objekt. Daher bleibt die Verweisanzahl größer als null, und das Objekt wird nicht freigegeben, wenn es nicht mehr verwendet wird.

Auf ein temporäres Objekt kann nur über den Namen zugegriffen werden, solange die Handleanzahl ungleich null ist. Sobald die Handleanzahl auf 0 (null) verringert wird, wird der Name des Objekts aus dem Namespace des Objekt-Managers entfernt. Auf solche Objekte kann weiterhin mit dem Zeiger zugegriffen werden, solange ihre Verweisanzahl größer als 0 (null) bleibt. Auf permanente Objekte kann über den Namen zugegriffen werden, solange sie vorhanden sind.

Ein Objekt kann zum Zeitpunkt seiner Erstellung dauerhaft festgelegt werden, indem das attribut OBJ_PERMANENT in der OBJECT_ATTRIBUTES-Struktur für das Objekt angegeben wird. Weitere Informationen finden Sie unter InitializeObjectAttributes.

Verwenden Sie die Routine ZwMakeTemporaryObject , um ein dauerhaftes Objekt temporär zu machen. Diese Routine bewirkt, dass ein Objekt automatisch gelöscht wird, sobald es nicht mehr verwendet wird. (Wenn das Objekt über keine geöffneten Handles verfügt, wird der Name des Objekts sofort aus dem Namespace des Objekt-Managers entfernt. Das Objekt selbst bleibt, bis die Verweisanzahl auf 0 (null) fällt.)