Всё сдал! - помощь студентам онлайн Всё сдал! - помощь студентам онлайн

Реальная база готовых
студенческих работ

pencil
Узнай стоимость на индивидуальную работу!
icon Цены в 2-3 раза ниже
icon Мы работаем
7 дней в неделю
icon Только проверенные эксперты

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

Тип Реферат
Предмет Информатика
Просмотров
1097
Скачиваний
636
Размер файла
46 б
Поделиться

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

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

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

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

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

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

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

на тему

« Розробка служби 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

Аргумент Тип Опис
hSCManagerSC_HANDLEОбробник для SCM
lpServiceNameLPCTSTRКоротке ім’я служби
lpDisplayNameLPCTSTRІм’я служби, яке відображається
dwDesiredAccessDWORDРівень доступу до служби, який потребується
dwServiceTypeDWORDТип
dwStartTypeDWORDКоли запускати службу
dwErrorControlDWORDЩо робити, якщо служба не запрацювала
lpBinaryPathNameLPCTSTRІм’я файлу, в якому міститься служба
lpLoadOrderGroupLPCTSTRІм’я групи служб, які запускаються одночасна
lpdwTagIdDWORDПорядок завантаження в групі
lpDependenclesLPCTSTRПоказник на масив імен служб, які потрібні для роботи даної служби
lpServiceStartNameLPCTSTRІм’я облікового запису, який буде використовуватися при запуску служби (NULL відповідає обліковому запису LocalSystem)
lpPasswordLPCTSTRПароль для облікового запису (якщо потребується)

Служби 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 , інформуючи про точки входу і імена логічних служб.

2. Перетворювати попередню функцію точки входу main() в ServiceMain(), яка буде реєструвати обробник керування служби і інформувати SCM про його стан. Другий код зберігається практично без змін.

3. створити обробник керування служби, який буде відповідати на команди SCM.

Описавши ці три етапи, ми будемо по мірі необхідності давати додаткову інформацію по створенню, запуску служб і керуванню ними. Далі ці дії описанні краще.

Функція main().

Задача нової функції main(), яку викликає SCM, полягає в реєструванні служби і в запуску диспетчера керування службою. Для цього потрібно визвати функцію StartServiceCtrlDispatcher з ім’ям (іменами) і точкою (точками) входу однієї або декількох логічних служб.

BOOLStartServiceCtrlDispatcher (

LPSERVICE_TABLE_ENTRYlpServiceStartTable)

Єдиний параметр lpServiceStartTable є адресою масиву SERVICE_TABLE_ENTRY, кожен елемент якого містить ім’я і точку входу логічної служби. Кінець масиву позначається парою елементів з значеннями NULL.

Виклик StartServiceCtrlDispatcher в головному потоці процесу служби приводить до приєднання потоку до SCM в формі потоку диспетчера керування службою SCMне повертає керування, поки всі служби не будуть закінчені. Але потрібно замітити, що в цей момент логічні служби фактично ще не запускаються.

В прикладі 1 показана проста головна програма служби, яка містить одну логічну службу.

Приклад 1. Програма main: головна точка входу служби.

#include “EvryThng.h”

void WINAPI ServiceMain (DWORD argc, LPTSTR argv []);

static LPTSTR ServiceName = _T (“SocketCommandLineService”);

/* головна процедура, яка запускає диспетчер керуваня службою. */

VOID _tmain (int argc, LPTSTR argv [])

