Función ObReferenceObjectByHandleWithTag (wdm.h)

La rutina ObReferenceObjectByHandleWithTag incrementa el recuento de referencias del objeto identificado por el identificador especificado y escribe un valor de etiqueta de cuatro bytes en el objeto para admitir el seguimiento de referencia de objetos.

Sintaxis

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
);

Parámetros

[in] Handle

Especifica un identificador abierto para un objeto .

[in] DesiredAccess

Especifica los tipos de acceso al objeto que solicita el autor de la llamada. Este parámetro es una máscara de bits de tipo ACCESS_MASK. La interpretación de este campo depende del tipo de objeto. No use ningún derecho de acceso genérico.

[in, optional] ObjectType

Puntero a una estructura opaca que especifica el tipo de objeto. Este parámetro apunta a una estructura de OBJECT_TYPE . Establezca ObjectType en NULL o en uno de los siguientes valores de puntero, que se declaran en el archivo de encabezado Wdm.h: *ExEventObjectType, *ExSemaphoreObjectType, *IoFileObjectType, *PsProcessType, *PsThreadType, *SeTokenObjectType, *TmEnlistmentObjectType, *TmResourceManagerObjectType, *TmTransactionManagerObjectType o *TmTransactionObjectType. Si ObjectType no es NULL, la rutina comprueba que el tipo de objeto proporcionado coincide con el tipo de objeto del objeto que especifica el parámetro Handle .

[in] AccessMode

Especifica el modo de acceso que se va a usar para la comprobación de acceso. Debe ser UserMode o KernelMode. Los controladores siempre deben especificar UserMode para los identificadores que reciben del espacio de direcciones del usuario.

[in] Tag

Especifica un valor de etiqueta personalizada de cuatro bytes. Para obtener más información, vea la sección Comentarios que se muestra más adelante.

[out] Object

Puntero a una variable en la que la rutina escribe un puntero en el objeto . En la tabla siguiente se enumeran los tipos de puntero Object designados por los posibles valores de parámetro ObjectType .

Parámetro ObjectType Tipo de puntero de objeto
*ExEventObjectType PKEVENT
*ExSemaphoreObjectType PKSEMAPHORE
*IoFileObjectType PFILE_OBJECT
*PsProcessType PEPROCESS o PKPROCESS
*PsThreadType PETHREAD o PKTHREAD
*SeTokenObjectType PACCESS_TOKEN
*TmEnlistmentObjectType PKENLISTMENT
*TmResourceManagerObjectType PKRESOURCEMANAGER
*TmTransactionManagerObjectType PKTM
*TmTransactionObjectType PKTRANSACTION

Las estructuras a las que hacen referencia los tipos de puntero son opacas y los controladores no pueden acceder a los miembros de la estructura. Dado que las estructuras son opacas, PEPROCESS es equivalente a PKPROCESS y PETHREAD es equivalente a PKTHREAD.

[out, optional] HandleInformation

Los controladores establecen este parámetro en NULL.

Valor devuelto

ObReferenceObjectByHandleWithTag devuelve STATUS_SUCCESS si la llamada se realiza correctamente. Entre los posibles valores devueltos de error se incluyen los siguientes:

Código devuelto Descripción
STATUS_OBJECT_TYPE_MISMATCH El parámetro ObjectType especifica el tipo de objeto incorrecto para el objeto identificado por el parámetro Handle .
STATUS_ACCESS_DENIED El autor de la llamada no tiene los derechos de acceso necesarios para el objeto.
STATUS_INVALID_HANDLE El identificador especificado no es válido.

Comentarios

Esta rutina tiene acceso a la validación del identificador de objeto especificado. Si se puede conceder acceso, la rutina incrementa el recuento de referencias de objetos y proporciona un puntero de objeto al autor de la llamada. Este incremento impide que el objeto se elimine mientras el autor de la llamada usa el objeto . Cuando el objeto ya no es necesario, el autor de la llamada debe disminuir el recuento de referencias llamando a la rutina ObDereferenceObjectWithTag o ObDereferenceObjectDeferDeleteWithTag .

Para obtener más información sobre las referencias a objetos, vea Ciclo de vida de un objeto.

ObReferenceObjectByHandleWithTag no cierra ni invalida el identificador de objeto especificado por el parámetro Handle . Cuando el identificador ya no es necesario, el autor de la llamada puede cerrar el identificador llamando a la rutina ZwClose .

Si el valor del parámetro AccessMode es KernelMode, siempre se permite el acceso solicitado. Si AccessMode es UserMode, el acceso solicitado se compara con los derechos de acceso que el autor de la llamada tiene en el objeto . Solo los controladores de nivel superior pueden especificar de forma segura el valor UserMode para el parámetro AccessMode .

A partir de Windows 7, si AccessMode es KernelMode y se recibe el identificador del espacio de direcciones del usuario, el comprobador de controladores emite la comprobación de errores C4, subcódigo F6.

La rutina ObReferenceObjectByHandle es similar a ObReferenceObjectByHandleWithTag, salvo que no permite al autor de la llamada escribir una etiqueta personalizada en un objeto. En Windows 7 y versiones posteriores de Windows, ObReferenceObjectByHandle siempre escribe un valor de etiqueta predeterminado ('tlfD') en el objeto . Una llamada a ObReferenceObjectByHandle tiene el mismo efecto que una llamada a ObReferenceObjectByHandleWithTag que especifica Tag = 'tlfD'.

Para ver un seguimiento de referencia de objeto en las herramientas de depuración de Windows, use la extensión !obtrace kernel-mode debugger. La extensión !obtrace se mejora para mostrar etiquetas de referencia de objetos, si está habilitado el seguimiento de referencia de objetos. De forma predeterminada, el seguimiento de referencia de objetos está desactivado. Use el Editor global de marcas (Gflags) para habilitar el seguimiento de referencia de objetos. Para obtener más información, vea Seguimiento de referencia de objetos con etiquetas.

Requisitos

Requisito Value
Cliente mínimo compatible Disponible en Windows 7 y versiones posteriores del sistema operativo Windows.
Plataforma de destino Universal
Encabezado wdm.h (include Wdm.h, Ntddk.h, Ntifs.h, Fltkernel.h)
Library NtosKrnl.lib
Archivo DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
Reglas de cumplimiento de DDI HwStorPortProhibitedDIs(storport)

Consulte también

ACCESS_MASK

OBJECT_TYPE

ObDereferenceObjectDeferDeleteWithTag

ObDereferenceObjectWithTag

ObReferenceObjectByHandle

ZwClose