Функция ZwOpenProcessTokenEx (ntifs.h)
Подпрограмма ZwOpenProcessTokenEx открывает маркер доступа, связанный с процессом.
Синтаксис
NTSYSAPI NTSTATUS ZwOpenProcessTokenEx(
[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
Указатель на переменную, выделенную вызывающим объектом, которая получает дескриптор только что открытого маркера доступа.
Возвращаемое значение
ZwOpenProcessTokenEx возвращает 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 | Не удалось создать дескриптор маркера. |
Комментарии
ZwOpenProcessTokenEx открывает маркер доступа, связанный с процессом, и возвращает дескриптор для этого маркера.
Любой дескриптор, полученный путем вызова ZwOpenProcessTokenEx , в конечном итоге должен быть освобожден путем вызова ZwClose.
Подпрограммы драйвера, выполняемые в контексте процесса, отличном от контекста системного процесса, должны задавать атрибут OBJ_KERNEL_HANDLE для параметра HandleAttributesобъекта ZwOpenProcessTokenEx. Это ограничивает использование дескриптора, возвращаемого ZwOpenProcessTokenEx , процессами, выполняемыми в режиме ядра. В противном случае дескриптор может получить доступ к процессу, в контексте которого выполняется драйвер.
Дополнительные сведения о безопасности и управлении доступом см. в статье Модель безопасности Windows для разработчиков драйверов и в документации по этим темам в Windows SDK.
Примечание
Если вызов функции ZwOpenProcessTokenEx выполняется в пользовательском режиме, следует использовать имя NtOpenProcessTokenEx вместо ZwOpenProcessTokenEx.
Для вызовов из драйверов режима ядра версии NtXxx и ZwXxx подпрограммы Собственные системные службы Windows могут вести себя по-разному, так как они обрабатывают и интерпретируют входные параметры. Дополнительные сведения о связи между версиями подпрограмм NtXxx и ZwXxx см. в разделе Использование версий NT и Zw подпрограмм собственных системных служб.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows XP |
Целевая платформа | Универсальное |
Верхняя часть | ntifs.h (включая Ntifs.h) |
Библиотека | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
Правила соответствия DDI | HwStorPortProhibitedDIs(storport), PowerIrpDDis(wdm) |