Freigeben über


PsCreateSystemThread-Funktion (wdm.h)

Die PsCreateSystemThread-Routine erstellt einen Systemthread, der im Kernelmodus ausgeführt wird, und gibt ein Handle für den Thread zurück.

Syntax

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
);

Parameter

[out] ThreadHandle

Verweist auf eine Variable, die das Handle empfängt. Der Treiber muss das Handle mit ZwClose schließen, sobald das Handle nicht mehr verwendet wird. Dieses Handle ist ein Kernelhandle für Windows Vista und höhere Versionen von Windows. In früheren Versionen von Windows ist das Handle möglicherweise kein Kernelhandle.

[in] DesiredAccess

Gibt den ACCESS_MASK Wert an, der die angeforderten Zugriffstypen für den erstellten Thread darstellt.

[in, optional] ObjectAttributes

Verweist auf eine -Struktur, die die Attribute des Objekts angibt. OBJ_PERMANENT, OBJ_EXCLUSIVE und OBJ_OPENIF sind keine gültigen Attribute für ein Threadobjekt. Wenn der Aufrufer unter Windows XP und höheren Versionen von Windows nicht im Systemprozesskontext ausgeführt wird, muss er das attribut OBJ_KERNEL_HANDLE für ObjectAttributes festlegen. Treiber für Microsoft Windows 2000 und Windows 98/Me dürfen Nur PsCreateSystemThread aus dem Systemprozesskontext aufrufen. Für Windows Vista und höhere Versionen von Windows ist das Handle ein Kernelhandle.

[in, optional] ProcessHandle

Gibt ein geöffnetes Handle für den Prozess an, in dessen Adressraum der Thread ausgeführt werden soll. Der Thread des Aufrufers muss PROCESS_CREATE_THREAD Zugriff auf diesen Prozess haben. Wenn dieser Parameter nicht angegeben wird, wird der Thread im anfänglichen Systemprozess erstellt. Dieser Wert sollte null für einen vom Treiber erstellten Thread sein. Verwenden Sie das in Ntddk.h definierte NtCurrentProcess-Makro , um den aktuellen Prozess anzugeben.

[out, optional] ClientId

Verweist auf eine Struktur, die den Clientbezeichner des neuen Threads empfängt. Dieser Wert sollte null für einen vom Treiber erstellten Thread sein.

[in] StartRoutine

Der Einstiegspunkt für den neu erstellten Systemthread. Dieser Parameter ist ein Funktionszeiger auf eine ThreadStart-Routine , die ein einzelnes Argument empfängt, bei dem es sich um den vom Aufrufer angegebenen StartContext-Parameterwert handelt.

[in, optional] StartContext

Stellt ein einzelnes Argument bereit, das an den Thread übergeben wird, wenn mit der Ausführung begonnen wird.

Rückgabewert

PsCreateSystemThread gibt STATUS_SUCCESS zurück, wenn der Thread erstellt wurde.

Hinweise

Treiber, die dedizierte Gerätethreads erstellen, rufen diese Routine auf, entweder bei der Initialisierung oder wenn E/A-Anforderungen in die Dispatch-Routinen eines solchen Treibers eingehen. Beispielsweise kann ein Treiber einen solchen Thread erstellen, wenn er eine asynchrone Gerätesteuerungsanforderung empfängt.

PsCreateSystemThread erstellt einen Kernelmodusthread, der einen separaten Ausführungsthread innerhalb des Systems beginnt. Ein solcher Systemthread hat keinen TEB- oder Benutzermoduskontext und wird nur im Kernelmodus ausgeführt.

Wenn die ProcessHandle-EingabeNULL ist, wird der erstellte Thread dem Systemprozess zugeordnet. Ein solcher Thread wird so lange ausgeführt, bis entweder das System heruntergefahren wird oder der Thread sich selbst durch Aufrufen von PsTerminateSystemThread beendet.

Treiberroutinen, die in einem anderen Prozesskontext als dem des Systemprozesses ausgeführt werden, müssen das attribut OBJ_KERNEL_HANDLE für den ObjectAttributes-Parameter von PsCreateSystemThread festlegen. Dadurch wird die Verwendung des von PsCreateSystemThread zurückgegebenen Handles auf Prozesse beschränkt, die im Kernelmodus ausgeführt werden. Andernfalls kann der Prozess, in dessen Kontext der Treiber ausgeführt wird, auf das Threadhandle zugreifen. Treiber können das attribut OBJ_KERNEL_HANDLE wie folgt festlegen.

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

Weitere Informationen zum StartContext-Parameter finden Sie unter ThreadStart.

Der neu erstellte Systemthread wird in PASSIVE_LEVEL innerhalb einer kritischen Region mit deaktivierten normalen Kernel-APCs ausgeführt.

Anforderungen

Anforderung Wert
Zielplattform Universell
Header wdm.h (einschließlich Wdm.h, Ntddk.h, Ntifs.h)
Bibliothek NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI-Complianceregeln HwStorPortProhibitedDIs(storport), IrqlPsPassive(wdm)

Weitere Informationen

InitializeObjectAttributes

KeSetBasePriorityThread

KeSetPriorityThread

PsTerminateSystemThread

Threadstart

ZwSetInformationThread