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.

Marca 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 aplicarán para el objeto, incluso si el objeto se está abriendo 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, a los tipos de acceso concedidos y a 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 el IRP. (Para obtener más información, consulte 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, *SeTokenObjectType o *CmKeyObjectType.

Nota

El tipo de objeto SeTokenObjectType es compatible con el estrellado con Windows XP y el tipo de objeto CmKeyObjectType es compatible con el estrellado con Windows 7.

[in] AccessMode

Modo de acceso que se va a 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 en un controlador (por ejemplo, el 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 para el 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.

Comentarios

Si el parámetro Object apunta a un objeto de archivo (es decir, una estructura de FILE_OBJECT), solo se puede llamar a ObOpenObjectByPointer después de crear al menos un identificador para el objeto de archivo. Los autores de llamadas pueden comprobar el miembro Flags de la estructura 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 al llamar a ZwClose.

Las rutinas de controlador que se ejecutan en un contexto de proceso distinto del del proceso del sistema deben establecer la marca de 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 ejecuta el controlador.

Requisitos

Requisito Value
Plataforma de destino Universal
Encabezado ntifs.h (incluya Ntifs.h)
Library NtosKrnl.lib
Archivo DLL NtosKrnl.exe
IRQL <= APC_LEVEL

Consulte también

ACCESS_MASK

ACCESS_STATE

IRP_MJ_CREATE

ObReferenceObject

ObReferenceObjectByHandle

ObReferenceObjectByPointer

ZwClose