Freigeben über


Prozess und Thread-Manager im Windows-Kernelmodus

Ein Prozess ist ein Softwareprogramm, das derzeit in Windows ausgeführt wird. Jeder Prozess verfügt über eine ID, eine Zahl, die ihn identifiziert. Ein Thread ist ein Objekt, das angibt, welcher Teil des Programms ausgeführt wird. Jeder Thread verfügt über eine ID, eine Zahl, die ihn identifiziert.

Ein Prozess kann mehrere Threads aufweisen. Der Zweck eines Threads besteht darin, Prozessorzeit zuzuweisen. Auf einem Computer mit einem Prozessor können mehrere Threads zugewiesen werden, aber jeweils kann nur ein Thread ausgeführt werden. Jeder Thread wird nur kurz ausgeführt, und dann wird die Ausführung an den nächsten Thread übergeben, sodass der Benutzer die Illusion erhält, dass mehr als eine Sache gleichzeitig geschieht. Auf einem Computer mit mehr als einem Prozessor kann das echte Multithreading stattfinden. Wenn eine Anwendung über mehrere Threads verfügt, können die Threads gleichzeitig auf verschiedenen Prozessoren ausgeführt werden.

Der Windows-Kernelmodusprozess und der Thread-Manager verarbeitet die Ausführung aller Threads in einem Prozess. Unabhängig davon, ob Sie über einen Oder mehrere Prozessor verfügen, müssen Sie bei der Treiberprogrammierung darauf achten, dass alle Threads Ihres Prozesses so konzipiert sind, dass unabhängig von der Reihenfolge, in der die Threads behandelt werden, ordnungsgemäß ausgeführt werden.

Wenn Threads aus unterschiedlichen Prozessen versuchen, dieselbe Ressource gleichzeitig zu verwenden, können Probleme auftreten. Windows bietet mehrere Techniken, um dieses Problem zu vermeiden. Die Technik, sicherzustellen, dass Threads aus verschiedenen Prozessen nicht die gleiche Ressource berühren, wird als Synchronisierung bezeichnet. Weitere Informationen zur Synchronisierung finden Sie unter "Synchronisierungstechniken".

Routinen, die eine direkte Schnittstelle zum Prozess und Thread-Manager bereitstellen, werden in der Regel den Buchstaben "Ps" vorangestellt; Beispiel: PsCreateSystemThread. Eine Liste der Kernel-DDIs finden Sie unter Windows-Kernel.

Diese Richtlinien gelten für diese Rückrufroutinen:

PCREATE_PROCESS_NOTIFY_ROUTINE

PCREATE_PROCESS_NOTIFY_ROUTINE_EX

PCREATE_THREAD_NOTIFY_ROUTINE

PLOAD_IMAGE_NOTIFY_ROUTINE

POB_PRE_OPERATION_CALLBACK

POB_POST_OPERATION_CALLBACK

Verwenden Sie die folgenden bewährten Methoden:

  • Halten Sie Routinen kurz und einfach.
  • Führen Sie keine Aufrufe in einen Benutzermodusdienst durch, um den Prozess, den Thread oder das Bild zu überprüfen.
  • Führen Sie keine Registrierungsaufrufe aus.
  • Führen Sie keine Blockierungs- und/oder Interprocess Communication (IPC)-Funktionsaufrufe durch.
  • Synchronisieren Sie nicht mit anderen Threads, da dies zu Wiederantritts-Deadlocks führen kann.
  • Verwenden Sie Systemworker-Threads, um Aufgaben in die Warteschlange zu stellen, die insbesondere Aufgaben umfassen wie:
    • Langsame APIs oder APIs, die einen anderen Prozess aufrufen.
    • Jedes Blockierungsverhalten, das Threads in Kerndiensten unterbrechen kann.
  • Wenn Sie System Worker Threads verwenden, warten Sie nicht, bis die Arbeit abgeschlossen ist. Damit wird der Zweck der asynchronen Warteschlange für die Erledigung der Arbeit verfehlt.
  • Berücksichtigen Sie bewährte Methoden für die Stapelnutzung im Kernelmodus. Beispiele finden Sie unter "Wie kann ich meinen Treiber daran hindern, den Kernelmodusstapel auslaufen zu lassen?" und wichtige Treiberkonzepte und Tipps.

Subsystemprozesse

Ab Windows 10 ermöglicht das Windows-Subsystem für Linux (WSL) einem Benutzer, systemeigene Linux ELF64-Binärdateien unter Windows zusammen mit anderen Windows-Anwendungen auszuführen. Informationen zur WSL-Architektur und zu den Komponenten des Benutzermodus und des Kernelmodus, die zum Ausführen der Binärdateien erforderlich sind, finden Sie in den Beiträgen im Windows-Subsystem für Linux.For Information about wSL architecture and the user-mode and kernel-mode components that are required to run the binaries, see the posts on the Windows Subsystem for Linux blog.

Eine der Komponenten ist ein Subsystemprozess , bei dem die nicht geänderte Linux-Binärdatei des Benutzermodus gehostet wird, z. B. "/bin/bash". Subsystemprozesse enthalten keine Datenstrukturen, die Win32-Prozessen zugeordnet sind, z. B. Process Environment Block (PEB) und Thread Environment Block (TEB). Für einen Subsystemprozess werden Systemaufrufe und Benutzermodus-Ausnahmen an einen gekoppelten Treiber verteilt.

Hier sind die Änderungen an den Prozess- und Thread-Manager-Routinen , um Subsystemprozesse zu unterstützen:

  • Der WSL-Typ wird durch den SubsystemInformationTypeWSL-Wert in der SUBSYSTEM_INFORMATION_TYPE Enumeration angegeben. Treiber können NtQueryInformationProcess und NtQueryInformationThread aufrufen, um das zugrunde liegende Subsystem zu ermitteln. Diese Aufrufe geben SubsystemInformationTypeWSL für WSL zurück.

  • Andere Kernelmodustreiber können über die Erstellung/Löschung des Subsystemprozesses benachrichtigt werden, indem sie ihre Rückrufroutine über den PsSetCreateProcessNotifyRoutineEx2-Aufruf registrieren. Um Benachrichtigungen zum Erstellen/Löschen von Threads zu erhalten, können Treiber PsSetCreateThreadNotifyRoutineEx aufrufen und PsCreateThreadNotifySubsystems als Benachrichtigungstyp angeben.

  • Die PS_CREATE_NOTIFY_INFO Struktur wurde um ein IsSubsystemProcess-Element erweitert, das ein anderes Subsystem als Win32 angibt. Andere Member wie FileObject, ImageFileName, CommandLine geben zusätzliche Informationen zum Subsystemprozess an. Informationen über das Verhalten dieser Elemente finden Sie unter SUBSYSTEM_INFORMATION_TYPE.