Менеджер по контролю услуг

Компонент операционных систем Microsoft Windows

Service Control Manager ( SCM ) — это специальный системный процесс в семействе операционных систем Windows NT , который запускает, останавливает и взаимодействует с процессами служб Windows . [1] Он находится в исполняемом файле. Процессы служб взаимодействуют с SCM через четко определенный API , и тот же API используется внутри интерактивными инструментами управления службами Windows, такими как оснастка MMC и служебная программа командной строки Service Control . Завершение этого файла используется как метод вызова синего экрана смерти .%SystemRoot%\System32\services.exeServices.mscsc.exe

Выполнение

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

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

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

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

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

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

Отложенный автозапуск служб

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

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

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

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

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

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

Примечания

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

Ссылки

Получено с "https://en.wikipedia.org/w/index.php?title=Service_Control_Manager&oldid=1238713644"