2 * PROJECT: ReactOS Services
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/applications/mscutils/servman/control.c
5 * PURPOSE: Stops, pauses and resumes a service
6 * COPYRIGHT: Copyright 2006-2007 Ged Murphy <gedmurphy@reactos.org>
13 Control(PMAIN_WND_INFO Info
,
19 SERVICE_STATUS_PROCESS ServiceStatus
;
20 SERVICE_STATUS Status
;
21 DWORD BytesNeeded
= 0;
25 hSCManager
= OpenSCManager(NULL
,
27 SC_MANAGER_ALL_ACCESS
);
28 if (hSCManager
!= NULL
)
30 hSc
= OpenService(hSCManager
,
31 Info
->pCurrentService
->lpServiceName
,
35 if (ControlService(hSc
,
41 if (QueryServiceStatusEx(hSc
,
42 SC_STATUS_PROCESS_INFO
,
43 (LPBYTE
)&ServiceStatus
,
44 sizeof(SERVICE_STATUS_PROCESS
),
47 DWORD dwStartTickCount
= GetTickCount();
48 DWORD dwOldCheckPoint
= ServiceStatus
.dwCheckPoint
;
49 DWORD dwMaxWait
= 2000 * 60; // wait for 2 mins
51 IncrementProgressBar(hProgDlg
);
53 while (ServiceStatus
.dwCurrentState
!= Control
)
55 DWORD dwWaitTime
= ServiceStatus
.dwWaitHint
/ 10;
57 if (!QueryServiceStatusEx(hSc
,
58 SC_STATUS_PROCESS_INFO
,
59 (LPBYTE
)&ServiceStatus
,
60 sizeof(SERVICE_STATUS_PROCESS
),
66 if (ServiceStatus
.dwCheckPoint
> dwOldCheckPoint
)
68 /* The service is making progress, increment the progress bar */
69 IncrementProgressBar(hProgDlg
);
70 dwStartTickCount
= GetTickCount();
71 dwOldCheckPoint
= ServiceStatus
.dwCheckPoint
;
75 if(GetTickCount() >= dwStartTickCount
+ dwMaxWait
)
84 else if (dwWaitTime
> 10000)
92 CloseServiceHandle(hSc
);
95 CloseServiceHandle(hSCManager
);
98 if (ServiceStatus
.dwCurrentState
== Control
)
100 CompleteProgressBar(hProgDlg
);
109 DisplayString(_T("The service failed to start"));
118 BOOL
DoPause(PMAIN_WND_INFO Info
)
123 hProgDlg
= CreateProgressDialog(Info
->hMainWnd
,
124 Info
->pCurrentService
->lpServiceName
,
125 IDS_PROGRESS_INFO_PAUSE
);
130 SERVICE_CONTROL_PAUSE
);
132 DestroyWindow(hProgDlg
);
139 BOOL
DoResume(PMAIN_WND_INFO Info
)
144 hProgDlg
= CreateProgressDialog(Info
->hMainWnd
,
145 Info
->pCurrentService
->lpServiceName
,
146 IDS_PROGRESS_INFO_RESUME
);
151 SERVICE_CONTROL_CONTINUE
);
153 DestroyWindow(hProgDlg
);