Поделиться через


Функция ObOpenObjectByPointer (ntifs.h)

Функция ObOpenObjectByPointer открывает объект, на который ссылается указатель, и возвращает дескриптор объекту.

Синтаксис

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

Параметры

[in] Object

Указатель на открытый объект.

[in] HandleAttributes

Битовая маска флагов, указывающая требуемые атрибуты для дескриптора объекта. Если вызывающий объект не запущен в контексте системного процесса, эти флаги должны включать OBJ_KERNEL_HANDLE. Этот параметр является необязательным и может быть равен нулю. В противном случае это сочетание ИЛИ одного или нескольких следующих значений.

Флаг Значение
OBJ_EXCLUSIVE Объект должен быть открыт для эксклюзивного доступа. Если этот флаг задан и вызов ObOpenObjectByPointer выполнен успешно, объект не может быть общим и не может быть открыт снова, пока дескриптор не будет закрыт. Этот флаг несовместим с флагом OBJ_INHERIT. Этот флаг недопустим для объектов файлов.
OBJ_FORCE_ACCESS_CHECK Все проверки доступа должны быть применены для объекта, даже если объект открыт в режиме ядра. Если этот флаг указан, значение параметра AccessMode игнорируется.
OBJ_INHERIT Дескриптор может наследоваться дочерними процессами текущего процесса. Этот флаг несовместим с флагом OBJ_EXCLUSIVE.
OBJ_KERNEL_HANDLE К дескриптору можно получить доступ только в режиме ядра. Этот флаг необходимо указать, если вызывающий объект не запущен в контексте системного процесса.

[in, optional] PassedAccessState

Указатель на структуру ACCESS_STATE, содержащую контекст субъекта объекта, предоставленные типы доступа и оставшиеся нужные типы доступа. Этот параметр является необязательным и может иметь значение NULL. В подпрограмме создания диспетчера этот указатель можно найти в IrpSp->Parameters.Create.SecurityContext->AccessState, где IrpSp является указателем на собственное расположение стека вызывающего объекта в IRP. (Дополнительные сведения см. в разделе IRP_MJ_CREATE.)

[in] DesiredAccess

ACCESS_MASK значение, указывающее требуемый доступ к объекту. Этот параметр является необязательным и может быть равен нулю.

[in, optional] ObjectType

Указатель на тип объекта. Если значение AccessMode равно KernelMode, этот параметр является необязательным и может иметь значение NULL. В противном случае оно должно быть либо *ExEventObjectType, *ExSemaphoreObjectType, *IoFileObjectType, *PsThreadType, *SeTokenObjectTypeили *CmKeyObjectType.

Заметка

Тип объекта seTokenObjectType поддерживается в Windows XP , а тип объекта cmKeyObjectType поддерживается в Windows 7.

[in] AccessMode

Режим доступа, используемый для проверки доступа. Этот параметр является обязательным и должен быть UserMode или KernelMode:

  • Если AccessModeKernelMode, система всегда разрешает запрошенный доступ независимо от любого ограниченного доступа, заданного ранее драйвером (например, ограниченный доступ при предыдущем вызове POB_PRE_OPERATION_CALLBACK обратный вызов).

  • Если AccessModeUserMode, запрошенный доступ сравнивается с предоставленным доступом для объекта.

[out] Handle

Указатель на выделенную вызывающим переменную, которая получает дескриптор объекту.

Возвращаемое значение

ObOpenObjectByPointer возвращает STATUS_SUCCESS или соответствующее значение NTSTATUS, например одно из следующих:

Возвращаемый код Описание
STATUS_ACCESS_DENIED Вызывающий объект не получил необходимый доступ для открытия дескриптора для объекта. Это код ошибки.
STATUS_INSUFFICIENT_RESOURCES ObOpenObjectByPointer возникла ошибка выделения пула. Это код ошибки.
STATUS_INVALID_PARAMETER Недопустимое значение флага было указано в параметре HandleAttributes. Это код ошибки.
STATUS_OBJECT_TYPE_MISMATCH Объект, на который указывает параметр объекта, не был типом, указанным в параметре ObjectType. Это код ошибки.
STATUS_PRIVILEGE_NOT_HELD Вызывающий объект не имеет необходимых привилегий для создания дескриптора с доступом, указанным в параметре DesiredAccess. Это код ошибки.
STATUS_QUOTA_EXCEEDED Вызывающий объект выполняется в контексте процесса, квота памяти которой недостаточно для выделения дескриптора объекта. Это код ошибки.
STATUS_UNSUCCESSFUL Не удалось создать дескриптор объекта. Это код ошибки.

Замечания

Если параметр Object указывает на объект файла (т. е. структуру FILE_OBJECT), ObOpenObjectByPointer можно вызывать только после создания хотя бы одного дескриптора для объекта файла. Вызывающие объекты могут проверить элемент флагов структуры FILE_OBJECT, на которую указывает параметр Object. Если установлен флаг FO_HANDLE_CREATED, это означает, что для объекта файла был создан один или несколько дескрипторов, поэтому можно безопасно вызывать ObOpenObjectByPointer.

Любой дескриптор, полученный путем вызова ObOpenObjectByPointer, должен быть выпущен путем вызова ZwClose.

Подпрограммы драйверов, выполняемые в контексте процесса, отличные от системного процесса, должны задать флаг OBJ_KERNEL_HANDLE в параметре HandleAttributes. Это ограничивает использование дескриптора, возвращаемого ObOpenObjectByPointer процессами, выполняемыми в режиме ядра. В противном случае дескриптор может получить доступ к процессу, в контексте которого выполняется драйвер.

Требования

Требование Ценность
целевая платформа Всеобщий
заголовка ntifs.h (include Ntifs.h)
библиотеки NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL

См. также

ACCESS_MASK

ACCESS_STATE

IRP_MJ_CREATE

ObReferenceObject

ObReferenceObjectByHandle

ObReferenceObjectByPointer

ZwClose