2 * PROJECT: ReactOS Services
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/applications/mscutils/servman/start.c
5 * PURPOSE: Start a service
6 * COPYRIGHT: Copyright 2005-2009 Ged Murphy <gedmurphy@reactos.org>
13 DoStartService(PMAIN_WND_INFO Info
,
18 SERVICE_STATUS_PROCESS ServiceStatus
;
19 DWORD BytesNeeded
= 0;
20 DWORD dwStartTickCount
;
21 DWORD dwOldCheckPoint
;
26 hSCManager
= OpenSCManager(NULL
,
28 SC_MANAGER_ALL_ACCESS
);
34 hService
= OpenService(hSCManager
,
35 Info
->pCurrentService
->lpServiceName
,
36 SERVICE_START
| SERVICE_QUERY_STATUS
);
39 bRet
= StartService(hService
,
42 if (!bRet
&& GetLastError() == ERROR_SERVICE_ALREADY_RUNNING
)
50 if (QueryServiceStatusEx(hService
,
51 SC_STATUS_PROCESS_INFO
,
52 (LPBYTE
)&ServiceStatus
,
53 sizeof(SERVICE_STATUS_PROCESS
),
56 dwStartTickCount
= GetTickCount();
57 dwOldCheckPoint
= ServiceStatus
.dwCheckPoint
;
58 dwMaxWait
= 30000; // 30 secs
60 while (ServiceStatus
.dwCurrentState
!= SERVICE_RUNNING
)
62 dwWaitTime
= ServiceStatus
.dwWaitHint
/ 10;
64 if (!QueryServiceStatusEx(hService
,
65 SC_STATUS_PROCESS_INFO
,
66 (LPBYTE
)&ServiceStatus
,
67 sizeof(SERVICE_STATUS_PROCESS
),
73 if (ServiceStatus
.dwCheckPoint
> dwOldCheckPoint
)
75 /* The service is making progress*/
76 dwStartTickCount
= GetTickCount();
77 dwOldCheckPoint
= ServiceStatus
.dwCheckPoint
;
81 if (GetTickCount() >= dwStartTickCount
+ dwMaxWait
)
83 /* We exceeded our max wait time, give up */
90 else if (dwWaitTime
> 10000)
96 if (ServiceStatus
.dwCurrentState
== SERVICE_RUNNING
)
103 CloseServiceHandle(hService
);
106 CloseServiceHandle(hSCManager
);
113 DoStart(PMAIN_WND_INFO Info
)
118 hProgDlg
= CreateProgressDialog(Info
->hMainWnd
,
119 Info
->pCurrentService
->lpServiceName
,
120 IDS_PROGRESS_INFO_START
);
124 IncrementProgressBar(hProgDlg
);
126 bRet
= DoStartService(Info
,
131 CompleteProgressBar(hProgDlg
);
140 DestroyWindow(hProgDlg
);