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 optionalen Group 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 den Group Wert jedes Dienstes sowie die Abhängigkeiten der Ladereihenfolge von seinen DependOnGroup und DependOnService 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