Lars Martin Hambro <lars_martin4 AT hotmail DOT com>
[reactos.git] / base / applications / sc / control.c
1 /*
2 * PROJECT: ReactOS Services
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/system/sc/control.c
5 * PURPOSE: Stops, pauses and resumes a service
6 * COPYRIGHT: Copyright 2005 - 2006 Ged Murphy <gedmurphy@gmail.com>
7 *
8 */
9
10 #include "sc.h"
11
12 BOOL
13 Control(DWORD Control,
14 LPCTSTR ServiceName,
15 LPCTSTR *Args,
16 INT ArgCount)
17 {
18 SC_HANDLE hSCManager = NULL;
19 SC_HANDLE hSc = NULL;
20 SERVICE_STATUS Status;
21 DWORD dwDesiredAccess = 0;
22
23 #ifdef SCDBG
24 LPCTSTR *TmpArgs = Args;
25 INT TmpCnt = ArgCount;
26 _tprintf(_T("service to control - %s\n"), ServiceName);
27 _tprintf(_T("command - %lu\n"), Control);
28 _tprintf(_T("Arguments:\n"));
29 while (TmpCnt)
30 {
31 _tprintf(_T(" %s\n"), *TmpArgs);
32 TmpArgs++;
33 TmpCnt--;
34 }
35 _tprintf(_T("\n"));
36 #endif /* SCDBG */
37
38 switch (Control)
39 {
40 case SERVICE_CONTROL_STOP:
41 dwDesiredAccess = SERVICE_STOP;
42 break;
43
44 case SERVICE_CONTROL_PAUSE:
45 dwDesiredAccess = SERVICE_PAUSE_CONTINUE;
46 break;
47
48 case SERVICE_CONTROL_CONTINUE:
49 dwDesiredAccess = SERVICE_PAUSE_CONTINUE;
50 break;
51
52 case SERVICE_CONTROL_INTERROGATE:
53 dwDesiredAccess = SERVICE_INTERROGATE;
54 break;
55
56 case SERVICE_CONTROL_SHUTDOWN:
57 dwDesiredAccess = 0;
58 break;
59
60 }
61
62 hSCManager = OpenSCManager(NULL,
63 NULL,
64 SC_MANAGER_CONNECT);
65 if (hSCManager != NULL)
66 {
67 hSc = OpenService(hSCManager,
68 ServiceName,
69 dwDesiredAccess);
70 if (hSc != NULL)
71 {
72 if (ControlService(hSc,
73 Control,
74 &Status))
75 {
76 SERVICE_STATUS_PROCESS StatusEx;
77
78 /* FIXME: lazy hack ;) */
79 CopyMemory(&StatusEx, &Status, sizeof(Status));
80 StatusEx.dwProcessId = 0;
81 StatusEx.dwServiceFlags = 0;
82
83 PrintService(ServiceName,
84 &StatusEx,
85 FALSE);
86
87 CloseServiceHandle(hSc);
88 CloseServiceHandle(hSCManager);
89
90 return TRUE;
91 }
92 }
93 else
94 _tprintf(_T("[SC] OpenService FAILED %lu:\n\n"), GetLastError());
95 }
96
97 ReportLastError();
98 if (hSc) CloseServiceHandle(hSc);
99 if (hSCManager) CloseServiceHandle(hSCManager);
100 return FALSE;
101 }