{

SERVICE_TABLE_ENTRY DispatchTable [] =

{

{ ServiceName, SeviceMain },

{ NULL, NULL }

};

if (!StartServiceCtrlDispatcher (DispatchTable))

ReportErrjr (_T

(“Не вдалося запустити диспетчер керування службою.”),

1, TRUE);

/*Servoce<aom () не буде працювати, поки її не запустить SCM.*/

/*Повернення назад відбувається тільки після завершення всіх служб.*/

return;

Функції ServiceMain()

Ці функції визначені в таблиці служб, як показано в прикладі 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 – інтервал в мілісекундах між викликами SetServiceSpecificExitCode і збільшеним значенням 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Служба призупинена

Коди керування, що сприймаються

Параметр dwControlsAccepted визначає коди керування, які служба сприймає і обробляє в своєму обробнику керування. Можливі значення перераховані в таблиці 5; декілька значень можуть об’єднуватися порозрядним „або”. Приведена нижче версія serverSK для служби сприймає всі три значення. Додаткові значення описані в документації MSDN.

Таблиця 5. Коди керування, які сприймаються службою

Значення Дія
SERVICE_ACCEPT_STOPДозволяється SERVICE_CONTROL_STOP
SERVICE_ACCEPT_PAUSR_CONTINUEДозволяється SERVICE_CONTROL_PAUSE і SERVICE_CONTROL_CONTINUE
SERVICE_ACCEPT_SHUTDOWN (функція ControlService не може видавати цей код керування)Служба повідомляє, коли система закінчує роботу. Таким чином, система може послати службі значенняSERVICE_CONTROL_ SHUTDOWN

Код служби

Коли обробник зареєстрований і встановлений стан служби SERVICE_START_PENDING, служба може ініціалізувати себе і встановити стан знову. В прикладі перетворення serverSK після того, як сокети ініціалізовані і сервер буде готовий до прийому клієнтів, слідує встановити стан SERVICE_RUNNING.

Обробник керування служби

Обробник керування служби, який вказаний в функції RegisterServiceCtrlHandler, має наступну форму:

VOID WINAPI ServerCtrlHandler (DWORD fdwControl)

Єдиний параметр цієї функції, fdwControl, містить сигнал керування, який передається диспетчером SCM для обробки. Таким чином, обробник керування є узагальненою формою обробника керування консолі.

Сигнали керування можуть мати слідуючи значення:

SERVICE_CONTROL_STOP

SERVICE_CONTROL_PAUSE

SERVICE_CONTROL_CONTINUE

SERVICE_CONTROL_INTERROGATE

SERVICE_CONTROL_SHUTDOWN

Також допускаються значення користувача в діапазоні 128-255, але тут вони не розглядаються.

Обробник викликається диспетчером SCMв тому ж потоці, що і головна програма, і звичайно будується на базі оператора switch.

Керування службами WindowsNT

Наступна задача після написання коду – передача служби під керуванням SCM, щоб її можна було запускати, закінчувати і виконувати інші керуючі операції.

Для цього потрібно виконати декілька дій з відкриття SCM, створення служби під керуванням SCM і потім з її запуску. Ці дії не керують службою безпосередньо; вони представляють собою команди для SCM, який працює з вказаною службою.

Відкриття SCM

Для створення служби необхідний окремий процес, який грає роль „адміністратора”. Перша дія – відкриття SCMі отримання дескриптору, який потім дозволяє створити службу.

SC_HANDLE OpenSCManager (

LPCTSTR lpMachineName,

LPCTSTR lpDatabaseName,

DWORD dwDesiredAddress)

Параметри

lpMachineName рівний NULL, якщо SCM знаходиться в локальній системі, хоча можна звертатися до SCM і на інших машинах в мережі.

lpDatabaseName – також звичайно NULL.

dwDesiredAddress – звичайно SC_MANAGER_ALL_ACCESS, але можна задати більш обмежені права доступу, як описано в вбудованій документації.

Створення і видалення служби

Нові служби фіксуються в слідую чому розділі системного реєстру:

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices

Для створення служби слідує визвати функцію CreateService, вказавши дескриптор SC_HANDLE, отриманий при виклику OpenSCManager.

SC_HANDLE CreatrService (

SC_HANDLE hSCManager,

LPCTSTR lpServiceName,

LPCTSTR lpDisplayName,

DWORD dwDesiredAccess,

DWORD dwServiceType,

DWORD dwStartType,

DWORD dwErrorControl,

LPCTSTR lpBinaryPathName,

LPCTSTR lpLoadOrderGroup,

LPDWORD lpdwTagId,

LPCTSTR lpDependencies,

LPCTSTR lpServiceStartName,

LPCTSTR lpPassword);

Параметри

hSCManager – дескриптор SC_HANDLE, який отриманий від OpenSCManager.

lpServiceName – ім’я, по якому в подальшому ми будемо посилатися на службу, це одне із імен логічних служб, які вказані в таблиці при виклику StartServiceCtrlDispatcher. Замітимо, що для кожної логічної служби потрібний окремий виклик CreateService.

lpDisplayName – ім’я, під яким служба буде відображатися в реєстрі і в аплеті Служби, який відкривається на панелі керування в розділі Средства адміністрування. Це ім’я з’являється зразу після успішного виклику CreateService.

dwDesiredAccess може мати значення SERVICE_ALL_ACCESS або бути комбінацією GENERIC_READ, GENERIC_WRITE і GENERIC_EXECUTE. Більш детально це описано в вкладеній документації.

dwServiceType має значення, які представленні в таблиці 1.

dwStartType визначає порядок запуску служби. В наших прикладах використовується зачення SERVICE_DEMAND_START; інші значення (SERVICE_BOOT_START і SERVICE_SYSTEM_START) дозволяють запускати служби драйверів пристроїв в ході початкового запуску системи, а SERVICI_AUTO_START визначає, що служба повинна автоматично запускатися при запуску системи.

lpBinaryPathName вказує на виконуючий файл служби; розширення .exe вказувати не потрібно.

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

Для отримання дескриптора іменованої служби використовується функція OpenService, для видалення служби із системного реєстру – DeleteService, а для закриття дескриптора – CloseServiceHandle.

Запуск служби

Зразу після створення служба ще не працює. Запустіть функцію ServiceMain (), вказавши дескриптор, який отриманий від CreateService, і параметри командного рядка argc, argv, які вимагає „головна” функція служби (тобто функція, яка вказана в таблиці служб).

BOOL StartService (

SC_HANDLE hService,

DWORD argc,

LPTSTR argv [] )

Керування служби

Для керуючої дії над службою диспетчером SCMповинен бути викликаний обробник керування службою з відповідним кодом керування.

BOOL ControlService (

SC_HANDLE hService,

DWORD ControlCode,

LPSERVICE_STATUS pServStat)

Якщо доступ дозволений, ControlCode має одне із наступних значень:

SERVICE_CONTROL_STOP

SERVICE_CONTROL_PAUSE

SERVICE_CONTROL_CONTINUE

SERVICE_CONTROL_INTERROGATE

SERVICE_CONTROL_SHUTDOWN

або вказане користувачем значення в діапазоні 128-255. Це ті ж значення, які використовувалися для прапора fdwControl в функції ServerCtrlHandler.

pServStat вказує на структуру SERVICE_STATUS, яка отримує поточний стан. Ця ж структура, що використовується в функціїSetServiceStatus.

Перевірка стану служби

Отримати поточний стан служби в структурі SERVICE_STATUSдозволяє наступна служба:

BOOL QueryServiceStatus (

SC_HANDLE hService,

LPSERVICE_STATUS lpServiceStatus)

Резюме: робота служб і керування ними

На мал.1 показаний диспетчер керування службами (SCM)і його взаємодія з службами й програмою керування. Служба реєструється в SCM і через SCM передаються всі команди для неї.


Мал.1. Керування службами NTчерезSCM

2.2 Ідея розв’язку задачі

Створити процес, котрим можна керувати: встановити, запустити (після чого з’являється попередження про завершення сеансу), призупинити, відновити його роботу, зупинити, видалити.


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

3.1 Main

Функція main – тіло програми, де виконуються, описані вище, функції.

main( int argc, char* argv[] );

Параметри:

argc – [число] кількість параметрів командного рядка.

argv - [текст] самі параметри командного рядка.

3.2MySystemReboot

Для завершення роботи Windows можна скористатися функцією ExitWindowsEx. При цьому файлові буфери будуть скинуті на диск, а система наведена в стан, коли комп'ютер можна безпечно виключити.

В Windows NT/2000/XP: для завершення роботи системи необхідно одержати привілеї SE_SHUTDOWN_NAME, як і реалізовано у самій функції.

3.3 S_Headler

Функція керування службою.

void WINAPI S_Handler (DWORD Code1);

Параметри:

Code1 - значення команди (старт, стоп, пауза)


3.4 ServiceMain

Функція, в якій реєструється процес, встановлюється таймер на завершення сеансу (5 сек) і відповідні попередження користувача про ПЕРЕЗАГРУЗКУ (REBOOT).

3.5 ErrorP

Функція ErrorP вивід помилки і вихід із програми.

void ErrorP ( LPTSTR Source );

Параметри:

Source – текст попередження про помилку.


Висновки

У роботі була створена служба Win32, яка перевантажує комп’ютер не відразу, а через деякий час (а саме через 5 секунд), щоб користувач міг завершити почату роботу. Була вивчена структура служб, їх встановлення та керування ними.


Література

1. Конспект лекцій.

2. Майкл Дж. Янг VisualC++ 6 (том 1,2).

3. MSDN Library, February 2005.


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

#define _WIN32_WINNT 0x0400

#include <windows.h>

#include <stdio.h>

#include <string.h>

HANDLE hToken;

TOKEN_PRIVILEGES tkp;

LPSTR MyServiceName = "DClock";

LPSTR MyDisplayName = "Desktop Clock";

void ErrorP(LPTSTR Source) // Повідомляємо про помилку і виходимо

{

LPVOID MsgBuf;

FormatMessage(

FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |

FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),

MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),

(LPTSTR) &MsgBuf, 0, NULL );

