2 * PROJECT: ReactOS Services
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/applications/mscutils/servman/stop.c
5 * PURPOSE: Stops running a service
6 * COPYRIGHT: Copyright 2006-2009 Ged Murphy <gedmurphy@reactos.org>
14 StopService(PSTOP_INFO pStopInfo
,
17 SERVICE_STATUS_PROCESS ServiceStatus
;
24 dwStartTime
= GetTickCount();
25 dwTimeout
= 30000; // 30 secs
27 hProgDlg
= CreateProgressDialog(pStopInfo
->pInfo
->hMainWnd
,
28 pStopInfo
->pInfo
->pCurrentService
->lpServiceName
,
29 IDS_PROGRESS_INFO_STOP
);
32 IncrementProgressBar(hProgDlg
);
34 if (ControlService(hService
,
36 (LPSERVICE_STATUS
)&ServiceStatus
))
38 while (ServiceStatus
.dwCurrentState
!= SERVICE_STOPPED
)
40 Sleep(ServiceStatus
.dwWaitHint
);
42 if (QueryServiceStatusEx(hService
,
43 SC_STATUS_PROCESS_INFO
,
44 (LPBYTE
)&ServiceStatus
,
45 sizeof(SERVICE_STATUS_PROCESS
),
48 if (GetTickCount() - dwStartTime
> dwTimeout
)
50 /* We exceeded our max wait time, give up */
56 if (ServiceStatus
.dwCurrentState
== SERVICE_STOPPED
)
62 CompleteProgressBar(hProgDlg
);
64 DestroyWindow(hProgDlg
);
71 StopDependentServices(PSTOP_INFO pStopInfo
,
74 LPENUM_SERVICE_STATUS lpDependencies
;
75 SC_HANDLE hDepService
;
79 lpDependencies
= GetServiceDependents(hService
, &dwCount
);
82 LPENUM_SERVICE_STATUS lpEnumServiceStatus
;
85 for (i
= 0; i
< dwCount
; i
++)
87 lpEnumServiceStatus
= &lpDependencies
[i
];
89 hDepService
= OpenService(pStopInfo
->hSCManager
,
90 lpEnumServiceStatus
->lpServiceName
,
91 SERVICE_STOP
| SERVICE_QUERY_STATUS
);
94 bRet
= StopService(pStopInfo
, hDepService
);
96 CloseServiceHandle(hDepService
);
106 HeapFree(GetProcessHeap(),
116 DoStop(PMAIN_WND_INFO pInfo
)
119 SC_HANDLE hSCManager
;
125 stopInfo
.pInfo
= pInfo
;
127 hSCManager
= OpenSCManager(NULL
,
129 SC_MANAGER_ALL_ACCESS
);
132 hService
= OpenService(hSCManager
,
133 pInfo
->pCurrentService
->lpServiceName
,
134 SERVICE_STOP
| SERVICE_QUERY_STATUS
| SERVICE_ENUMERATE_DEPENDENTS
);
137 stopInfo
.hSCManager
= hSCManager
;
138 stopInfo
.hMainService
= hService
;
140 if (HasDependentServices(hService
))
142 INT ret
= DialogBoxParam(hInstance
,
143 MAKEINTRESOURCE(IDD_DLG_DEPEND_STOP
),
145 StopDependsDialogProc
,
149 if (StopDependentServices(&stopInfo
, hService
))
151 bRet
= StopService(&stopInfo
, hService
);
157 bRet
= StopService(&stopInfo
, hService
);
160 CloseServiceHandle(hService
);
163 CloseServiceHandle(hSCManager
);