Service Control Manager - Service Control Manager
Service Control Manager ( SCM ) är ett särskilt system process under Windows NT familj av operativsystem , som startar, stannar och interagerar med Windows-tjänst processer. Den finns i den %SystemRoot%\System32\services.exe körbara filen. Tjänsteprocesser interagerar med SCM via ett väldefinierat API , och samma API används internt av de interaktiva Windows-tjänstehanteringsverktygen, till exempel MMC- snapin-modulen Services.msc och kommandoraden Service Control-verktyget sc.exe . Att avsluta den här filen används som en metod för att orsaka Blue Screen of Death .
Genomförande
SCM- körningen,,Services.exe körs som ett Windows-konsolprogram och lanseras av Wininit- processen tidigt under systemstart . Dess huvudfunktion SvcCtrlMain() ,, startar alla tjänster som är konfigurerade för automatisk start. Först initieras en intern databas med installerade tjänster genom att läsa följande två registernycklar:
-
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder\List, som innehåller servicegruppernas namn och ordning. Varje tjänsts registernyckel innehåller ett valfrittGroupvärde som reglerar ordningen för initialisering av respektive tjänst eller en enhetsdrivrutin , i förhållande till andra servicegrupper. -
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services, som innehåller den faktiska databasen med tjänster och enhetsdrivrutiner och läses in i SCMs interna databas. SCM läser varje tjänstsGroupvärde såväl som belastningsbeställningsberoenden från derasDependOnGroupochDependOnServiceregisternycklar.
I nästa steg anropar SCM: s SvcCtrlMain() huvudfunktion ScGetBootAndSystemDriverState() funktionsfunktionen som kontrollerar om enhetsdrivrutinerna som ska startas under start eller systemstart har laddats framgångsrikt, och de som inte har gjort det lagras i en lista som heter ScFailedDrivers . Sedan skapas ett namngivet rör \Pipe\Ntsvcs som ett fjärrproceduranropsgränssnitt mellan SCM och SCP: er (Service Control Processes) som interagerar med specifika tjänster.
Därefter kallar det ScAutoStartServices() funktion som loopar igenom alla de tjänster som är markerade som auto-start, att uppmärksamma de beräknade lastorder beroenden. I händelse av ett cirkulärt beroende beräknas ett fel och tjänsten som beror på en tjänst som tillhör en grupp som kommer senare i lastordningen hoppas över. För försenade auto-starttjänster har gruppering ingen effekt, och de laddas i ett senare skede av systemstart.
För varje tjänst som den vill starta anropar SCM ScStartService() funktionen som kontrollerar namnet på filen som kör tjänstens process, vilket säkerställer att kontot som anges för tjänsten är detsamma som kontot som tjänsteprocessen körs i. Varje tjänst som gör inte körs i System kontot loggas in genom att anropa LSASS- funktionen LogonUserEx() , för vilken LSASS-processen letar upp "hemliga" lösenord som lagrats i HKLM\SECURITY\Policy\Secrets\ registernyckeln, som lagrades av SCP med LsaStorePrivateData() API: et, när tjänsten ursprungligen konfigurerades.
Därefter ScLogonAndStartImage() kallas funktionen för varje tjänst vars serviceprocess inte redan har startats. Tjänsteprocesser skapas i avstängt tillstånd via CreateProcessAsUser() API: t. Innan utförandet av tjänsteprocessen återupptas \Pipe\Net\NtControlPipeX skapas ett namngivet rör (där X är ett antal inkrementerat för varje tjänst iteration) som fungerar som en kommunikationskanal mellan SCM och serviceprocessen. Serviceprocessen ansluter till röret genom att anropa StartServiceCtrlDispatcher() funktionen, varefter SCM skickar tjänsten ett "start" -kommando.
Försenade tjänster för automatisk start
Försenade auto-starttjänster har lagts till i Windows Vista för att lösa problemet med en långvarig systemstart samt för att påskynda starten av kritiska tjänster som inte kan försenas. Ursprungligen designades den automatiska startmetoden för initialisering av tjänster för viktiga systemtjänster som andra applikationer och tjänster är beroende av. SCM initialiserar de fördröjda tjänsterna först efter hantering av alla icke-fördröjda auto-starttjänster genom att anropa ScInitDelayStart() funktionen. Den här funktionen köar ett försenat (120 sekunder som standard) arbetsobjekt associerat med en motsvarande arbetartråd. Förutom att initialiseras efter en fördröjning finns det inga andra skillnader mellan försenade och icke-försenade tjänster.
Enhetsdrivrutiner
Tjänster vars Type registervärde hanteras SERVICE_KERNEL_DRIVER eller SERVICE_FILE_SYSTEM_DRIVER hanteras speciellt: dessa representerar enhetsdrivrutiner för vilka ScStartService() anropar ScLoadDeviceDriver() funktionen som laddar lämplig drivrutin (vanligtvis en fil med ett tillägg .sys ) som måste finnas i %SystemRoot%\System32\Drivers\ katalogen. För detta ändamål åberopas NtLoadDriver systemanropet och SeLoadDriverPrivilege läggs till i SCM: s process.
Nätverksenhetsbokstäver
SCM tillhandahåller en extra funktionalitet som helt inte är relaterad till Windows-tjänster: den meddelar GUI- applikationer som Windows Explorer när en nätverksdrivbokstavsanslutning har skapats eller raderats genom att sända Windows- meddelanden WM_DEVICECHANGE .
Se även
Anteckningar
Referenser
- Russinovich, Mark ; Salomo, David; Ionescu, Alex (2009), Windows® Internals (5: e upplagan), Microsoft Press , ISBN 0-7356-2530-1