Менеджер по контролю услуг
Диспетчер управления службами ( SCM ) — это специальный системный процесс в Windows NT семействе операционных систем , который запускает, останавливает и взаимодействует со служебными процессами Windows. [1] Он расположен в %SystemRoot%\System32\services.exe
исполняемый файл. Процессы обслуживания взаимодействуют с SCM через четко определенный API , и тот же API используется внутри интерактивных инструментов управления службами Windows, таких как MMC . оснастка 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()
вызывает функцию ScGetBootAndSystemDriverState()
функция, которая проверяет, были ли успешно загружены драйверы устройств, которые должны быть запущены во время загрузки или запуска системы, а те, которые не удалось это сделать, сохраняются в списке, называемом ScFailedDrivers
. Тогда именованный канал \Pipe\Ntsvcs
создается как интерфейс удаленного вызова процедур между SCM и SCP (процессами управления услугами), которые взаимодействуют с конкретными службами.
Далее он вызывает ScAutoStartServices()
функция, которая циклически перебирает все службы, отмеченные как автозапуск, обращая внимание на рассчитанные зависимости порядка загрузки. В случае циклической зависимости отмечается ошибка, и служба, зависящая от службы, принадлежащей группе, следующей в порядке загрузки, пропускается. Для служб отложенного автозапуска группировка не имеет никакого эффекта, и они загружаются на более позднем этапе запуска системы. [5]
Для каждой службы, которую он хочет запустить, SCM вызывает ScStartService()
функция, которая проверяет имя файла, в котором запускается процесс службы, гарантируя, что учетная запись, указанная для службы, совпадает с учетной записью, под которой запускается процесс службы. Каждая служба, которая не запускается в System
вход в учетную запись осуществляется путем вызова LSASS функции LogonUserEx()
, для которого процесс 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 Explorer , когда создается или удаляется буквенное соединение сетевого диска, путем широковещательной рассылки сообщений Windows. WM_DEVICECHANGE
.
См. также
[ редактировать ]Примечания
[ редактировать ]- ^ Руссинович, Соломон и Ионеску (2009 :79) [ нужна полная цитата ]
- ^ Руссинович, Соломон и Ионеску (2009 : 291)
- ^ «База установленных сервисов» . Сеть разработчиков Microsoft . Проверено 6 марта 2011 г.
- ^ Руссинович, Соломон и Ионеску (2009 : 292)
- ^ Руссинович, Соломон и Ионеску (2009 : 294)
- ^ Руссинович, Соломон и Ионеску (2009 : 295)
- ^ Руссинович, Соломон и Ионеску (2009 : 296)
- ^ Руссинович, Соломон и Ионеску (2009 : 297)
Ссылки
[ редактировать ]- Руссинович, Марк ; Соломон, Дэвид; Ионеску, Алекс (2009), Windows® Internals (5-е изд.), Microsoft Press , ISBN 978-0-7356-2530-3