printf("%s: %s", Source, MsgBuf);

exit(1);

}

SERVICE_STATUS_HANDLE s_s_handle;

SERVICE_STATUS s_status;

void WINAPI S_Handler(DWORD Code1) // функція керування службою

{

switch (Code1)

{

case SERVICE_CONTROL_STOP:

case SERVICE_CONTROL_SHUTDOWN:

s_status.dwCurrentState = SERVICE_STOPPED;

break;

case SERVICE_CONTROL_PAUSE:

s_status.dwCurrentState = SERVICE_PAUSED;

break;

case SERVICE_CONTROL_CONTINUE:

s_status.dwCurrentState = SERVICE_RUNNING;

break;

}

SetServiceStatus(s_s_handle, &s_status); //рефреш властивостей функції

}

BOOL MySystemReboot() // ф-ція перезагрузки

{

//HANDLE hToken;

//TOKEN_PRIVILEGES tkp;

// отримуємо маркер поточного процесу

if (!OpenProcessToken(GetCurrentProcess(),

TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))

return( FALSE );

// отримуємо LUID для привілеїв завершення роботи

LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,

&tkp.Privileges[0].Luid);

tkp.PrivilegeCount = 1; // встановлений один привілей

tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

// отримуємо привілеї завершення роботи для даного процесу

AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,

(PTOKEN_PRIVILEGES)NULL, 0);

if (GetLastError() != ERROR_SUCCESS)

return FALSE;

// перегружаємо систему і змушуємо всі інші програми закритися

if (!ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))

return FALSE;

return TRUE;

}

void WINAPI ServiceMain(DWORD dwArgc, LPSTR *psArgv)

{

HANDLE h_Timer;

SYSTEMTIME st_Time;

FILETIME f_Time;

s_s_handle = RegisterServiceCtrlHandler(MyServiceName, S_Handler); // Запускаємо службу

s_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;

s_status.dwCurrentState = SERVICE_RUNNING;

s_status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE;

s_status.dwWin32ExitCode = NOERROR;

s_status.dwCheckPoint = 0;

s_status.dwWaitHint = 0;

SetServiceStatus(s_s_handle, &s_status);

MessageBox(0, "System will be restarted in 5 seconds!",

"Shutdown", MB_ICONINFORMATION);

h_Timer = CreateWaitableTimer(NULL, FALSE, NULL); // встановлюємо таймер

if(!h_Timer)

ErrorP("CreateWaitableTimer");

GetSystemTime(&st_Time);

st_Time.wSecond += 5;

SystemTimeToFileTime(&st_Time, &f_Time);

if(!SetWaitableTimer(h_Timer, (LARGE_INTEGER*)&f_Time, 1000, NULL,

NULL, FALSE)

)

ErrorP("SetWaitableTimer");

WaitForSingleObject(h_Timer, INFINITE);

MySystemReboot(); // перегружаємося =)

}

