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;
}
Совместное использование объектов ядра приложениями и службами