Správce řízení služeb - Service Control Manager
Správce řízení služeb (SCM) je speciální systém proces pod Windows NT rodina operační systémy, který začíná, zastavuje se a komunikuje s ním Služba Windows procesy.[1] Nachází se v % SystemRoot% System32 services.exe
spustitelný. Servisní procesy interagují se SCM prostřednictvím dobře definované API a stejné API interně používají interaktivní nástroje pro správu služeb Windows, jako je MMC modul snap-in Services.msc
a obslužný program Service Control na příkazovém řádku sc.exe
. Ukončení tohoto souboru se používá jako metoda způsobení Modrá obrazovka smrti.
Implementace
Spustitelný SCM, Services.exe
, běží jako konzolový program Windows a je spuštěn Wininit proces brzy v průběhu spuštění systému.[2] Jeho hlavní funkce, SvcCtrlMain ()
, spustí všechny služby nakonfigurované pro automatické spuštění. Nejprve se inicializuje interní databáze nainstalovaných služeb přečtením následujících dvou klíčů registru:
HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Control ServiceGroupOrder Seznam
obsahující názvy a pořadí skupin služeb. Klíč registru každé služby obsahuje volitelný doplněkSkupina
hodnota, která určuje pořadí inicializace příslušné služby nebo a ovladač zařízení, s ohledem na jiné skupiny služeb.HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Services
, který obsahuje aktuální databázi služeb a ovladačů zařízení a je načítán do interní databáze SCM.[3] SCM čte všechny službySkupina
hodnoty i závislosti na pořadí načítání z jejichDependOnGroup
aDependOnService
klíče registru.[4]
V dalším kroku hlavní funkce SCM SvcCtrlMain ()
volá funkci ScGetBootAndSystemDriverState ()
funkce, která kontroluje, zda byly úspěšně načteny ovladače zařízení, které by měly být spuštěny během bootování nebo spuštění systému, a ty, které tak neučinily, jsou uloženy v seznamu s názvem ScFailedDrivers
. Pak pojmenovaná roura Pipe Ntsvcs
je vytvořen jako vzdálené volání procedury rozhraní mezi SCM a SCP (procesy řízení služeb), které interagují s konkrétními službami.
Dále volá ScAutoStartServices ()
funkce, která smyčky prostřednictvím všech služeb označených jako automatické spuštění, přičemž věnujte pozornost vypočítaným závislostem pořadí načítání. V případě kruhové závislosti je zaznamenána chyba a služba v závislosti na službě, která patří do skupiny přicházející později v pořadí načítání, je přeskočena. U služeb se zpožděným automatickým spuštěním nemá seskupení žádný účinek a ty se načtou v pozdější fázi spuštění systému.[5]
Pro každou službu, kterou chce spustit, volá SCM ScStartService ()
funkce, která kontroluje název souboru, který spouští proces služby, a zajišťuje, že účet určený pro službu je stejný jako účet, ve kterém je spuštěn proces služby. Každá služba, která není spuštěna v Systém
účet je přihlášen voláním LSASS funkce LogonUserEx ()
, pro které proces LSASS vyhledává "tajná" hesla uložená v souboru HKLM SECURITY Policy Secrets
klíč registru, které byly uloženy SCP pomocí LsaStorePrivateData ()
API, když byla služba původně nakonfigurována.[6]
Dále ScLogonAndStartImage ()
funkce je volána pro každou službu, jejíž proces služby ještě nebyl spuštěn. Servisní procesy jsou vytvářeny v pozastavený stav přes CreateProcessAsUser ()
API. Před obnovením procesu služby je pojmenované potrubí Pipe Net NtControlPipeX
(kde X je číslo zvýšeno pro každou iteraci služby) je vytvořen, který slouží jako komunikační kanál mezi SCM a procesem služby. Servisní proces se připojí k potrubí voláním StartServiceCtrlDispatcher ()
funkce, po které SCM odešle službě příkaz „start“.[7]
Zpožděné služby automatického spuštění
Byly přidány služby zpožděného automatického spuštění Windows Vista, aby se vyřešil problém prodlouženého spouštění systému a aby se urychlil start kritických služeb, které nelze zpozdit.[8] Původně byla metoda automatického spuštění inicializace služby navržena pro základní systémové služby, na kterých závisí další aplikace a služby. SCM inicializuje zpožděné služby až po zpracování všech nezpožděných služeb automatického spuštění vyvoláním ScInitDelayStart ()
funkce. Tato funkce zařazuje do fronty zpožděnou (ve výchozím nastavení 120 sekund) pracovní položku přidruženou k odpovídajícímu pracovnímu vláknu. Kromě inicializace po zpoždění neexistují žádné jiné rozdíly mezi zpožděnými a nezpožděnými službami.
Ovladače zařízení
Služby, jejichž Typ
hodnota registru je SERVICE_KERNEL_DRIVER
nebo SERVICE_FILE_SYSTEM_DRIVER
jsou zpracovávány speciálně: představují ovladače zařízení, pro které ScStartService ()
volá ScLoadDeviceDriver ()
funkce, která načte příslušný ovladač (obvykle soubor s příponou .sys
), které musí být umístěny v % SystemRoot% System32 Drivers
adresář. Za tímto účelem NtLoadDriver
systémové volání je vyvolána a SeLoadDriverPrivilege
je přidán do procesu SCM.
Písmena síťové jednotky
SCM poskytuje další funkce zcela nesouvisející se službami Windows: upozorňuje GUI aplikace jako Průzkumník Windows když bylo vytvořeno nebo odstraněno připojení k síťové jednotce písmenem, vysíláním systému Windows zprávy WM_DEVICECHANGE
.
Viz také
Poznámky
- ^ Russinovich, Solomon & Ionescu (2009:79)[úplná citace nutná ]
- ^ Russinovich, Solomon & Ionescu (2009:291)
- ^ "Databáze nainstalovaných služeb". Microsoft Developer Network. Citováno 2011-03-06.
- ^ Russinovich, Solomon & Ionescu (2009:292)
- ^ Russinovich, Solomon & Ionescu (2009:294)
- ^ Russinovich, Solomon & Ionescu (2009:295)
- ^ Russinovich, Solomon & Ionescu (2009:296)
- ^ Russinovich, Solomon & Ionescu (2009:297)
Reference
- Russinovich, Mark; Solomon, David; Ionescu, Alex (2009), Vnitřní součásti Windows® (5. vydání), Microsoft Press, ISBN 0-7356-2530-1