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