Service Control Manager - Service Control Manager
Service Control Manager ( SCM ) ist ein spezieller System - Prozess unter der Windows NT - Familie von Betriebssystemen , die starten, stoppen und wirkt mit Windows - Service - Prozessen. Es befindet sich in der %SystemRoot%\System32\services.exe
ausführbaren Datei. Dienstprozesse interagieren mit SCM über eine genau definierte API . Dieselbe API wird intern von den interaktiven Windows-Dienstverwaltungstools wie dem MMC- Snap-In Services.msc
und dem Befehlszeilen-Dienststeuerungsdienstprogramm verwendet sc.exe
. Das Beenden dieser Datei wird als Methode verwendet, um den Blue Screen of Death auszulösen .
Implementierung
Die ausführbare SCM-Datei wird Services.exe
als Windows-Konsolenprogramm ausgeführt und vom Wininit- Prozess früh während des Systemstarts gestartet . Die Hauptfunktion SvcCtrlMain()
startet alle Dienste, die für den automatischen Start konfiguriert sind. Zunächst wird eine interne Datenbank installierter Dienste durch Lesen der folgenden zwei Registrierungsschlüssel initialisiert:
-
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder\List
, enthält die Namen und die Reihenfolge der Servicegruppen. Der Registrierungsschlüssel jedes Dienstes enthält einen optionalenGroup
Wert, der die Reihenfolge der Initialisierung eines jeweiligen Dienstes oder Gerätetreibers in Bezug auf andere Dienstgruppen regelt . -
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
, die die eigentliche Datenbank mit Diensten und Gerätetreibern enthält und in die interne Datenbank von SCM eingelesen wird. SCM liest denGroup
Wert jedes Dienstes sowie die Abhängigkeiten der Ladereihenfolge von seinenDependOnGroup
undDependOnService
Registrierungsschlüsseln.
Im nächsten Schritt SvcCtrlMain()
ruft die Hauptfunktion von SCM die Funktionsfunktion auf ScGetBootAndSystemDriverState()
, die prüft, ob die Gerätetreiber, die während des Startvorgangs oder des Systemstarts gestartet werden sollen, erfolgreich geladen wurden und diejenigen, die dies nicht getan haben, in einer aufgerufenen Liste gespeichert werden ScFailedDrivers
. Dann wird ein Named Pipe \Pipe\Ntsvcs
als erstellt Remote Procedure Call Schnittstelle zwischen dem SCM und dem SCPs (Service Control Processes) , das Wechselwirken mit spezifischen Dienstleistungen.
Als Nächstes wird die ScAutoStartServices()
Funktion aufgerufen, die alle als Autostart gekennzeichneten Dienste durchläuft und dabei die berechneten Abhängigkeiten der Ladereihenfolge berücksichtigt. Im Falle einer zirkulären Abhängigkeit wird ein Fehler festgestellt und der Dienst in Abhängigkeit von einem Dienst, der zu einer Gruppe gehört, die später in der Ladereihenfolge kommt, wird übersprungen. Bei verzögerten Autostartdiensten hat die Gruppierung keine Auswirkung, und diese werden zu einem späteren Zeitpunkt des Systemstarts geladen.
Für jeden Dienst, den er starten möchte, ruft der SCM die ScStartService()
Funktion auf, die den Namen der Datei überprüft, in der der Dienst des Dienstes ausgeführt wird, und stellt sicher, dass das für den Dienst angegebene Konto mit dem Konto übereinstimmt, in dem der Dienstprozess ausgeführt wird. Jeder Dienst, der dies tut Nicht im System
Konto ausgeführt wird durch Aufrufen der LSASS- Funktion angemeldet LogonUserEx()
, für die der LSASS-Prozess nach "geheimen" Kennwörtern sucht, die im HKLM\SECURITY\Policy\Secrets\
Registrierungsschlüssel gespeichert sind und die vom SCP mithilfe der LsaStorePrivateData()
API gespeichert wurden , als der Dienst ursprünglich konfiguriert wurde.
Als nächstes wird die ScLogonAndStartImage()
Funktion für jeden Dienst aufgerufen, dessen Dienstprozess noch nicht gestartet wurde. Serviceprozesse werden in einem angehaltenen Zustand über die CreateProcessAsUser()
API erstellt. Bevor die Ausführung des Serviceprozesses wieder aufgenommen wird, wird eine Named Pipe \Pipe\Net\NtControlPipeX
(wobei X eine für jede Service-Iteration inkrementierte Zahl ist) erstellt, die als Kommunikationskanal zwischen dem SCM und dem Serviceprozess dient. StartServiceCtrlDispatcher()
Der Serviceprozess stellt durch Aufrufen der Funktion eine Verbindung zur Pipe her. Danach sendet der SCM dem Service einen "Start" -Befehl.
Verzögerte Autostartdienste
In Windows Vista wurden verzögerte Autostartdienste hinzugefügt , um das Problem eines längeren Systemstarts zu lösen und den Start kritischer Dienste zu beschleunigen, die nicht verzögert werden können. Ursprünglich wurde die Auto-Start-Methode zur Dienstinitialisierung für wesentliche Systemdienste entwickelt, von denen andere Anwendungen und Dienste abhängen. Der SCM initialisiert die verzögerten Dienste erst, nachdem alle nicht verzögerten Autostartdienste durch Aufrufen der ScInitDelayStart()
Funktion verarbeitet wurden. Diese Funktion stellt ein verzögertes Arbeitselement (standardmäßig 120 Sekunden) in die Warteschlange, das einem entsprechenden Arbeitsthread zugeordnet ist. Abgesehen von der Verzögerung nach einer Verzögerung gibt es keine weiteren Unterschiede zwischen verzögerten und nicht verzögerten Diensten.
Gerätetreiber
Dienste, deren Type
Registrierungswert speziell behandelt wird SERVICE_KERNEL_DRIVER
oder SERVICE_FILE_SYSTEM_DRIVER
werden: Diese stellen Gerätetreiber dar, für die ScStartService()
die ScLoadDeviceDriver()
Funktion aufgerufen wird, die den entsprechenden Treiber (normalerweise eine Datei mit einer Erweiterung .sys
) lädt, der sich im %SystemRoot%\System32\Drivers\
Verzeichnis befinden muss. Zu diesem Zweck wird der NtLoadDriver
Systemaufruf aufgerufen und SeLoadDriverPrivilege
dem SCM-Prozess hinzugefügt.
Buchstaben des Netzwerklaufwerks
SCM bietet eine zusätzliche Funktionalität, die völlig unabhängig von Windows-Diensten ist: Es benachrichtigt GUI- Anwendungen wie den Windows Explorer, wenn eine Netzwerklaufwerk-Buchstaben-Verbindung erstellt oder gelöscht wurde, indem Windows- Nachrichten gesendet werden WM_DEVICECHANGE
.
Siehe auch
Anmerkungen
Verweise
- Russinovich, Mark ; Solomon, David; Ionescu, Alex (2009), Windows® Internals (5. Aufl.), Microsoft Press , ISBN 0-7356-2530-1