Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры ОС1.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.61 Mб
Скачать

40. Службы

Службы – это специальные программы в ОС Windows, предназначенные для выполнения различных дополнительных функций ОС, например, удалённый вызов процедур, сетевая печать, терминальный доступ и т.д.

Работа служб обеспечивается взаимодействием компонентов трёх типов:

  1. Диспетчер управления службами Service Control Manager (SCM).

  2. Сама программа приложение-служба.

  3. Программа управления службой.

SCM при работе ОС представляется как процесс Services.exe. Он автоматически запускается при старте ОС.

lsass.exe – программа управления пользователями в системе.

SCM имеет привилегии системы и обеспечивает интерфейс взаимодействия программ управления службами и программ-служб.

Служба обычная программа дополненная вызовами специальных функций для реализации взаимодействия с SCM, по результатам работы этих функций, служба м.б. запущена, остановлена, приостановлена и повторно возобновлена. В одном исполняемом файле м.б. несколько служб. Служба может работать с разными правами как с системными, так и с пользовательскими.

Последовательность вызова функций для программы управления службами

OpenSCManager

CreateService

StartService

CloseServiceHandle (для служб)

CloseServiceHandle (для SCM)

Последовательность запуска функций для деинсталляции

OpenSCManager

OpenService

ControlService (останов)

QueryServiceStatus (проверка останова)

DeleteService

CloseServiceHandle (для служб)

CloseServiceHandle (для SCM)

Функция CreateService:

В случае успеха, функция вернёт дескриптор сервиса.

В случае ошибки, функция вернёт NULL. Для получения более подробной информации об ошибке, можно воспользоваться функцией GetLastError.

Полученный дескриптор будет доступным только для того процесса, который вызвал CreateService. Закрыть его можно при помощи функции CloseServiceHandle.

Функция CreateService создаёт объект сервиса и прописывает его в базе менеджера управления сервисами создав в реестре ключ с таким же именем что и имя сервиса в следующем ключе:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\<имя>

В этом ключе записываются значения, указанные в функциях CreateService.

Функция OpenService:

При успешном завершении функция возвращает handle системной службы. В случае ошибки возвращаемое значение равно NULL, и код ошибки, как обычно, может быть получен с помощью функции GetLastError.

Функция DeleteService:

Единственным параметром этой функции является handle удаляемой службы, который должен быть открыт с правом доступа DELETE.

Важно заметить, что DeleteService лишь помечает службу для удаления. Фактически служба будет удалена, когда будет закрыт последний указывающий на нее handle. Один открытый handle, очевидно, удерживает программа, вызывающая DeleteService. Другой handle удерживает SCM до тех пор, пока служба не будет остановлена. Таким образом, чтобы окончательно удалить службу, необходимо убедиться, что она остановлена.

Для запуска службы Win32 API предоставляет StartService:

Функция принимает handle службы, который должен быть открыт с правом доступа SERVICE_START, а также массив аргументов, который будет передан службе. Два последних параметра повторяют назначение параметров функции main().

Параметры командной строки будут переданы без изменений в основную функцию службы (ServiceMain), поскольку внутри, процессов служб может быть несколько.

Возможность передачи параметров службе при запуске используется не очень широко. Не известно, чтобы какая-либо из служб, поставляемых в составе Windows NT, принимала параметры таким образом. Если передавать параметры не требуется, то dwArgc следует указать как 0, а pArgv - как NULL.

Существенное значение с точки зрения программы управления службами имеет то, что функция StartService лишь инициирует запуск службы, она не дожидается, пока служба завершит свою инициализацию.

Функция ControlService:

Первый параметр этой функции идентифицирует службу, которой посылается команда управления, второй - задает код посылаемой команды, а последний параметр указывает на структуру (см. ниже), в которую функция заносит информацию о текущем состоянии службы, избавляя тем самым программиста от лишнего вызова QueryServiceStatus.