SVCHOST; SERVICES; DLLs

So mancher Benutzer der den Weg in den Windows TaskManager kennt, erschrickt gerne mal beim Anblick mehrerer Prozesse mit dem Namen svchost.exe 1) 2). Doch keine Panik, der ServiceHost (svchost) ist ein Systemprozess und mehrere Instanzen davon sind normal. Dieser Artikel beschreibt die Funktionalität und Arbeitsweise des SVCHOST etwas detaillierter.

Windows Dienste (SERVICES) sind ein substanzieller Bestandteil des Windows Betriebssystems und in seiner einfachsten Form liegen diese Dienste als ausfürbare Datei vor (StandAloneService). Gewöhnlicher jedoch ist, dass mehrere Dienste in Gruppen zusammengefasst werden und somit von gemeinsam genutzten Code profitieren können (HostedService). Gemeinsam genutzter Code wird in Dynamic-Link Libraries (DLLs) zusammengefasst. Das macht Sinn, weil dadurch der verwendete Plattenplatz deutlich reduziert werden kann und bei Aktualisierungen nur der Code in den DLLs gepatcht werden muss und nicht jede ausführbare Anwendung, welche identische Codeteile enthält. DLLs werden demnach für Programmcode Konsolidierung verwendet. Manche Programmierer lagern häufig sogar den kompletten Programmcode in DLLs aus. SVCHOST ist ein generischer Hostprozessname für Dienste bzw. Dienstgruppen, die aus DLLs heraus ausgeführt werden.

Details:

StandAloneService: Windows Dienste werden in der Registry unter HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services organisiert, der Wert ImagePath beschreibt den Pfad, welcher zum Starten des Dienstes ausgeführt wird. Im Falle eines StandAloneService wird dort der Pfad zur ausführbaren Datei definiert. zB läuft mein unter Windows verwendeter Virenscanner Avast als StandAloneService, der ImagePath im dazugehörigem Registryschlüssel dazu lautet: "C:\Programme\Alwil Software\Avast4\ashServ.exe".

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\[ServiceName]

Key: [ServiceName]
Value: REG_EXPAND_SZ: ImagePath
Data: [Pfad zur ausführbaren Datei](zB: "C:\Programme\Alwil Software\Avast4\ashServ.exe")

Das ganze kann man in den Eigenschaften des Dienstes im Services SnapIn (Start → Ausführen → services.msc) ebenfalls überprüfen. Dort wird der Dienst unter dem Namen aufgeführt, welcher in der Dienstkonfiguration in der Registry im Wert DisplayName festgelegt ist:

HostedService (DLLbased): Etwas komplizierter wird die Sache nun, wenn ein Dienst über den SVCHOST gestartet wird. zB der Windows NTP Client w32time-Dienst, der für die Synchronisierung der Systemuhr verantwortlich ist, liegt als DLL in %SYSTEMROOT%\system32\w32time.dll vor. Der Aufruf (ImagePath) in der Registry zeigt allerdings nicht auf die DLL sondern auf die Service Gruppe in der der Dienst organisiert ist. Im Beispiel von w32time ist das die Gruppe (ImagePath=) netsvcs:

Die Syntax für den Aufruf einer Dienstgruppe lautet: %SYSTEMROOT%\system32\svchost.exe -k group. Der Wert group definiert welche Dienste als Service-DLLs in einer SVCHOST Instanz ausgeführt werden. Die Liste der Dienste die in der angegebenen Gruppe ausgeführt werden, wird ebenfalls in der Registry definiert:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Svchost

Value: REG_MULTI_SZ: groupname

Wird ein DLL-basierter Dienst bzw. die Dienst Gruppe gestartet, lädt der SVCHOST die dazugehörige DLL, welche in der Registry im Subkey Parameters im Wert ServiceDll definiert wird.

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\[service_name]\Parameters

