- •Общие требования к выполнению лабораторных работ Содержание отчета
- •3. Оборудование
- •4. Задание на работу
- •3. Оборудование
- •4. Задание на работу
- •3. Оборудование
- •4. Задание на работу
- •3. Оборудование
- •4. Задание на работу
- •Страничная организация памяти
- •1. Цель работы
- •2. Краткие теоретические сведения
- •3. Оборудование
- •4. Задание на работу
- •5 Контрольные вопросы
- •Защищенный режим процессора. Обработка исключений
- •1. Цель работы
- •2. Краткие теоретические сведения
- •Защищенный режим процессора. Многозадачность
- •1. Цель работы
- •2. Краткие теоретические сведения
- •Процессы и потоки в Windows
- •1. Цель работы
- •Краткие теоретические сведения
- •Структура сервиса
- •Дополнительная
- •Периодические издания
- •Программное обеспечение и Интернет-ресурсы
Структура сервиса
Сервис может быть консольным приложением и приложением с графическим интерфейсом.
Сервисы взаимодействуют с пользователем через рабочий стол или окно сообщений.
Сервис должен содержать две функции обратного вызова. Первая – определяет точку входа, вторая – реагирует на управляющие сигналы от ОС.
Создание сервиса.
Пример 1. Создание сервиса
#include <windows.h>
#include <fstream.h>
char service_name[] = "DemoService"; // имя сервиса
SERVICE_STATUS service_status;
SERVICE_STATUS_HANDLE hServiceStatus;
VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv);
VOID WINAPI ServiceCtrlHandler(DWORD dwControl);
ofstream out; // выходной файл для протокола работы сервиса
int nCount; // счетчик
// главная функция приложения
int main()
{
// инициализируем структуру сервисов
SERVICE_TABLE_ENTRY service_table[] =
{
{service_name, ServiceMain}, // имя сервиса и функция сервиса
{ NULL, NULL } // больше сервисов нет
};
// запускаем диспетчер сервиса
if (!StartServiceCtrlDispatcher(service_table))
{
out.open("C:\\ServiceFile.log");
out << "Start service control dispatcher failed.";
out.close();
return 0;
}
return 0;
}
VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
{
// регистрируем обработчик управляющих команд для сервиса
hServiceStatus = RegisterServiceCtrlHandler(
service_name, // имя сервиса
ServiceCtrlHandler // обработчик управляющих команд
);
if (!hServiceStatus)
{
out.open("C:\\ServiceFile.log");
out << "Register service control handler failed.";
out.close();
return;
}
// инициализируем структуру состояния сервиса
service_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
service_status.dwCurrentState = SERVICE_START_PENDING;
service_status.dwControlsAccepted = SERVICE_ACCEPT_STOP |
SERVICE_ACCEPT_SHUTDOWN;
service_status.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;
service_status.dwServiceSpecificExitCode = 0;
service_status.dwCheckPoint = 0;
service_status.dwWaitHint = 5000;
// устанавливаем состояние сервиса
if (!SetServiceStatus(hServiceStatus, &service_status))
{
out.open("C:\\ServiceFile.log");
out << "Set service status 'SERVICE_START_PENDING' failed.";
out.close();
return;
}
// определяем сервис как работающий
service_status.dwCurrentState = SERVICE_RUNNING;
// нет ошибок
service_status.dwWin32ExitCode = NO_ERROR;
// устанавливаем новое состояние сервиса
if (!SetServiceStatus(hServiceStatus, &service_status))
{
out.open("C:\\ServiceFile.log");
out << "Set service status 'START_PENDING' failed.";
out.close();
return;
}
// открываем файл протокола работы сервиса
out.open("C:\\ServiceFile.log");
out << "The service is started." << endl << flush;
out << "My name is: " << lpszArgv[0] << endl << flush;
for (int i = 1; i < (int)dwArgc; ++i)
out << "My " << i << " parameter = " << lpszArgv[i] << endl << flush;
// рабочий цикл сервиса
while (service_status.dwCurrentState == SERVICE_RUNNING)
{
++nCount;
Sleep(3000);
}
}
VOID WINAPI ServiceCtrlHandler(DWORD dwControl)
{
switch(dwControl)
{
case SERVICE_CONTROL_STOP: // остановить сервис
// записываем конечное значение счетчика
out << "Count = " << nCount << endl;
out << "The service is finished." << endl << flush;
// закрываем файл
out.close();
// устанавливаем состояние остановки
service_status.dwCurrentState = SERVICE_STOPPED;
// изменить состояние сервиса
SetServiceStatus(hServiceStatus, &service_status);
break;
case SERVICE_CONTROL_SHUTDOWN: // завершить сервис
service_status.dwCurrentState = SERVICE_STOPPED;
// изменить состояние сервиса
SetServiceStatus(hServiceStatus, &service_status);
break;
default:
// увеличиваем значение контрольной точки
++service_status.dwCheckPoint;
// оставляем состояние сервиса без изменения
SetServiceStatus(hServiceStatus, &service_status);
break;
}
return;
}
Установка сервиса
Пример 2. Установка сервиса
#include <windows.h>
#include <iostream.h>
int main()
{
SC_HANDLE hServiceControlManager, hService;
// связываемся с менеджером сервисов
hServiceControlManager = OpenSCManager(
NULL, // локальная машина
NULL, // активная база данных сервисов
SC_MANAGER_CREATE_SERVICE // возможно создание сервиса
);
if (hServiceControlManager == NULL)
{
cout << "Open service control manager failed." << endl
<< "The last error code: " << GetLastError() << endl
<< "Press any key to exit." << endl;
cin.get();
return 0;
}
cout << "Service control manager is opened." << endl
<< "Press any key to continue." << endl;
cin.get();
// устанавливаем новый сервис
hService = CreateService(
hServiceControlManager, // дескриптор менеджера сервисов
"DemoService", // внутреннее имя сервиса, используемое SCM
"Demo_Service", // внешнее имя сервиса в панели управления
SERVICE_ALL_ACCESS, // полный контроль над сервисом
SERVICE_WIN32_OWN_PROCESS, // сервис является процессом
SERVICE_DEMAND_START, // запускается сервис по требованию
SERVICE_ERROR_NORMAL, // обработка ошибок нормальная
"C:\\DemoService.exe", // путь к сервису
NULL, // сервис не принадлежит к группе
NULL, // тэг группы не изменяется
NULL, // сервис не зависит от других сервисов
NULL, // имя совпадает с текущим именем учетной записи
NULL // пароля нет
);
if (hService == NULL)
{
cout << "Create service failed." << endl
<< "The last error code: " << GetLastError() << endl
<< "Press any key to exit." << endl;
cin.get();
// закрываем дескриптор менеджера сервисов
CloseServiceHandle(hServiceControlManager);
return 0;
}
cout << "Service is installed." << endl
<< "Press any key to exit." << endl;
cin.get();
// закрываем дескрипторы
CloseServiceHandle(hService);
CloseServiceHandle(hServiceControlManager);
return 0;
}
Запуск сервиса
Пример 3. Открытие и запуск сервиса
#include <windows.h>
#include <iostream.h>
int main()
{
char service_name[] = "DemoService"; // имя сервиса
char *param[] = { "p1", "p2", "p3" }; // список параметров
SC_HANDLE hServiceControlManager, hService;
// связываемся с менеджером сервисов
hServiceControlManager = OpenSCManager(
NULL, // локальная машина
NULL, // активная база данных сервисов
SC_MANAGER_CONNECT // соединение с менеджером сервисов
);
if (hServiceControlManager == NULL)
{
cout << "Open service control manager failed." << endl
<< "The last error code: " << GetLastError() << endl
<< "Press any key to continue." << endl;
cin.get();
return 0;
}
cout << "Service control manager is opened." << endl
<< "Press any key to continue." << endl;
cin.get();
// открываем сервис
hService = OpenService(
hServiceControlManager, // дескриптор менеджера сервисов
service_name, // имя сервиса
SERVICE_ALL_ACCESS // полный доступ к сервису
);
if (hService == NULL)
{
cout << "Open service failed." << endl
<< "The last error code: " << GetLastError() << endl
<< "Press any key to exit." << endl;
cin.get();
// закрываем дескриптор менеджера сервисов
CloseServiceHandle(hServiceControlManager);
return 0;
}
cout << "Service is opened." << endl
<< "Press any key to continue." << endl;
cin.get();
// стартуем сервис
if (!StartService(
hService, // дескриптор сервиса
3, // три параметра
(const char**)param // указатель на массив параметров
))
{
cout << "Start service failed." << endl
<< "The last error code: " << GetLastError() << endl
<< "Press any key to exit." << endl;
cin.get();
// закрываем дескрипторы
CloseServiceHandle(hServiceControlManager);
CloseServiceHandle(hService);
return 0;
}
cout << "The service is started." << endl
<< "Press any key to exit." << endl;
cin.get();
// закрываем дескрипторы
CloseServiceHandle(hServiceControlManager);
CloseServiceHandle(hService);
return 0;
}
3. Оборудование
4. Задание на работу
Спроектировать, установить и протестировать сервис по варианту, заданному преподавателем.
5. Содержание отчета
6. Контрольные вопросы
Список литературы
Основная литература
Гордеев, А.В. Системное программное обеспечение : Учебник для вузов / А.В.Гордеев,А.Ю.Молчанов .— М.и др. : Питер, 2003 .— 736с.<6>
Гордеев, А.В. Системное программное обеспечение : Учебник для вузов / А.В.Годеев,А.Ю.Молчанов .— СПб.[и др.] : Питер, 2001 .— 736с.<7>
Агуров, П.В. Интерфейс USB.Практика использования и программирования / П.В.Агуров .— СПб. : БХВ-Петербург, 2005 .— 576с.<5>
Хорев, П.Б. Методы и средства защиты информации в компьютерных системах : учеб.пособие для вузов / П.Б.Хорев .— 3-е изд.,стер. — М. : Академия, 2007 .— 256с.<6>
Хорев, П.Б. Методы и средства защиты информации в компьютерных системах : учеб.пособие для вузов / П.Б.Хорев .— 2-е изд.,стер. — М. : Академия, 2006 .— 256с.<6>
