Service Control Manager - Service Control Manager

Tjenestekontrollbehandling ( SCM ) er et spesielt system prosess under Windows NT familien av operativsystemer , som starter, stopper og samhandler med Windows-oppdateringsprosesser. Den ligger i den %SystemRoot%\System32\services.exe kjørbare filen. Serviceprosesser samhandler med SCM gjennom et veldefinert API , og samme API brukes internt av de interaktive Windows-tjenesteadministrasjonsverktøyene, for eksempel MMC- snapin-modulen Services.msc og kommandolinjens Service Control-verktøy sc.exe . Å avslutte denne filen brukes som en metode for å forårsake Blue Screen of Death .

Gjennomføring

SCM- kjøreren,,Services.exe kjører som et Windows-konsollprogram og lanseres av Wininit- prosessen tidlig under oppstart av systemet . Hovedfunksjonen, SvcCtrlMain() lanserer alle tjenestene som er konfigurert for automatisk oppstart. Først initialiseres en intern database med installerte tjenester ved å lese følgende to registernøkler:

  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder\List , som inneholder navnene og rekkefølgen på tjenestegruppene. Hver tjenestes registernøkkel inneholder en valgfri Group verdi som styrer rekkefølgen på initialiseringen av en respektive tjeneste eller en enhetsdriver , i forhold til andre tjenestegrupper.
  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services , som inneholder den faktiske databasen med tjenester og enhetsdrivere og blir lest inn i SCMs interne database. SCM leser hver tjenestes Group verdi så vel som belastningsordensavhengigheter fra deres DependOnGroup og DependOnService registernøkler.

I neste trinn SvcCtrlMain() kaller SCMs hovedfunksjon ScGetBootAndSystemDriverState() funksjonsfunksjonen som sjekker om enhetsdriverne som skal startes under oppstart eller systemoppstart, ble lastet, og de som ikke har gjort det, lagres i en liste som heter ScFailedDrivers . Deretter opprettes et navngitt rør \Pipe\Ntsvcs som et eksternt prosedyreanropsgrensesnitt mellom SCM og SCP (Service Control Processes) som samhandler med spesifikke tjenester.

Deretter kaller den ScAutoStartServices() funksjonen som går gjennom alle tjenestene som er merket som automatisk start, og tar hensyn til de beregnede avhengighetene for belastningsordren. I tilfelle sirkulær avhengighet blir en feil notert, og tjenesten avhenger av en tjeneste som tilhører en gruppe som kommer senere i lastordren. For forsinkede automatisk starttjenester har gruppering ingen effekt, og de lastes inn senere i systemstart.

For hver tjeneste den ønsker å starte, kaller SCM ScStartService() funksjonen som kontrollerer navnet på filen som kjører tjenestens prosess, og sørger for at kontoen som er spesifisert for tjenesten, er den samme som kontoen som tjenesteprosessen kjører i. Hver tjeneste som gjør ikke kjøres på System kontoen er logget inn ved å ringe LSASS- funksjonen LogonUserEx() , for hvilken LSASS-prosessen slår opp "hemmelige" passord lagret i HKLM\SECURITY\Policy\Secrets\ registernøkkelen, som ble lagret av SCP ved hjelp av LsaStorePrivateData() API, da tjenesten opprinnelig ble konfigurert.

Deretter ScLogonAndStartImage() kalles funksjonen for hver tjeneste hvis serviceprosess ikke allerede er lansert. Serviceprosesser opprettes i suspendert tilstand via CreateProcessAsUser() API. Før kjøringen av tjenesteprosessen gjenopptas, \Pipe\Net\NtControlPipeX opprettes et navngitt rør (hvor X er et tall inkrementert for hver tjeneste iterasjon) som fungerer som en kommunikasjonskanal mellom SCM og tjenesteprosessen. Serviceprosessen kobles til røret ved å ringe til StartServiceCtrlDispatcher() funksjonen, hvoretter SCM sender tjenesten en "start" -kommando.

Forsinkede tjenester for automatisk start

Forsinkede automatisk starttjenester er lagt til i Windows Vista , for å løse problemet med en langvarig oppstart av systemet, samt for å øke hastigheten på starten av kritiske tjenester som ikke kan bli forsinket. Opprinnelig var den automatiske startmetoden for tjenesteinitialisering designet for viktige systemtjenester som andre applikasjoner og tjenester er avhengige av. SCM initialiserer de forsinkede tjenestene først etter å ha håndtert alle ikke-forsinkede automatisk starttjenester, ved å påkalle ScInitDelayStart() funksjonen. Denne funksjonen køer et forsinket (120 sekunder som standard) arbeidselement tilknyttet en tilsvarende arbeidertråd. Annet enn å være initialisert etter en forsinkelse, er det ingen andre forskjeller mellom forsinkede og ikke-forsinkede tjenester.

Enhetsdrivere

Tjenester hvis Type registerverdi er SERVICE_KERNEL_DRIVER eller SERVICE_FILE_SYSTEM_DRIVER blir håndtert spesielt: disse representerer enhetsdrivere som ScStartService() kaller ScLoadDeviceDriver() funksjonen som laster inn riktig driver (vanligvis en fil med filtypenavn .sys ) som må være plassert i %SystemRoot%\System32\Drivers\ katalogen. For det formål påkalles NtLoadDriver systemanropet , og SeLoadDriverPrivilege legges til SCMs prosess.

Nettverksstasjonsbokstaver

SCM gir en tilleggsfunksjonalitet helt uten tilknytning til Windows-tjenester: den gir beskjed om GUI- applikasjoner som Windows Utforsker når en nettverksstasjonsbokstavforbindelse er opprettet eller slettet, ved å kringkaste Windows- meldinger WM_DEVICECHANGE .

Se også

Merknader

Referanser