Manager control servicii - Service Control Manager

Service Control Manager ( SCM ) este un proces de sistem special din familia de sisteme de operare Windows NT , care pornește, oprește și interacționează cu procesele de servicii Windows . Se află în executabil. Procesele de servicii interacționează cu SCM printr-un API bine definit , iar același API este utilizat intern de instrumentele interactive de gestionare a serviciilor Windows, cum ar fi snap-in- ul MMC și utilitarul de control al serviciului din linia de comandă . Închiderea acestui fișier este utilizată ca metodă de provocare a ecranului albastru al morții . %SystemRoot%\System32\services.exeServices.mscsc.exe

Implementare

Executabilul SCM Services.exe , rulează ca un program de consolă Windows și este lansat de procesul Wininit devreme în timpul pornirii sistemului . Funcția sa principală SvcCtrlMain() , lansează toate serviciile configurate pentru pornirea automată. În primul rând, o bază de date internă a serviciilor instalate este inițializată citind următoarele două chei de registry:

  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder\List , conținând numele și ordinea grupurilor de servicii. Fiecare cheie de registru a serviciului conține o Group valoare opțională care guvernează ordinea de inițializare a unui serviciu respectiv sau a unui driver de dispozitiv , în raport cu alte grupuri de servicii.
  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services , care conține baza de date reală a serviciilor și a driverelor de dispozitiv și este citită în baza de date internă a SCM. SCM citește Group valoarea fiecărui serviciu, precum și dependențele de comandă a încărcării din cheile lor DependOnGroup și ale DependOnService registrului.

În pasul următor, funcția principală a SCM SvcCtrlMain() apelează funcția de ScGetBootAndSystemDriverState() funcție care verifică dacă driverele de dispozitiv care ar trebui pornite în timpul boot-ului sau pornirea sistemului au fost încărcate cu succes, iar cele care nu au reușit acest lucru sunt stocate într-o listă numită ScFailedDrivers . Apoi, o conductă numită \Pipe\Ntsvcs este creată ca o interfață de apel de procedură la distanță între SCM și SCP (Service Control Processes) care interacționează cu servicii specifice.

În continuare, acesta apelează ScAutoStartServices() funcția pe care buclele prin toate serviciile marcate ca auto-start, acordând o atenție dependențele de sarcină de ordinul calculate. În cazul unei dependențe circulare se observă o eroare și serviciul în funcție de un serviciu care aparține unui grup care vine ulterior în ordinea de încărcare este omis. Pentru serviciile de pornire automată întârziate, gruparea nu are efect, iar acestea sunt încărcate într-o etapă ulterioară a pornirii sistemului.

Pentru fiecare serviciu pe care dorește să îl înceapă, SCM apelează ScStartService() funcția care verifică numele fișierului care rulează procesul serviciului, asigurându-se că contul specificat pentru serviciu este același cu contul în care rulează procesul de serviciu. Fiecare serviciu care face nu rulat în System cont este conectat apelând funcția LSASS LogonUserEx() , pentru care procesul LSASS caută parole „secrete” stocate în HKLM\SECURITY\Policy\Secrets\ cheia de registry, care au fost stocate de SCP folosind LsaStorePrivateData() API, când serviciul a fost configurat inițial.

Apoi, ScLogonAndStartImage() funcția este apelată pentru fiecare serviciu al cărui proces de service nu a fost deja lansat. Procesele de servicii sunt create într-o stare suspendată prin CreateProcessAsUser() API. Înainte de reluarea execuției procesului de serviciu, \Pipe\Net\NtControlPipeX se creează o conductă numită (unde X este un număr incrementat pentru fiecare iterație de serviciu) care servește ca canal de comunicație între SCM și procesul de serviciu. Procesul de service se conectează la conductă apelând StartServiceCtrlDispatcher() funcția, după care SCM trimite serviciului o comandă „start”.

Servicii de pornire automată întârziate

Serviciile de pornire automată întârziate au fost adăugate în Windows Vista , pentru a rezolva problema unei porniri prelungite a sistemului, precum și pentru a accelera pornirea serviciilor critice care nu pot fi întârziate. Inițial, metoda de pornire automată a inițializării serviciului a fost concepută pentru servicii esențiale de sistem de care depind alte aplicații și servicii. SCM inițializează serviciile întârziate numai după gestionarea tuturor serviciilor de pornire automată fără întârziere, prin invocarea ScInitDelayStart() funcției. Această funcție pune în coadă un articol de lucru întârziat (120 de secunde în mod implicit) asociat cu un fir de lucru corespunzător. În afară de a fi inițializat după o întârziere, nu există alte diferențe între serviciile întârziate și non-întârziate.

Drivere de dispozitiv

Servicii a căror Type valoare de registru este SERVICE_KERNEL_DRIVER sau SERVICE_FILE_SYSTEM_DRIVER sunt tratate special: acestea reprezintă drivere de dispozitiv pentru care ScStartService() apelează ScLoadDeviceDriver() funcția care încarcă driverul corespunzător (de obicei un fișier cu o extensie .sys ) care trebuie localizat în %SystemRoot%\System32\Drivers\ director. În acest scop, NtLoadDriver apelul de sistem este invocat și acesta SeLoadDriverPrivilege este adăugat la procesul SCM.

Litere de unitate de rețea

SCM oferă o funcționalitate suplimentară complet lipsită de legătură cu serviciile Windows: notifică aplicațiile GUI , cum ar fi Windows Explorer, atunci când a fost creată sau ștearsă o conexiune de rețea cu litere de unitate, prin difuzarea mesajelor Windows WM_DEVICECHANGE .

Vezi si

Note

Referințe