.


:




:

































 

 

 

 





SERVICE_STATUS :

BOOL QueryServiceStatus(SC_HANDLE hService, LPSERVICE_STATUS lpServiceStatus)

:

. 13.1 , SCM , 13.3, . , SCM , , , SCM.

. 13.1. Windows SCM

:

, Administrative Tools, Services (). ServiceShell ( 13.3), JobShell 6 ( 6.3).

13.3. ServiceShell:

/* 13. */

/* ServiceShell.. Windows.

6, , . */

/* :

create

delete

start

control */

#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;

}





:


: 2015-09-20; !; : 441 |


:

:

, , .
==> ...

1569 - | 1474 -


© 2015-2024 lektsii.org - -

: 0.009 .