Value: REG_EXPAND_SZ: ServiceDLL
Data: Pfad zur [ServiceDLL](zB: "%SYSTEMROOT%\system32\w32time.dll")

Fazit: Der Prozess svchost.exe ist ein generischer Windows Prozess, der Windows Dienste aus DLLs heraus startet und ggf in Gruppen zusammengefasst ausführt!

svchost.exe 100% CPU Last

In vielen Foren kommt es nun immer wieder zu der Frage was eine CPU Auslastung eines svchost Prozess von 100% bedeutet. Die kurze Antwort darauf lautet, dass vermutlich in den meisten Fällen ein SVCHOST gestarteter Dienst abgestürzt ist. Aber welcher? Das kann uU dann schon zu einer ausgedehnten Detektivarbeit führen. IdR sollte ein Neustart des Systems die Sache wieder gerade biegen aber man kann sich der Sache auch detaillierter nähern. Dazu ist es erst mal erforderlich die PID (ProzessID) der SVCHOST Instanz zu kennen. Dazu blenden Sie im Task Manager die Spalte PID ein (Menü: Ansicht → Spalten auswählen → Checkbox: PID aktivieren). Sie sehen jetzt die PID des Prozesses, welcher die hohe CPU Auslastung verursacht. In einem Terminal können Sie nun den Befehl tasklist /svc /fi "imagename eq svchost.exe" ausführen und in der Liste die HostedServices identifizieren, welche zu dieser PID gehören.

C:\> tasklist /svc /fi "imagename eq svchost.exe"

Abbildname                  PID Dienste                                      
========================= ===== =============================================
svchost.exe                 884 DcomLaunch, TermService                      
svchost.exe                 952 RpcSs                                        
svchost.exe                1048 AudioSrv, BITS, Browser, CryptSvc, Dhcp,     
                                dmserver, ERSvc, EventSystem, helpsvc,       
                                lanmanserver, lanmanworkstation, Netman,     
                                Nla, RasMan, Schedule, seclogon, SENS,       
                                SharedAccess, ShellHWDetection, srservice,   
                                TapiSrv, Themes, TrkWks, W32Time, winmgmt,   
                                wscsvc, wuauserv, WZCSVC                     
svchost.exe                1144 Dnscache                                     
svchost.exe                1216 LmHosts, RemoteRegistry, SSDPSRV             
svchost.exe                 428 WebClient                                    
svchost.exe                1128 stisvc       

Ist die gesuchte PID nicht mit so vielen Diensten gesegnet wie hier zB die PID 1048 kann recht schnell der verantwortliche Dienst ausfindig gemacht werden. Sie können in einem Terminal den Dienst dann ggf neu starten. Die Syntax dazu lautet: net stop [Dienstname] && net start [Dienstname]:

C:\> net stop w32time && net start w32time
Windows-Zeitgeber wird beendet.
Windows-Zeitgeber wurde erfolgreich beendet.

Windows-Zeitgeber wird gestartet.
Windows-Zeitgeber wurde erfolgreich gestartet.

Im Falle einer großen Gruppe ist es ggf schneller und sicherer das gesamte System neu zu starten, da auch von diesem Dienst abhängige Dienste neu gestartet werden bzw. Ihnen die Möglichkeit gegeben wird dies auch abzulehnen. Bei dauerhaft hoher CPU Last, also auch nach einem evtl. Neustart, wird das ganze allerdings zu der oben bereits erwähnten Detektivarbeit. Das kann zB durch einen DLL Konflikt entstehen, was möglicherweise durch die Installation einer Software oder eines Updates verursacht werden kann, auch Viren etc. werden hier gerne als Ursache genannt. IdR hilft dann nur eine umfangreiche Analyse um das Problem weiter eingrenzen zu können.

pronto 2010/03/21 19:54
~~DISCUSSION~~

win/svchost.txt (7630 views) · Zuletzt geändert: 2012/12/15 16:10 von wikisysop
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0