Compartir a través de


Función ObOpenObjectByPointer (ntifs.h)

La función ObOpenObjectByPointer abre un objeto al que hace referencia un puntero y devuelve un identificador al objeto .

Sintaxis

NTSTATUS ObOpenObjectByPointer(
  [in]           PVOID           Object,
  [in]           ULONG           HandleAttributes,
  [in, optional] PACCESS_STATE   PassedAccessState,
  [in]           ACCESS_MASK     DesiredAccess,
  [in, optional] POBJECT_TYPE    ObjectType,
  [in]           KPROCESSOR_MODE AccessMode,
  [out]          PHANDLE         Handle
);

Parámetros

[in] Object

Puntero al objeto que se va a abrir.

[in] HandleAttributes

Máscara de bits de marcas que especifican los atributos deseados para el identificador de objeto. Si el autor de la llamada no se está ejecutando en el contexto del proceso del sistema, estas marcas deben incluir OBJ_KERNEL_HANDLE. Este parámetro es opcional y puede ser cero. De lo contrario, es una combinación OR'ed de uno o varios de los valores siguientes.

Bandera Significado
OBJ_EXCLUSIVE El objeto se va a abrir para el acceso exclusivo. Si se establece esta marca y la llamada a ObOpenObjectByPointer se realiza correctamente, el objeto no se puede compartir y no se puede volver a abrir hasta que se cierre el identificador. Esta marca no es compatible con la marca OBJ_INHERIT. Esta marca no es válida para los objetos de archivo.
OBJ_FORCE_ACCESS_CHECK Todas las comprobaciones de acceso se deben aplicar para el objeto, incluso si el objeto se abre en modo kernel. Si se especifica esta marca, se omite el valor del parámetro AccessMode.
OBJ_INHERIT Los procesos secundarios del proceso actual pueden heredar el identificador. Esta marca no es compatible con la marca OBJ_EXCLUSIVE.
OBJ_KERNEL_HANDLE Solo se puede acceder al identificador en modo kernel. Esta marca debe especificarse si el autor de la llamada no se está ejecutando en el contexto del proceso del sistema.

[in, optional] PassedAccessState

Puntero a una estructura de ACCESS_STATE que contiene el contexto del sujeto del objeto, los tipos de acceso concedidos y los tipos de acceso deseados restantes. Este parámetro es opcional y puede ser NULL. En una rutina de envío de creación, este puntero se puede encontrar en IrpSp->Parameters.Create.SecurityContext->AccessState, donde irpSp es un puntero a la propia ubicación de pila del autor de la llamada en IRP. (Para obtener más información, vea IRP_MJ_CREATE).

[in] DesiredAccess

ACCESS_MASK valor que especifica el acceso deseado al objeto. Este parámetro es opcional y puede ser cero.

[in, optional] ObjectType

Puntero al tipo de objeto. Si el valor de AccessMode es KernelMode, este parámetro es opcional y puede ser NULL. De lo contrario, debe ser *ExEventObjectType , *ExSemaphoreObjectType, *IoFileObjectType, *PsThreadType, *SeTokenObjectTypeo *CmKeyObjectType.

Nota

El tipo de objeto se admite el SeTokenObjectType con Windows XP y el tipo de objeto CmKeyObjectType se admite la estrellación con Windows 7.

[in] AccessMode

Modo de acceso que se usará para la comprobación de acceso. Este parámetro es necesario y debe ser UserMode o KernelMode:

  • Si AccessMode es KernelMode, el sistema siempre permite el acceso solicitado independientemente de cualquier acceso restringido establecido previamente un controlador (por ejemplo, acceso restringido en una llamada anterior a POB_PRE_OPERATION_CALLBACK devolución de llamada).

  • Si AccessMode es userMode, el acceso solicitado se compara con el acceso concedido para el objeto.

[out] Handle

Puntero a una variable asignada por el autor de la llamada que recibe un identificador del objeto .

Valor devuelto

ObOpenObjectByPointer devuelve STATUS_SUCCESS o un valor NTSTATUS adecuado, como uno de los siguientes:

Código devuelto Descripción
STATUS_ACCESS_DENIED El autor de la llamada no tenía el acceso necesario para abrir un identificador para el objeto . Se trata de un código de error.
STATUS_INSUFFICIENT_RESOURCES ObOpenObjectByPointer encontró un error de asignación de grupo. Se trata de un código de error.
STATUS_INVALID_PARAMETER Se especificó un valor de marca no válido en el parámetro HandleAttributes. Se trata de un código de error.
STATUS_OBJECT_TYPE_MISMATCH El objeto al que apunta el parámetro Object no era del tipo especificado en el parámetro ObjectType. Se trata de un código de error.
STATUS_PRIVILEGE_NOT_HELD El autor de la llamada no tenía el privilegio necesario para crear un identificador con el acceso especificado en el parámetro DesiredAccess. Se trata de un código de error.
STATUS_QUOTA_EXCEEDED El autor de la llamada se ejecuta en el contexto de un proceso cuya cuota de memoria no es suficiente para asignar el identificador de objeto. Se trata de un código de error.
STATUS_UNSUCCESSFUL No se pudo crear el identificador de objeto. Se trata de un código de error.

Observaciones

Si el parámetro Object apunta a un objeto de archivo (es decir, una estructura de FILE_OBJECT), ObOpenObjectByPointer solo se puede llamar después de crear al menos un identificador para el objeto de archivo. Los autores de llamadas pueden comprobar el miembro marcas de de la estructura de FILE_OBJECT a la que apunta el parámetro Object. Si se establece la marca FO_HANDLE_CREATED, esto significa que se han creado uno o varios identificadores para el objeto de archivo, por lo que es seguro llamar a ObOpenObjectByPointer.

Cualquier identificador obtenido mediante una llamada a obOpenObjectByPointer debe liberarse llamando a ZwClose.

Las rutinas de controlador que se ejecutan en un contexto de proceso distinto del del proceso del sistema deben establecer la marca OBJ_KERNEL_HANDLE en el parámetro HandleAttributes. Esto restringe el uso del identificador devuelto por ObOpenObjectByPointer a los procesos que se ejecutan en modo kernel. De lo contrario, el proceso puede acceder al identificador en cuyo contexto se está ejecutando el controlador.

Requisitos

Requisito Valor
de la plataforma de destino de Universal
encabezado de ntifs.h (incluya Ntifs.h)
biblioteca de NtosKrnl.lib
DLL de NtosKrnl.exe
irQL <= APC_LEVEL

Consulte también

ACCESS_MASK

ACCESS_STATE

IRP_MJ_CREATE

ObReferenceObject de

obReferenceObjectByHandle

obReferenceObjectByPointer

ZwClose