Функция 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 |