void main(int argc, char* argv[])

{

if(argc > 1)

{

SC_HANDLE h_SC;

h_SC = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); //менеджер керування службою

if(!h_SC)

ErrorP("OpenSCManager");

if(!stricmp(argv[1], "create"))

{

CHAR lpPath[MAX_PATH]; // Створюємослужбу

GetModuleFileName(NULL, lpPath, MAX_PATH);

h_SC = CreateService(h_SC, MyServiceName,

MyDisplayName, 0, SERVICE_WIN32_SHARE_PROCESS |

SERVICE_INTERACTIVE_PROCESS, SERVICE_AUTO_START,

SERVICE_ERROR_IGNORE, lpPath, NULL, NULL, NULL,

NULL, NULL);

if(!h_SC)

ErrorP("CreateService");

}

else if(!stricmp(argv[1], "start"))

{

h_SC = OpenService(h_SC, MyServiceName, SERVICE_START); // Запускаємослужбу

if(!h_SC)

ErrorP("OpenService");

if(!StartService(h_SC, 0, NULL))

ErrorP("StartService");

}

else if(!stricmp(argv[1], "pause"))

{

h_SC = OpenService(h_SC, MyServiceName, // призупиняємослужбу

SERVICE_PAUSE_CONTINUE);

if(!h_SC)

ErrorP("OpenService");

if(!ControlService(h_SC, SERVICE_CONTROL_PAUSE, &s_status))

ErrorP("ControlService");

}

else if(!stricmp(argv[1], "continue"))

{

h_SC = OpenService(h_SC, MyServiceName, // продовжуємо призупинену службу

SERVICE_PAUSE_CONTINUE);

if(!h_SC)

ErrorP("OpenService");

if(!ControlService(h_SC, SERVICE_CONTROL_CONTINUE,

&s_status)

)

ErrorP("ControlService");

}

else if(!stricmp(argv[1], "stop"))

{

h_SC = OpenService(h_SC, MyServiceName, SERVICE_STOP); // зупиняємослужбу

if(!h_SC)

ErrorP("OpenService");

if(!ControlService(h_SC, SERVICE_CONTROL_STOP, &s_status))

ErrorP("ControlService");

}

else if(!stricmp(argv[1], "delete"))

{

h_SC = OpenService(h_SC, MyServiceName, DELETE); // видаляємослужбу

if(!h_SC)

ErrorP("OpenService");

if(!DeleteService(h_SC))

ErrorP("DeleteService");

}

else

printf("Invalid commandn");

}

else

{

SERVICE_TABLE_ENTRY s_Table[] = { // Запускаємо на виконання

{ MyServiceName, ServiceMain },

{ NULL, NULL }

};

StartServiceCtrlDispatcher(s_Table);

}

}


Нет нужной работы в каталоге?

Сделайте индивидуальный заказ на нашем сервисе. Там эксперты помогают с учебой без посредников Разместите задание – сайт бесплатно отправит его исполнителя, и они предложат цены.

Цены ниже, чем в агентствах и у конкурентов

Вы работаете с экспертами напрямую. Поэтому стоимость работ приятно вас удивит

Бесплатные доработки и консультации

Исполнитель внесет нужные правки в работу по вашему требованию без доплат. Корректировки в максимально короткие сроки

Гарантируем возврат

Если работа вас не устроит – мы вернем 100% суммы заказа

Техподдержка 7 дней в неделю

Наши менеджеры всегда на связи и оперативно решат любую проблему

Строгий отбор экспертов

К работе допускаются только проверенные специалисты с высшим образованием. Проверяем диплом на оценки «хорошо» и «отлично»

1 000 +
Новых работ ежедневно
computer

Требуются доработки?
Они включены в стоимость работы

Работы выполняют эксперты в своём деле. Они ценят свою репутацию, поэтому результат выполненной работы гарантирован

