Смекни!
smekni.com

Розробка служби Win32 (стр. 1 из 3)

МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ

«КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ»

ФІЗИКО-ТЕХНІЧНИЙ ІНСТИТУТ

КУРСОВА РОБОТА

з дисципліни «Системне програмування»

на тему

« Розробка служби Win32 »

Виконав: студент IV курсу ФТІ групи ФБ-21

Ігнатьєв Сергій Ігорович

Київ 2009


Зміст курсової роботи

1. Завдання на курсову роботу

2. Ідея розв’язку задачі та теоретичне обгрунтування її вибору

3. Опис функцій, які використовувалися для програмної реалізації служби

Висновки

Література

Програмна реалізація


1. Завдання на курсову роботу

Розробити службу Win32, яка перевантажує комп’ютер не відразу, а через деякий час, щоб користувач міг завершити почату роботу.


2. Ідея розв’язку задачі та теоретичне обгрунтування її вибору

2.1 Теоретичні відомості

Служби – це життєво важлива і разом з тим таємнича частина Windows. Якщо раніше ви вже працювали з Windows або адміністрували системи працюючі під цією ОС, то мабуть ви вже зустрічалися зі службами. Що ж це таке? Сама проста відповідь: служба – це програма, яка працює не в контексті користувача. Іншими словами, служби продовжують працювати тоді, коли один користувач відключається від системи і до неї підключається інший користувач. Служби – це єдина категорія програм, які можуть робити в такому режимі.

В Windows служби використовуються для розв’язку багатьох важних задач, наприклад, існує служба, яка дозволяє вам підключатися до комп’ютера, очевидно, що така програма повинна продовжувати працювати навіть в випадку коли до системи не підключено ні одного користувача. Інші служби забезпечують сумісний доступ до диску і принтеру, а також являються допоміжними по відношенню до драйверів дискових пристроїв.

З точки зору програміста, служби – це звичайні програми, які мають засіб зв’язку з диспетчером служб SCM (ServiceControlManager). Диспетчер SCM – це внутрішній механізм Windows, який здійснює керування службами. В WindowsNT 4 користувач взаємодіє з SCM за допомогою аплету ServicesControlPanel. В Windows 2000 ту ж функцію виконує один із модулів консолі ММС. Список функцій які зв’язані зі службами, приведений в таблиці 1.

Як і будь-яка інша консольна програма, служба має функцію main. Одна програма може забезпечити роботу одної служби, а може включати в себе зразу декілька служб. Функція main заповнює масив, який описує всі служби, які підтримує програма. Масив передається службою StartServiceCtrlDispatcher. Для кожної служби, яка входить в склад файла, який використовується, цей масив містить текстовий ідентифікатор і точку входу.

Точка входу служби нагадує собою функцію main. Це функція, яка приймає звичайні аргументи argcіargv.

Таблиця 1. Функції служб.

Функція Призначення
ChangeServiceConfig Змінити конфігурацію
ChangeServiceConfig2 Змінити додаткову конфігурацію (Win2000)
CloseServiceHandle Закриває службу або дескриптор SCM
ControlService Посилає службі керуючий запит
CreateService Створює службу
DeleteService Видаляє службу
EnumDependentServices Визначає служби, які потребує та чи інша служба
EnumServicesStatus Послідовно перебирає служби в базі даних SCM
GetServiceDisplayName Повертає ім’я дисплея
GetServiceKeyName Повертає ключ реєстру для даної служби
LockServiceDatabase Блокує базу даних SCM
OpenSCManager Відкриває SCM
OpenService Відкриває існуючу службу
QueryServiceConfig Повертає конфігурацію служби
QueryServiceConfig2 Повертає додаткову конфігурацію служби (Win2000)
QueryServiceLockStatus Повертає інформацію про статус блокування SCM
QueryServiceObjectSecurity Повертає інформацію про захист служби
QueryServiceStatus Повертає стан служби
RegisterServiceCtrlHandler Реєструє функцію керування службою
SetServiceBits Настроює прапори, які пов’язанні зі службою
SetServiceObjectSecurity Настроює захист доступу до служби
SetServiceStatus Встановлює стан служби
StartService Запускає службу
StartServiceCtrlDispatcher Реєструє службу в SCM
UnlockServiceDatabase Деблокує базу даних SCM

В процесі звернення SCM до функції, яка є точкою входу служби, важливу роль грає структура SERVICE_STATUS. Більшість служб зберігають статичну копію цієї структури і відновлюють її в випадку необхідності. Функція, яка є точкою входу, використовує виклик RegisterServiceCtrlHandler для того, щоб зареєструвати обробник, який призначений для взаємодії SCM зі службою. Крім цього підпрограма ініціалізації служби звертається до виклику SetServiceStatus для того, щоб проінформувати SCM про поточний стан служби (служба може знаходитися в одному із станів: ініціалізація, функціонування або зупинка). Якщо ініціалізація потребує більше ніж декілька секунд, то потрібно виконати її в окремому програмному потоці.

