Чтение онлайн

ЖАНРЫ

Системное программирование в среде Windows

Харт Джонсон М.

Шрифт:

#include "EvryThng.h"

static SC_HANDLE hScm;

static BOOL Debug;

int _tmain(int argc, LPTSTR argv[]) {

 BOOL Exit = FALSE;

 TCHAR Command[MAX_COMMAND_LINE + 10], *pc;

 DWORD i, LocArgc; /* Локальный параметр argc. */

 TCHAR argstr[MAX_ARG][MAX_COMMAND_LINE];

 LPTSTR pArgs[MAX_ARG];

 /*
Подготовить локальный массив "argv" в виде указателей на строки. */

 for (i = 0; i < MAX_ARG; i++) pArgs[i] = argstr[i];

 /* Открыть диспетчер управления службами на локальной машине. */

 hScm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

 /* Главный цикл обработки команд. */

 _tprintf(_T("\nУправление службами Windows Services"));

 while (!Exit) {

_tprintf(_T ("\nSM$"));

_fgetts(Command, MAX_COMMAND_LINE, stdin);

… Как для JobShell …

if (_tcscmp(argstr [0], _T("create")) == 0) {

Create(LocArgc, pArgs, Command);

}

… Аналогичным образом для всех команд …

 }

 CloseServiceHandle(hScm);

 return 0;

}

int Create(int argc, LPTSTR argv[], LPTSTR Command) {

 /* Создание новой службы в виде службы, запускаемой "по требованию":

argv[1]: имя службы

argv[2]: отображаемое имя службы

argv[3]: название исполняемого файла */

 SC_HANDLE hSc;

 TCHAR CurrentDir[MAX_PATH +1], Executable[MAX_PATH + 1];

 hSc = CreateService(hScm, argv[1], argv[2], SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, Executable, NULL, NULL, NULL, NULL, NULL);

 return 0;

}

/* Удаление службы – argv [1]: имя удаляемой службы. */

int Delete(int argc, LPTSTR argv[], LPTSTR Command) {

 SC_HANDLE hSc;

 hSc = OpenService(hScm, argv[1], DELETE);

 DeleteService(hSc); 

 CloseServiceHandle(hSc);

 return 0;

}

/* Запуск именованной службы - argv [1] : имя запускаемой службы. */

int Start(int argc, LPTSTR argv[], LPTSTR Command) {

 SC_HANDLE hSc;

 TCHAR WorkingDir[MAX_PATH + 1];

 LPTSTR pWorkingDir = WorkingDir;

 LPTSTR argvStart[] = {argv[1], WorkingDir};

 GetCurrentDirectory(MAX_PATH + 1, WorkingDir);

 hSc = OpenService(hScm, argv[1], SERVICE_ALL_ACCESS);

 /*
Запустить службу с одним аргументом — именем рабочего каталога. */

 /* Примечание: по умолчанию имя службы совпадает с именем, */

 /* связанным с дескриптором hSc посредством функции OpenService. */

 /* Вместе с тем, функция ServiceMain это не проверяет. */

 StartService(hSc, 2, argvStart);

 CloseServiceHandle(hSc);

 return 0;

}

/* Управление именованной службой.

argv[1]: имя управляемой службы.

argv[2]: управляющая команда: stop (остановка), pause (пауза), resume (возобновление), interrogate (опрос). */

static LPCTSTR Commands[] = {"stop," "pause," "resume," "interrogate," "user"};

static DWORD Controls[] = {

 SERVICE_CONTROL_STOP, SERVICE_CONTROL_PAUSE,

 SERVICE_CONTROL_CONTINUE, SERVICE_CONTROL_INTERROGATE, 128

};

int Control(int argc, LPTSTR argv[], LPTSTR Command) {

 SC_HANDLE hSc;

 SERVICE_STATUS ServiceStatus;

 DWORD dwControl, i;

 BOOL Found = FALSE;

 for (i= 0; i < sizeof(Controls)/sizeof(DWORD) && !Found; i++) Found = (_tcscmp(Commands [i], argv[2]) == 0);

 if (!Found) {

_tprintf(_T("\nНесуществующая команда управления %s"), argv[1]);

return 1;

 }

 dwControl = Controls[i – 1];

 hSc = OpenService(hScm, argv[1], SERVICE_INTERROGATE | SERVICE_PAUSE_CONTINUE | SERVICE_STOP | SERVICE_USER_DEFINED_CONTROL | SERVICE_QUERY_STATUS);

 ControlService(hSc, dwControl, &ServiceStatus); 

 if (dwControl == SERVICE_CONTROL_INTERROGATE) {

QueryServiceStatus (hSc, &ServiceStatus);

printf(_T("Состояние, полученное при помощи QueryServiceStatus\n"));

printf(_T("Состояние службы\n"));

… Вывести всю остальную информацию о состоянии …

 }

 if (hSc != NULL) CloseServiceHandle(hSc);

 return 0;

}
 

Совместное использование объектов ядра приложениями и службами

Возможны ситуации, в которых служба и приложения разделяют объект ядра. Например, служба может использовать именованный мьютекс для защиты разделяемой области памяти, используемой для обмена данными с приложениями. Более того, в нашем примере также будет применяться разделяемый объект ядра, которым в данном случае является отображение файла.

Поделиться с друзьями: