Freigeben über


ObDereferenceObjectDeferDeleteWithTag-Funktion (wdm.h)

Die ObDereferenceObjectDeferDeleteWithTag-Routine dekrementiert die Verweisanzahl für das angegebene Objekt, verschiebt das Löschen des Objekts, um Deadlocks zu vermeiden, und schreibt einen Tagwert mit vier Byte in das Objekt, um die Objektverweisablaufverfolgung zu unterstützen.

Syntax

void ObDereferenceObjectDeferDeleteWithTag(
  [in] PVOID Object,
  [in] ULONG Tag
);

Parameter

[in] Object

Ein Zeiger auf das -Objekt. Der Aufrufer ruft diesen Zeiger entweder beim Erstellen des Objekts oder von einem vorherigen Aufruf der ObReferenceObjectByHandleWithTag-Routine ab, nachdem das Objekt geöffnet wurde.

[in] Tag

Gibt einen benutzerdefinierten Tagwert mit vier Byte an. Weitere Informationen finden Sie im folgenden Abschnitt "Hinweise".

Rückgabewert

Keine

Bemerkungen

ObDereferenceObjectDeferDeleteWithTag ähnelt ObDereferenceObjectWithTag , mit der Ausnahme, dass ObDereferenceObjectDeferenceObjectDeferEteWithTag die Objektlöschanforderung an einen Workerthread übergibt, wenn die Verweisanzahl des Objekts 00 erreicht. Der Workerthread, der unter IRQL = PASSIVE_LEVEL ausgeführt wird, löscht das Objekt später.

Wenn das sofortige Löschen eines Objekts durch den aktuellen Thread zu einem Deadlock führen kann, rufen Sie ObDereferenceObjectWithTag nicht auf, um das Objekt zu dereferenzieren. Rufen Sie stattdessen ObDereferenceObjectDeferDeleteWithTag auf, um das Objekt zu dereferenzieren.

Ein solcher Deadlock kann beispielsweise auftreten, wenn ObDereferenceObjectWithTag verwendet wird, um ein KernelTransaktions-Manager-Objekt (KTM) zu deferieren, wenn ein höherstufiger Treiber auf dem Treiberstapel eine Sperre hält.

Weitere Informationen zur Objektpermanenz und zu Objektattributen finden Sie unter ObDereferenceObjectWithTag. Weitere Informationen zu Objektverweise finden Sie unter Lebenszyklus eines Objekts.

Die ObDereferenceObjectDeferDelete-Routine ähnelt ObDereferenceObjectDeferDeleteWithTag, mit der Ausnahme, dass der Aufrufer kein benutzerdefiniertes Tag in ein Objekt schreiben kann. In Windows 7 und höheren Versionen von Windows schreibt ObDereferenceObjectDeferDelete immer einen Standardwert ('tlfD') in das Objekt. Ein Aufruf von ObDereferenceObjectDeferDelete hat die gleiche Auswirkung wie ein Aufruf von ObDereferenceObjectDeferDeleteWithTag , der Tag = 'tlfD' angibt.

Um eine Objektverweisablaufverfolgung in den Windows-Debugtools anzuzeigen, verwenden Sie die Debuggererweiterung !obtrace im Kernelmodus. In Windows 7 wird die Erweiterung !obtrace erweitert, um Objektverweistags anzuzeigen, wenn die Objektverweisablaufverfolgung aktiviert ist. Standardmäßig ist die Objektverweisablaufverfolgung deaktiviert. Verwenden Sie den Global Flags Editor (Gflags), um die Objektverweisablaufverfolgung zu aktivieren. Weitere Informationen finden Sie unter Objektverweisablaufverfolgung mit Tags.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Verfügbar in Windows 7 und höheren Versionen des Windows-Betriebssystems.
Zielplattform Universell
Header wdm.h (include Wdm.h, Ntddk.h, Ntifs.h, Fltkernel.h)
Bibliothek NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL

Weitere Informationen

ObDereferenceObjectDeferDelete

ObDereferenceObjectWithTag

ObReferenceObjectByHandleWithTag