Створення окремого програмного потоку потрібне також в випадку, якщо ви хочете створити службу, яка буде працювати виключно в фоновому режимі. Наприклад, якщо ви хочете розробити службу, яка кожну годину видає звуковий сигнал, який імітує роботу години каз боєм, то вам потрібно створити програмний потік, який буде слідкувати за часом і видавати звуковий потік.

Диспетчер SCMзвертається до обробника також в випадку, якщо потрібно визначити поточний стан служби. Крім цього служба визначає інші спеціальні види запитів, які можна адресувати службі за допомогою виклику ControlService (цей виклик є частиною диспетчера SCM). Звичайно ж, для того щоб направити службі запит, необхідно мати необхідні полномочиями.

Встановлення служб

Щоб встановити службу, необхідно добавити в реєстр декілька записів. Частіше за все ця процедура виконується за допомогою SCM. Для цього необхідно відкрити SCM (за допомогою виклику OpenSCManager), а потім звернутися до виклику CreateService. В якості аргументів цей виклик приймає ім’я файлу, в якому міститься служба, а також іншу необхідну інформацію. При цьому в реєстр вносяться всі необхідні записи.

Виклик CreateServiceвикористовує 13 аргументів, що може визвати легкий переляк в тих програмістів, які не мали з ним діла (список цих аргументів приведений в табл.2). Насправді звернутися до цієї функції зовсім не важко. Діло в тому, що при зверненні до CreateService більшості аргументів можна присвоїти значення за замовчуванням. Параметр dwServiceType може мати одне із значень: SERVICE_WIN32_OWN_PROCESS (у випадку, якщо в файлі, який виповнює, міститься тільки одна служба) або SERVICE_WIN32_SHARE_PROCESS (у випадку, якщо в події файлу, який виконує, входять декілька служб). Інші прапори дозволяють вказувати є служба драйвером ядра чи драйвером файлової системи.

Таблиця2. Аргументи виклику CreateService

Аргумент Тип Опис
hSCManager SC_HANDLE Обробник для SCM
lpServiceName LPCTSTR Коротке ім’я служби
lpDisplayName LPCTSTR Ім’я служби, яке відображається
dwDesiredAccess DWORD Рівень доступу до служби, який потребується
dwServiceType DWORD Тип
dwStartType DWORD Коли запускати службу
dwErrorControl DWORD Що робити, якщо служба не запрацювала
lpBinaryPathName LPCTSTR Ім’я файлу, в якому міститься служба
lpLoadOrderGroup LPCTSTR Ім’я групи служб, які запускаються одночасна
lpdwTagId DWORD Порядок завантаження в групі
lpDependencles LPCTSTR Показник на масив імен служб, які потрібні для роботи даної служби
lpServiceStartName LPCTSTR Ім’я облікового запису, який буде використовуватися при запуску служби (NULL відповідає обліковому запису LocalSystem)
lpPassword LPCTSTR Пароль для облікового запису (якщо потребується)

Служби NT.

В принципі сервери можуть працювати безкінечно довго, обслуговувати при цьому велику кількість клієнтів, які підключаються, відправляють запити, отримують відповіді і відключаються. Таким чином, ці „сервери” можуть давати неперервні послуги, тобто бути службами, але для повної ефективності служби повинні бути керуючими.

Служби NT вWindowsNTі 2000 дають можливість перетворити сервери в служби, які можна буде запускати по команді або при запуску системи, призупиняти, відновлювати і завершати. Служби NT дозволяють навіть наглядати за „станом здоров’я” служби. В кінці кінців, будь-які серверні системи потрібно перетворювати в служби NT, особливо якщо вони будуть інтенсивно використовуватися в організації або замовниками. А Windows 2000/NTє багато служб, наприклад керування telnet і обліковими записами безпеки, а також драйвери пристроїв. На панелі керування можна визвати програму адміністрування, яка відображає повний набір служб.

Програма JobShell дає елементарні засоби керування серверами, які дозволяють запускати сервер під керуванням завданням і відправляти сигнал завершення. Служби NT набагато складніше і надійніше. Для того, щоб продемонструвати це функція JobShell буде модифікована так, щоб вона могла керувати службами NT.

Також тут буде показано, як перетворити даний консольний додаток в службу NT і як встановити цю службу, керувати нею і контролювати її. Описується також реєстрація подій, завдяки якої служба може фіксувати свої дії в журналі.

Служби WindowsNT. Огляд.

Служби NTпрацюють під керуванням диспетчера керування службами (ServiceControlManager - SCM). Для перетворення консольного додатку, такого як serverNT чи serverSK, в службу NT, потрібно виконати три основні дії, в результаті яких програма переходить під керування SCM.

1. Створити нову точку входу main(), яка буде реєструвати службу в SCM , інформуючи про точки входу і імена логічних служб.