Windows Kernel-Mode Prozess- und Thread-Manager
Ein Prozess ist ein Softwareprogramm, das derzeit unter Windows ausgeführt wird. Jeder Prozess hat eine ID, eine Zahl, die ihn identifiziert. Ein Thread ist ein Objekt, das identifiziert, welcher Teil des Programms ausgeführt wird. Jeder Thread hat eine ID, eine Zahl, die ihn identifiziert.
Ein Prozess kann mehr als einen Thread aufweisen. Der Zweck eines Threads besteht darin, Prozessorzeit zuzuweisen. Auf einem Computer mit einem Prozessor kann mehr als ein Thread zugeordnet werden, aber nur ein Thread kann gleichzeitig 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 hat, dass mehr als eine Sache gleichzeitig geschieht. Auf einem Computer mit mehr als einem Prozessor kann echtes 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 übernehmen die Ausführung aller Threads in einem Prozess. Unabhängig davon, ob Sie über einen oder mehrere Prozessoren verfügen, muss bei der Treiberprogrammierung mit großer Sorgfalt sichergestellt werden, dass alle Threads Ihres Prozesses so konzipiert sind, dass unabhängig davon, in welcher Reihenfolge die Threads verarbeitet werden, Ihr Treiber ordnungsgemäß funktioniert.
Wenn Threads aus verschiedenen Prozessen versuchen, dieselbe Ressource gleichzeitig zu verwenden, können Probleme auftreten. Windows bietet mehrere Techniken, um dieses Problem zu vermeiden. Die Technik, um sicherzustellen, dass Threads aus verschiedenen Prozessen nicht dieselbe 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 bieten, sind normalerweise mit den Buchstaben "Ps" versehen. Beispiel : PsCreateSystemThread. Eine Liste der Kernel-DDIs finden Sie unter Windows-Kernel.
Bewährte Methoden für die Implementierung prozess- und threadbezogener Rückruffunktionen
Diese Richtlinien gelten für diese Rückrufroutinen:
PCREATE_PROCESS_NOTIFY_ROUTINE
PCREATE_PROCESS_NOTIFY_ROUTINE_EX
- Halten Sie Routinen kurz und einfach.
- Führen Sie keine Aufrufe an einen Benutzermodusdienst aus, um den Prozess, den Thread oder das Image zu überprüfen.
- Führen Sie keine Registrierungsaufrufe aus.
- Führen Sie keine Blockierungs- und/oder Interprocess Communication-Funktionsaufrufe (IPC) aus.
- Synchronisieren Sie nicht mit anderen Threads, da dies zu deadlocks führen kann.
- Verwenden Sie System Worker Threads , um Arbeit in die Warteschlange zu stellen, insbesondere für Aufgaben, die Folgendes umfassen:
- Langsame API's oder API's, die einen anderen Prozess aufrufen.
- Jedes Blockierungsverhalten, das Threads in Kerndiensten unterbrechen könnte.
- Wenn Sie System Worker-Threads verwenden, warten Sie nicht, bis die Arbeit abgeschlossen ist. Dadurch wird der Zweck des Anstehens der Arbeit, die asynchron abgeschlossen werden soll, vereitelt.
- Beachten Sie bewährte Methoden für die Verwendung des Kernelmodusstapels. Beispiele finden Sie unter Gewusst wie, dass mein Treiber nicht aus dem Kernelmodusstapel ausgeht? und Wichtige Treiberkonzepte und Tipps.
Subsystemprozesse
Ab Windows 10 ermöglicht die Windows-Subsystem für Linux (WSL) einem Benutzer, native Linux ELF64-Binärdateien unter Windows zusammen mit anderen Windows-Anwendungen auszuführen. Informationen zur WSL-Architektur und zu den Komponenten des Benutzermodus und Kernelmodus, die zum Ausführen der Binärdateien erforderlich sind, finden Sie in den Beiträgen im Windows-Subsystem für Linux Blog.
Eine der Komponenten ist ein Subsystemprozess , der die nicht geänderte Linux-Binärdatei im Benutzermodus hostet, z. B. /bin/bash. Subsystemprozesse enthalten keine Datenstrukturen, die Win32-Prozessen zugeordnet sind, z. B. Process Environment Block (PEB) und Thread Environment Block (TEB). Bei einem Subsystemprozess werden Systemaufrufe und Benutzermodusausnahmen an einen gekoppelten Treiber verteilt.
Hier sind die Änderungen an den Prozess- und Thread-Manager-Routinen zur Unterstützung von Subsystemprozessen:
- 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 bestimmen. 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 zum Verhalten dieser Member finden Sie unter SUBSYSTEM_INFORMATION_TYPE.