Ці функції визначені в таблиці служб, як показано в прикладі 1, і представляють логічні служби. Це, по суті, вдосконалені версії основної програми, яка перетворюється в службу, причому кожну логічну службу SCM викликає в окремому потоці. В свою чергу, логічна служба може запускати додаткові потоки, наприклад потоки-робочі сервера, які застосовувалися в програмах serverSK і serverNP. Часто в службі NT знаходиться тільки одна логічна служба. Можливо реалізувати в складі одної служби NT логічні служби як на базі сокетів, так і на базі іменованих каналів, якщо задати дві головні функції служби.
Також тут є додатковий код для реєстрації обробника керування служби – функції, яка SCM викликає для керування службами.
Реєстрація обробника керування служби
Обробник керування служби, який викликається диспетчером SCM, повинен бути здатним керувати відповідною логічною службою. Обробник керування консолі в програмі serverSK, який встановлює глобальний прапор закінчення, в обмеженій формі демонструє, що повинен представляти собою обробник. Але кожна логічна служба повина зареєструвати обробник з використанням функції Register-ServiceCtrlHandler.
SERVICE_STATUS_HANDLE
RegisterServiceCtrlHandler (
LPCTSCR lpServiceName,
LPHANDLER_FUNCTION lp&HandlerProc)
Параметри
lpServiceName – вказане користувачем ім’я служби, яке представлене в елементі таблиці, який відповідає цій логічній службі.
lpHandlerProc – адрес функції обробника, яка буде описана нижче.
Функція повертає дескриптор об’єкта SERVICE_STATUS_HANDLE, рівний нулю, якщо вийшла помилка; для аналізу помилок можна застосовувати звичайні методи.
Встановлення стану служби
Коли обробник зареєстрований, то наступна задача полягає в тому, щоб встановити стан служби; в даний момент це SERVICE_STAER_PENDING. Функція, яка для цього застосовується, SetServiceStatus також використовується в деяких інших місцях і повина викликати періодично, щоб інформувати SCM про стан служби (інтервал вказується в полі параметра-структури стану).
Структура service_status
Структура SERVICE_STATUS визначена слідуючим чином:
typedef struct _SERVICE_STATUS {
DWORD dwServiceType;
DWORD dwCurrentState;
WORD dwControlsAccepted;
DWORD dwWin32ExitCode;
DWORD dwServiceSpecificExitCode;
DWORD dwCheckPoint;
DWORD dwWaitHint;
} SERVICE_STATUS, *LPBERVICE_STATUS;
Параметри
dwWin32ExitCode – звичайний код закінчення потоку логічної служби, яка повинна присвоїти йому значення NO_ERROR в ході виконання і при нормальному завершені.
dwServiceSpecificExitCode можна ви користувати для вказання помилок вводу запуску або закінчення служби, але це значення буде проігнорованим, якщо dwWin32ExitCode не присвоєне значення ERROR_SERVICE_SPECIFIC_ERROR.
dwCheckPoint – контрольний показчик проходження службою всіх її значень разом з ініціалізацією і закінченням, які служба повинна періодично зчитувати. Це значення не використовується, якщо служба не має затримки при закінченні, зупинці і відновлені.
dwWaitHint – інтервал в мілісекундах між викликами Set ServiceSpecificExitCode і збільшеним значенням dwCheckPoint або зміненим значенням dwCurrentState. SCM може припустити, що виникла помилка, якщо інтервал протікає без такого виклику SetServiceStatus.
Тип служби
Елемент dwServiceType повинен мати одне із значень, які приведені в таблиці 3.
Для наших цілей тип служби майже завжди буде мати значення SERVICE_WIN32_OWN_PROCESS, хоча різні значення свідчать про те, що служби можуть грати різні ролі.
Таблиця 3. Типи служб.
Значення | Тип служби |
SERVICE_WIN32_OWN_PROCESS | Служба Win32, яка працює в окремому процесі зі своїми власними ресурсами. Використовується в таблиці 2. |
SERVICE_WIN_SHARE_PROCESS | Служба Win32, яка використовує процес спільно з іншими службами, так що декілька служб може спільно користуватися ресурсами, змінними і т.д. |
SERVICE_KERNEL_DRIVER | Драйвер пристрою Windows NT |
SERVICE_FILE_SYSTEM_DRIVER | Драйвер файлової системи Windows NT |
SERVICE_INTERACTIVE_PROCESS | Процес служби Win32, який може взаємодіяти з користувачем через робочий стіл |
Стан служби
Параметр dwCurrentState визначає поточний стан служби. Можливі значення цього параметра приведені в табл.4.
Таблиця 4. Значення стану служби.
Значення | Стан |
SERVICE_STOPPED | Служба зовсім не працює, так як не була запущена |
SERVICE_START_PENDING | Служба знаходиться в процесі запуску, але ще не готова відповідати не запити. Наприклад, потоки-робочі ще не запущені |
SERVICE_STOP_PENDING | Служба зупиняється, але ще не закінчилася до кінця. Наприклад, глобальний прапор закінчення може бути встановленим, але потоки-робочі ще не прореагували |
SERVICE_RUNNING | Служба працює |
SERVICE_CONTINUE_PENDING | Виконується відновлення служби після зупинки |
SERVICE_PAUSE_PENDING | Служба переходить в стан зупинка, але перехід ще не закінчений |
SERVICE_PAYSED | Служба призупинена |