Menedżer kontroli usług - Service Control Manager
Menedżer sterowania usługami ( SCM ) to specjalny system proces pod Windows NT rodziny systemów operacyjnych , który rozpoczyna się, zatrzymuje się i współdziała z usługi Windows procesów. Znajduje się w %SystemRoot%\System32\services.exe pliku wykonywalnym. Procesy usługowe współdziałają z SCM za pośrednictwem dobrze zdefiniowanego interfejsu API , a ten sam interfejs API jest używany wewnętrznie przez interaktywne narzędzia do zarządzania usługami systemu Windows, takie jak przystawka MMC Services.msc i narzędzie kontroli usług wiersza polecenia sc.exe . Zakończenie tego pliku jest używane jako metoda wywołania niebieskiego ekranu śmierci .
Realizacja
Plik wykonywalny SCM Services.exe działa jako program konsoli systemu Windows i jest uruchamiany przez proces Wininit na wczesnym etapie uruchamiania systemu . Jego główna funkcja SvcCtrlMain() uruchamia wszystkie usługi skonfigurowane do automatycznego uruchamiania. Najpierw inicjuje się wewnętrzną bazę danych zainstalowanych usług, odczytując następujące dwa klucze rejestru:
-
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder\Listzawierający nazwy i kolejność grup usług. Klucz rejestru każdej usługi zawiera opcjonalnąGroupwartość, która reguluje kolejność inicjowania odpowiedniej usługi lub sterownika urządzenia w odniesieniu do innych grup usług. -
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services, który zawiera aktualną bazę danych usług i sterowników urządzeń i jest wczytywany do wewnętrznej bazy danych programu SCM. SCM odczytujeGroupwartość każdej usługi, a także zależności kolejności ładowania z ich kluczy rejestruDependOnGroupiDependOnServicekluczy rejestru.
W następnym kroku główna funkcja SCM SvcCtrlMain() wywołuje ScGetBootAndSystemDriverState() funkcję, która sprawdza, czy sterowniki urządzeń, które powinny zostać uruchomione podczas rozruchu lub uruchamiania systemu, zostały pomyślnie załadowane, a te, które się nie powiodły, są przechowywane na liście o nazwie ScFailedDrivers . Następnie nazwany potok \Pipe\Ntsvcs jest tworzony jako interfejs zdalnego wywołania procedury między SCM a punktami SCP (procesami sterowania usługami), które współdziałają z określonymi usługami.
Następnie wywołuje ScAutoStartServices() funkcję, która wykonuje pętlę przez wszystkie usługi oznaczone jako autostart, zwracając uwagę na obliczone zależności kolejności ładowania. W przypadku zależności cyklicznej odnotowywany jest błąd i usługa zależna od usługi należącej do grupy pojawiającej się później w kolejności ładowania jest pomijana. W przypadku usług z opóźnionym automatycznym uruchamianiem grupowanie nie działa i są one ładowane na późniejszym etapie uruchamiania systemu.
Dla każdej usługi, którą chce uruchomić, SCM wywołuje ScStartService() funkcję, która sprawdza nazwę pliku, który uruchamia proces usługi, zapewniając, że konto określone dla usługi jest takie samo jak konto, na którym działa proces usługi. Każda usługa, która to robi nie uruchamiany na System koncie jest zalogowany poprzez wywołanie funkcji LSASS LogonUserEx() , dla której proces LSASS wyszukuje „tajne” hasła zapisane w HKLM\SECURITY\Policy\Secrets\ kluczu rejestru, które były przechowywane przez SCP za pomocą LsaStorePrivateData() API, gdy usługa była pierwotnie konfigurowana.
Następnie ScLogonAndStartImage() funkcja jest wywoływana dla każdej usługi, której proces obsługi nie został jeszcze uruchomiony. Procesy usługowe są tworzone w stanie zawieszonym za pośrednictwem CreateProcessAsUser() interfejsu API. Przed wznowieniem wykonywania procesu usługi \Pipe\Net\NtControlPipeX tworzony jest nazwany potok (gdzie X jest liczbą zwiększaną dla każdej iteracji usługi), który służy jako kanał komunikacyjny między SCM a procesem usługowym. Proces usługi łączy się z potokiem poprzez wywołanie StartServiceCtrlDispatcher() funkcji, po czym SCM wysyła do usługi polecenie „start”.
Opóźnione usługi autostartu
W systemie Windows Vista dodano usługi opóźnionego autostartu, aby rozwiązać problem przedłużającego się uruchamiania systemu, a także przyspieszyć uruchamianie krytycznych usług, których nie można opóźnić. Pierwotnie metoda inicjalizacji usług z autostartem została zaprojektowana dla podstawowych usług systemowych, od których zależą inne aplikacje i usługi. SCM inicjuje usługi opóźnione dopiero po obsłużeniu wszystkich usług automatycznego startu bez opóźnienia, wywołując ScInitDelayStart() funkcję. Ta funkcja kolejkuje opóźniony (domyślnie 120 sekund) element pracy skojarzony z odpowiednim wątkiem roboczym. Poza inicjalizacją po opóźnieniu nie ma innych różnic między usługami opóźnionymi i nieopóźnionymi.
Sterowniki urządzeń
Usługi, których Type wartość rejestru jest SERVICE_KERNEL_DRIVER lub SERVICE_FILE_SYSTEM_DRIVER są specjalnie obsługiwane: reprezentują sterowniki urządzeń, dla których ScStartService() wywołuje ScLoadDeviceDriver() funkcję ładującą odpowiedni sterownik (zwykle plik z rozszerzeniem .sys ), który musi znajdować się w %SystemRoot%\System32\Drivers\ katalogu. W tym celu NtLoadDriver wywoływane jest wywołanie systemowe i SeLoadDriverPrivilege dodawane do procesu SCM.
Litery dysków sieciowych
SCM zapewnia dodatkową funkcjonalność zupełnie niezwiązaną z usługami Windows: powiadamia aplikacje GUI , takie jak Eksplorator Windows , o utworzeniu lub usunięciu połączenia sieciowego z literą dysku, poprzez rozgłaszanie komunikatów systemu Windows WM_DEVICECHANGE .
Zobacz też
Uwagi
Bibliografia
- Russinovich Mark ; Salomon, Dawid; Ionescu, Alex (2009), Windows® Internals (wyd. 5), Microsoft Press , ISBN 0-7356-2530-1