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

Подпрограмма NtOpenProcessTokenEx открывает маркер доступа, связанный с процессом, и возвращает дескриптор, который можно использовать для доступа к маркеру.

Синтаксис

__kernel_entry NTSYSCALLAPI NTSTATUS NtOpenProcessTokenEx(
  [in]  HANDLE      ProcessHandle,
  [in]  ACCESS_MASK DesiredAccess,
  [in]  ULONG       HandleAttributes,
  [out] PHANDLE     TokenHandle
);

Параметры

[in] ProcessHandle

Дескриптор процесса, маркер доступа которого необходимо открыть. Дескриптор должен иметь доступ PROCESS_QUERY_INFORMATION. Используйте макрос NtCurrentProcess , определенный в ntddk.h, чтобы указать текущий процесс.

[in] DesiredAccess

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

[in] HandleAttributes

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

[out] TokenHandle

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

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

NtOpenProcessTokenEx возвращает STATUS_SUCCESS или соответствующее состояние ошибки. Возможные коды состояния ошибок:

Код возврата Описание
STATUS_ACCESS_DENIED У ProcessHandle нет доступа к PROCESS_QUERY_INFORMATION.
STATUS_INSUFFICIENT_RESOURCES Не удалось выделить новый дескриптор маркера.
STATUS_INVALID_HANDLE ProcessHandle не был допустимым дескриптором.
STATUS_INVALID_PARAMETER Указанные атрибуты HandleAttributes не включали OBJ_KERNEL_HANDLE.
STATUS_OBJECT_TYPE_MISMATCH ProcessHandle не был дескриптором процесса.
STATUS_PRIVILEGE_NOT_HELD Вызывающий объект не имеет привилегии (SeSecurityPrivilege), необходимой для создания дескриптора маркера с доступом, указанным в параметре DesiredAccess .
STATUS_QUOTA_EXCEEDED Квоты памяти процесса недостаточно для выделения дескриптора маркера.
STATUS_UNSUCCESSFUL Не удалось создать дескриптор маркера.

Комментарии

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

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

Дополнительные сведения о безопасности и управлении доступом см. в статье Модель безопасности Windows для разработчиков драйверов и в документации по этим темам в Windows SDK.

Для вызовов из драйверов режима ядра версии NtXxx и ZwXxx подпрограммы Собственные системные службы Windows могут вести себя по-разному, так как они обрабатывают и интерпретируют входные параметры. Дополнительные сведения о связи между версиями подпрограмм NtXxx и ZwXxx см. в разделе Использование версий NT и Zw подпрограмм собственных системных служб.

Требования

Требование Значение
Минимальная версия клиента Windows XP
Целевая платформа Универсальное
Верхняя часть ntifs.h (включая Ntifs.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
Правила соответствия DDI HwStorPortProhibitedDIs, PowerIrpDDis

См. также раздел

ACCESS_MASK

ACL

PsDereferencePrimaryToken

NtClose

NtOpenThreadTokenEx