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