Freigeben über


ObReferenceObjectByHandleWithTag-Funktion (wdm.h)

Die ObReferenceObjectByHandleWithTag-Routine erhöht die Verweisanzahl des Objekts, das durch das angegebene Handle identifiziert wird, und schreibt einen Wert des Vier-Byte-Tags in das Objekt, um die Objektverweisablaufverfolgung zu unterstützen.

Syntax

NTSTATUS ObReferenceObjectByHandleWithTag(
  [in]            HANDLE                     Handle,
  [in]            ACCESS_MASK                DesiredAccess,
  [in, optional]  POBJECT_TYPE               ObjectType,
  [in]            KPROCESSOR_MODE            AccessMode,
  [in]            ULONG                      Tag,
  [out]           PVOID                      *Object,
  [out, optional] POBJECT_HANDLE_INFORMATION HandleInformation
);

Parameter

[in] Handle

Gibt ein geöffnetes Handle für ein Objekt an.

[in] DesiredAccess

Gibt die Zugriffstypen auf das Objekt an, das der Aufrufer anfordert. Dieser Parameter ist eine Bitmaske vom Typ ACCESS_MASK. Die Interpretation dieses Felds hängt vom Objekttyp ab. Verwenden Sie keine generischen Zugriffsrechte.

[in, optional] ObjectType

Ein Zeiger auf eine undurchsichtige Struktur, die den Objekttyp angibt. Dieser Parameter verweist auf eine OBJECT_TYPE-Struktur . Legen Sie ObjectType auf NULL oder auf einen der folgenden Zeigerwerte fest, die in der Wdm.h-Headerdatei deklariert werden: *ExEventObjectType, *ExSemaphoreObjectType, *IoFileObjectType, *PsProcessType, *PsThreadType, *SeTokenObjectType, *TmEnlistmentObjectType, *TmResourceManagerObjectType, *TmTransactionManagerObjectType oder *TmTransactionObjectType. Wenn ObjectType nicht NULL ist, überprüft die Routine, ob der angegebene Objekttyp mit dem Objekttyp des Objekts übereinstimmt, den der Handle-Parameter angibt.

[in] AccessMode

Gibt den Zugriffsmodus an, der für die Zugriffsprüfung verwendet werden soll. Es muss entweder UserMode oder KernelMode sein. Treiber sollten immer UserMode für Handles angeben, die sie aus dem Benutzeradressraum empfangen.

[in] Tag

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

[out] Object

Ein Zeiger auf eine Variable, in die die Routine einen Zeiger auf das -Objekt schreibt. In der folgenden Tabelle sind die Object-Zeigertypen aufgeführt, die durch die möglichen ObjectType-Parameterwerte festgelegt werden.

ObjectType-Parameter Objektzeigertyp
*ExEventObjectType PKEVENT
*ExSemaphoreObjectType PKSEMAPHOR
*IoFileObjectType PFILE_OBJECT
*PsProcessType PEPROCESS oder PKPROCESS
*PsThreadType PETHREAD oder PKTHREAD
*SeTokenObjectType PACCESS_TOKEN
*TmEnlistmentObjectType PKENLISTMENT
*TmResourceManagerObjectType PKRESOURCEMANAGER
*TmTransactionManagerObjectType PKTM
*TmTransactionObjectType PKTRANSACTION

Die Strukturen, auf die die Zeigertypen verweisen, sind undurchsichtig, und Treiber können nicht auf die Strukturmember zugreifen. Da die Strukturen undurchsichtig sind, ist PEPROCESS äquivalent zu PKPROCESS und PETHREAD entspricht PKTHREAD.

[out, optional] HandleInformation

Treiber legen diesen Parameter auf NULL fest.

Rückgabewert

ObReferenceObjectByHandleWithTag gibt STATUS_SUCCESS zurück, wenn der Aufruf erfolgreich ist. Mögliche Fehlerrückgabewerte sind:

Rückgabecode Beschreibung
STATUS_OBJECT_TYPE_MISMATCH Der ObjectType-Parameter gibt den falschen Objekttyp für das Objekt an, das durch den Handle-Parameter identifiziert wird.
STATUS_ACCESS_DENIED Der Aufrufer verfügt nicht über die erforderlichen Zugriffsrechte für das Objekt.
STATUS_INVALID_HANDLE Der angegebene Handle ist ungültig.

Hinweise

Diese Routine führt die Zugriffsüberprüfung des angegebenen Objekthandles durch. Wenn Zugriff gewährt werden kann, erhöht die Routine die Objektverweisanzahl und stellt einen Objektzeiger auf den Aufrufer bereit. Diese Inkrementierung verhindert, dass das Objekt gelöscht wird, während der Aufrufer das Objekt verwendet. Wenn das Objekt nicht mehr benötigt wird, sollte der Aufrufer die Verweisanzahl verringern, indem die Routine ObDereferenceObjectWithTag oder ObDereferenceObjectDeferDeleteWithTag aufgerufen wird.

Weitere Informationen zu Objektverweise finden Sie unter Lebenszyklus eines Objekts.

ObReferenceObjectByHandleWithTag schließt oder ungültig das Objekthandle, das durch den Handle-Parameter angegeben wird. Wenn das Handle nicht mehr benötigt wird, kann der Aufrufer den Handle schließen, indem er die ZwClose-Routine aufruft.

Wenn der AccessMode-ParameterwertKernelMode ist, ist der angeforderte Zugriff immer zulässig. Wenn AccessModeUserMode ist, wird der angeforderte Zugriff mit den Zugriffsrechten verglichen, die der Aufrufer für das Objekt hat. Nur Treiber der höchsten Ebene können den UserMode-Wert für den AccessMode-Parameter sicher angeben.

Ab Windows 7, wenn AccessModeKernelMode ist und handle aus dem Benutzeradressraum empfangen wird, gibt driver verifier bugcheck C4, Subcode F6 aus.

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

Um eine Objektverweisablaufverfolgung in den Windows-Debugtools anzuzeigen, verwenden Sie die Debuggererweiterung !obtrace im Kernelmodus. Die Erweiterung !obtrace wurde 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 PASSIVE_LEVEL
DDI-Complianceregeln HwStorPortProhibitedDDIs(storport)

Weitere Informationen

ACCESS_MASK

OBJECT_TYPE

ObDereferenceObjectDeferDeleteWithTag

ObDereferenceObjectWithTag

ObReferenceObjectByHandle

ZwClose