avatar
Экономика
Маркетинг
Информатика
icon
109993
рейтинг
icon
2705
работ сдано
icon
1238
отзывов
avatar
Математика
Физика
История
icon
103781
рейтинг
icon
5281
работ сдано
icon
2378
отзывов
avatar
Химия
Экономика
Биология
icon
74482
рейтинг
icon
1858
работ сдано
icon
1172
отзывов
avatar
Высшая математика
Информатика
Геодезия
icon
62710
рейтинг
icon
1046
работ сдано
icon
598
отзывов
Отзывы студентов о нашей работе
48 894 оценки star star star star star
среднее 4.9 из 5
Московский Университет имени С.Ю. Витте
Спасибо большое исполнителю. Работы принимаются без замечаний, всегда выполняются вовремя....
star star star star star
Пермский национальный исследовательский политехнический университет
Работа выполнена задолго досрочно! Никаких замечаний и недочетов! Спасибо большое Ирине!
star star star star star
НГТУ
Отличный исполнитель, все своевременно и даже быстрее, работа выполнена отлично!
star star star star star

Последние размещённые задания

Ежедневно эксперты готовы работать над 1000 заданиями. Контролируйте процесс написания работы в режиме онлайн

в любом формате

Решение задач, математические основы судовождения

Срок сдачи к 9 дек.

только что

Разработка IT-продукта

Курсовая, Анализ и моделирование бизнес-процессов

Срок сдачи к 8 дек.

1 минуту назад

География/физ-ра/обж 1 курс колледж. уровень простой.

Решение задач, География

Срок сдачи к 15 дек.

1 минуту назад

Прочитайте высказывания писателей и ученых. Выполните задания:

Контрольная, Русский язык

Срок сдачи к 23 дек.

2 минуты назад

Написать эссе на выбор из двух книг

Эссе, Социология

Срок сдачи к 15 дек.

2 минуты назад

решить не по правилу лопиталя

Решение задач, Математика

Срок сдачи к 7 дек.

3 минуты назад

Добрый день! Помогите, пожалуйста, решить 4 задачи:

Решение задач, физика

Срок сдачи к 8 дек.

3 минуты назад

Помочь решить задач (бух учет) 23 числа в 17:00

Тест дистанционно, Бухгалтерский учет

Срок сдачи к 23 дек.

3 минуты назад

Скрайбинг

Другое, Экология

Срок сдачи к 11 дек.

3 минуты назад

Задачи

Решение задач, Правоведение

Срок сдачи к 31 дек.

3 минуты назад
4 минуты назад

Выполнять задание ориентируясь на структуру работы

Контрольная, Психология

Срок сдачи к 13 дек.

5 минут назад

Нужно написать курсовую работу « Разработка базы данных»

Курсовая, Информатика и программирование

Срок сдачи к 18 дек.

5 минут назад

Реферат не более 15 страниц

Реферат, Физическая культура и спорт

Срок сдачи к 14 дек.

5 минут назад

судебный процесс в россии по соборному уложению 1649 г

Курсовая, история государства и права

Срок сдачи к 14 дек.

6 минут назад

Решить 3 задачи

Контрольная, Физика

Срок сдачи к 9 дек.

6 минут назад
planes planes
Закажи индивидуальную работу за 1 минуту!

Размещенные на сайт контрольные, курсовые и иные категории работ (далее — Работы) и их содержимое предназначены исключительно для ознакомления, без целей коммерческого использования. Все права в отношении Работ и их содержимого принадлежат их законным правообладателям. Любое их использование возможно лишь с согласия законных правообладателей. Администрация сайта не несет ответственности за возможный вред и/или убытки, возникшие в связи с использованием Работ и их содержимого.

«Всё сдал!» — безопасный онлайн-сервис с проверенными экспертами

Используя «Свежую базу РГСР», вы принимаете пользовательское соглашение
и политику обработки персональных данных
Сайт работает по московскому времени:

Вход или
регистрация
Регистрация или
Не нашли, что искали?

Заполните форму и узнайте цену на индивидуальную работу!

Файлы (при наличии)

    это быстро и бесплатно