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


Функция PsCreateSystemThread (wdm.h)

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

Синтаксис

NTSTATUS PsCreateSystemThread(
  [out]           PHANDLE            ThreadHandle,
  [in]            ULONG              DesiredAccess,
  [in, optional]  POBJECT_ATTRIBUTES ObjectAttributes,
  [in, optional]  HANDLE             ProcessHandle,
  [out, optional] PCLIENT_ID         ClientId,
  [in]            PKSTART_ROUTINE    StartRoutine,
  [in, optional]  PVOID              StartContext
);

Параметры

[out] ThreadHandle

Указывает на переменную, которая получит дескриптор. Драйвер должен закрыть дескриптор с помощью ZwClose , когда дескриптор больше не будет использоваться. Этот дескриптор является дескриптором ядра для Windows Vista и более поздних версий Windows. В более ранних версиях Windows дескриптор может не быть дескриптором ядра.

[in] DesiredAccess

Задает ACCESS_MASK значение, представляющее запрошенные типы доступа к созданному потоку.

[in, optional] ObjectAttributes

Указывает на структуру, задающую атрибуты объекта. OBJ_PERMANENT, OBJ_EXCLUSIVE и OBJ_OPENIF не являются допустимыми атрибутами для объекта потока. В Windows XP и более поздних версиях Windows, если вызывающий объект не работает в контексте системного процесса, он должен задать атрибут OBJ_KERNEL_HANDLE для ObjectAttributes. Драйверы для Microsoft Windows 2000 и Windows 98/Me должны вызывать PsCreateSystemThread только из контекста системного процесса. Для Windows Vista и более поздних версий Windows дескриптор будет дескриптором ядра.

[in, optional] ProcessHandle

Указывает открытый дескриптор для процесса, в адресном пространстве которого должен выполняться поток. Поток вызывающего объекта должен иметь PROCESS_CREATE_THREAD доступ к этому процессу. Если этот параметр не указан, поток будет создан в начальном системном процессе. Это значение должно иметь значение NULL для потока, созданного драйвером. Используйте макрос NtCurrentProcess , определенный в ntddk.h, чтобы указать текущий процесс.

[out, optional] ClientId

Указывает на структуру, которая получает идентификатор клиента нового потока. Это значение должно иметь значение NULL для потока, созданного драйвером.

[in] StartRoutine

Точка входа для вновь созданного системного потока. Этот параметр является указателем функции на подпрограмму ThreadStart , которая получает один аргумент, который представляет собой значение параметра StartContext , предоставленное вызывающим элементом.

[in, optional] StartContext

Предоставляет один аргумент, который передается потоку, когда он начинает выполнение.

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

PsCreateSystemThread возвращает STATUS_SUCCESS, если поток был создан.

Комментарии

Драйверы, создающие выделенные устройствами потоки, вызывают эту подпрограмму либо при инициализации, либо когда запросы ввода-вывода начинают поступать в подпрограммы диспетчеризации такого драйвера. Например, драйвер может создать такой поток при получении асинхронного запроса на управление устройством.

PsCreateSystemThread создает поток в режиме ядра, который начинает отдельный поток выполнения в системе. Такой системный поток не имеет контекста TEB или пользовательского режима и работает только в режиме ядра.

Если входной processHandle имеет значение NULL, созданный поток связывается с системным процессом. Такой поток продолжает выполняться до тех пор, пока система не завершит работу или поток не завершит работу, вызвав PsTerminateSystemThread.

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

InitializeObjectAttributes(&ObjectAttributes, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);

Дополнительные сведения о параметре StartContext см. в разделе ThreadStart.

Вновь созданный системный поток выполняется на PASSIVE_LEVEL в критическом регионе с отключенными обычными APC ядра .

Требования

Требование Значение
Целевая платформа Универсальное
Верхняя часть wdm.h (включая Wdm.h, Ntddk.h, Ntifs.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
Правила соответствия DDI HwStorPortProhibitedDDIs(storport), IrqlPsPassive(wdm)

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

InitializeObjectAttributes

KeSetBasePriorityThread

KeSetPriorityThread

PsTerminateSystemThread

Запуск потока

ZwSetInformationThread