Менеджер по управлению услугами - Service Control Manager

Менеджер по управлению услугами (СКМ) - особая система процесс под Windows NT семья операционные системы, который запускается, останавливается и взаимодействует с Служба Windows процессы.[1] Он расположен в % SystemRoot% System32 services.exe исполняемый файл. Сервисные процессы взаимодействуют с SCM через четко определенный API, и тот же API используется внутри интерактивных инструментов управления службами Windows, таких как MMC оснастка Services.msc и служебная программа командной строки Service Control sc.exe. Прерывание этого файла используется как способ вызвать Синий экран смерти.

Выполнение

Исполняемый файл SCM, Services.exe, запускается как консольная программа Windows и запускается Wininit процесс рано во время запуск системы.[2] Его основная функция, SvcCtrlMain (), запускает все службы, настроенные для автоматического запуска. Сначала инициализируется внутренняя база данных установленных служб путем чтения следующих двух разделов реестра:

  • HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Control ServiceGroupOrder List, содержащий названия и порядок групп обслуживания. Раздел реестра каждой службы содержит необязательный Группа значение, которое определяет порядок инициализации соответствующей службы или драйвер устройства по отношению к другим сервисным группам.
  • HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Services, который содержит фактическую базу данных служб и драйверов устройств и считывается во внутреннюю базу данных SCM.[3] СКМ читает все сервисы Группа значение, а также зависимости порядка загрузки от их DependOnGroup и DependOnService ключи реестра.[4]

На следующем этапе основная функция SCM SvcCtrlMain () вызывает функцию ScGetBootAndSystemDriverState () функция, которая проверяет, были ли успешно загружены драйверы устройств, которые должны быть запущены во время загрузки или запуска системы, и те, которые не смогли этого сделать, сохраняются в списке, называемом ScFailedDrivers. Затем именованный канал Труба Ntsvcs создается как удаленный вызов процедур интерфейс между SCM и SCP (процессами управления службами), которые взаимодействуют с конкретными службами.

Затем он вызывает ScAutoStartServices () функция, которая петли через все сервисы, помеченные как автозапуск, обращая внимание на рассчитанные зависимости порядка загрузки. В случае циклической зависимости отмечается ошибка, и служба, зависящая от службы, которая принадлежит к группе, приходящей позже в порядке загрузки, пропускается. Для служб с отложенным автозапуском группировка не действует, и они загружаются на более позднем этапе запуска системы.[5]

Для каждой службы, которую он хочет запустить, SCM вызывает ScStartService () функция, которая проверяет имя файла, в котором запускается процесс службы, гарантируя, что учетная запись, указанная для службы, такая же, как и учетная запись, в которой выполняется процесс службы. Каждая служба, которая не запускается в Система учетная запись входит в систему, позвонив LSASS функция LogonUserEx (), для которого процесс LSASS ищет "секретные" пароли, хранящиеся в HKLM SECURITY Policy Secrets ключ реестра, который хранился SCP с использованием LsaStorePrivateData () API, когда служба была изначально настроена.[6]

Далее ScLogonAndStartImage () функция вызывается для каждой службы, процесс обслуживания которой еще не запущен. Сервисные процессы создаются в приостановленное состояние через CreateProcessAsUser () API. Перед возобновлением выполнения служебного процесса именованный канал Pipe Net NtControlPipeX (где X - это число, увеличивающееся для каждой итерации обслуживания), который служит каналом связи между SCM и процессом обслуживания. Сервисный процесс подключается к каналу, вызывая StartServiceCtrlDispatcher () функция, после чего SCM отправляет сервису команду «запустить».[7]

Услуги с отложенным автозапуском

Добавлены сервисы отложенного автозапуска в Виндоус виста, чтобы решить проблему длительного запуска системы, а также ускорить запуск критически важных сервисов, который нельзя отложить.[8] Первоначально метод инициализации службы с автоматическим запуском был разработан для основных системных служб, от которых зависят другие приложения и службы. SCM инициализирует отложенные службы только после обработки всех неотложных служб автозапуска, вызывая ScInitDelayStart () функция. Эта функция ставит в очередь отложенный (по умолчанию 120 секунд) рабочий элемент, связанный с соответствующим рабочим потоком. Помимо инициализации после задержки, нет других различий между отложенными и неотложными услугами.

Драйверы устройств

Услуги, чьи Тип значение реестра SERVICE_KERNEL_DRIVER или же SERVICE_FILE_SYSTEM_DRIVER обрабатываются специально: они представляют драйверы устройств, для которых ScStartService () называет ScLoadDeviceDriver () функция, которая загружает соответствующий драйвер (обычно файл с расширением .sys), который должен находиться в % SystemRoot% System32 Drivers каталог. С этой целью NtLoadDriver системный вызов вызывается, и SeLoadDriverPrivilege добавляется в процесс SCM.

Буквы сетевых дисков

SCM предоставляет дополнительную функциональность, совершенно не связанную со службами Windows: она уведомляет GUI такие приложения, как проводник Виндоус при создании или удалении сетевого соединения с буквой диска путем широковещательной передачи Windows Сообщения WM_DEVICECHANGE.

Смотрите также

Примечания

  1. ^ Руссинович, Соломон и Ионеску (2009 г.:79)[требуется полная цитата ]
  2. ^ Руссинович, Соломон и Ионеску (2009 г.:291)
  3. ^ «База данных установленных сервисов». Сеть разработчиков Microsoft. Получено 2011-03-06.
  4. ^ Руссинович, Соломон и Ионеску (2009 г.:292)
  5. ^ Руссинович, Соломон и Ионеску (2009 г.:294)
  6. ^ Руссинович, Соломон и Ионеску (2009 г.:295)
  7. ^ Руссинович, Соломон и Ионеску (2009 г.:296)
  8. ^ Руссинович, Соломон и Ионеску (2009 г.:297)

Рекомендации