- •Введение
- •1. Службы Windows.
- •1.1. Программа – служба
- •1.2. Три компонента сервиса
- •1.3. Диспетчер управления сервисами (scm)
- •1.4. Программы управления сервисами
- •1.5. Учетные зависи сервиса
- •1.6. Начало работы сервиса
- •1.7. Выполнение сервиса
- •2. Разработка сервиса Win32.
- •2.1. Структура программы сервиса
- •2.2. Протокол взаимодействия scm и сервиса
- •2.3. Пример функций сервиса.
- •Программа, осуществляющая установку сервиса.
- •Отладка сервиса.
- •Литература
- •Оглавление
1.2. Три компонента сервиса
Для работы сервисов предназначены три вида компонентов ОС Windows:
Диспетчер управления сервисами ( Service Control Manager – SCM ), исполняемым файлом которого является - \Windows\System32\Services.exe, выполняется как консольная программа. Процесс запускается автоматически в момент начальной загрузки системы и прекращает работу в момент выгрузки системы.Очевидно, что SCM-процесс запускается с привилегиями системы и предоставляет унифицированный и безопасный интерфейс сервисам системы. Задача SCM управлять сервисами: запускать, настраивать, приостанавливать, продолжать и завершать их работу.
Сам «сервис», по сути являясь Win32-приложением, содержит дополнительный код, позволяющий ему принимать информацию и команды от SCM и возвращать ему статусную информацию.
Программа управления сервисом ( Service Control Program – SCP ). Это Win32-приложение ( далее SCP-приложение), которое предоставляет пользователю графический интерфейс для работы с сервисами. Такая программа позволяет пользователю управлять работой сервиса: запускать, приостанавливать, возобновлять и останавливать его работу. Поскольку SCM является RPC-сервером, то SCP-приложение может взаимодействовать с ним удаленно. Администратор, используя SCP-приложение на одном компьютере может посредством SCM другого компьютера управлять работой на нем сервисов. Для этого SCP-приложение использует специальные функции управления сервисом, позволяющие обращаться к SCM.
1.3. Диспетчер управления сервисами (scm)
Как уже отмечалось, сервисы или службы, рассматриваемые в данном учебном пособии, - это процессы режима пользователя. Они похожи на процессы-демоны Unix и могут быть запущены автоматически при запуске системы. Этими сервисами управляет специальный системный процесс, называемый Диспетчер управления сервисами (Service Control Manager – CSM ) - \Windows\System32\Services.exe, отвечающий за запуск, остановку и взаимодействие с процессами сервисов. Другими словами, диспетчер управления сервисами исполняется в процесссе services.exe и является консольным Win32-приложением. Место в архатектуре Windows диспетчера управления сервисами показано на (рис.1).
Для взаимодействия SCM с сервисами Windows предоставляет специальные API-функции, с помощью которых выполняются такие действия как регистрация успешного запуска сервиса, ответы на запросы о состоянии, приостановка или завершение работы сервиса.
Процесс Winlogon запускает SCM на начальном этапе загрузки системы вызовом функции SvcCtrlMain. Функция SvcCtrlMain создает синхронизирующее событие с именем SvcCtrlEvent_A3752DX и устанавливает ему состояние – занято. Затем функция
Рис.1. Архитектура Windows
SvcCtrlMain вызывает функцию SvcCreateServiceDB, которая создает базу данных сервисов SCM. Функция SvcCreateServiceDB считывает и сохраняет разделе реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder в параметре List типа REG_MULTI_SZ список имен и порядок определенных групп сервисов. Если сервису или драйверу нужно отслеживать порядок запуска относительно других групп, то в раздел реестра этого сервиса включается параметр Group.
В разделе реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\
Control\Ser-vices находится база данных диспетчера управления сервисами (SCM) (Рис.2). Для каждого установленного драйвера и сервиса создается запись, содержащая следующую информацию:
Тип сервиса. Необходим для того, чтобы различать сервисы уровня пользователя и драйверы. Для сервисов уровня пользователя тип указывает, выполняется ли сервис в собственном процессе или разделяет адресное пространство процесса с другими сервисами. Для драйвара указывается, является ли он драйвером ядра или драйвером файловой системы.
Способ запуска (автоматически при старте системы, по запросу приложения, управляющего сервисом либо запрет запуска). В системе может быть установлено три значения для этого поля: Авто ( automatic ), Вручную ( manual ), Отключено ( disabled ).
Уровнь контроля ошибок. Указывает серьезность ошибки, если служба или драйвер не запускается при запуске системы, и определяет действия в случае аварийного завершения сервиса или ошибки при запуске (отсутствие действий, перезапуск сервиса или перезапуск системы).
Полный путь к исполняемому файлу (т.е. путь к программе сервиса - файлу с расширением. EXE или драйверу – с расширением. SYS ).
Информация о зависимостях, т.е. о том, какие сервисы должны быть запущены до запуска данного. Для драйвера, эта информация включает в себя список драйверов, которые должны быть запущены до указанного драйвера.
Имя учетной записи и пароль. Сервисная программа выполняется в контексте этой учетной записи. Если учетная запись не указана, то сервис выполняется в контексте учетной записи LocalSystem.
Для драйверов, дополнительно указывается имя объекта драйвера (например, \ FileSystem \ Rdr или \ Driver \ XNS), используемая система ввода / вывода для загрузки драйвера устройства. Если имя не задано, то система ввода / вывода создает имя по умолчанию на основе службы имен драйверов.
С помощью SCP-апплета можно установить или изменить тип запуска. Кроме этого можно посмотреть под чьей учетной записью запускается сервис на вкладке «Вход в систему» ( Log On ).
Рис.2. Редактор реестра. Просмотр ключа
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
Базу данных сервисов не рекомендуется изменять самостоятельно (при помощи функций работы с реестром). Вместо этого, следует обращаться к API-функциям, предоставляемым диспетчером управления сервисами (SCM).
Перед запуском автоматически запускаемых сервисов ( здесь как сервисы, так и драйверы ) SCM выполняет еще несколько действий. Создает именованный канал RPC с именем \Pipe\Ntsvcs. После чего RPC запускает поток, отслеживающий приходящие по этому каналу сообщения от SCP. Затем SCM освобождает свой объект типа событие SvcCtrlEvent_A3752DX, сигнализируя о завершении инициализации. SCP устанавливает связь с SCM с помощью функции OpenSCManager, которая ждет перехода события SvcCtrlEvent_A3752DX в свободное состояние.
