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 |