Author: gedmurphy
Date: Tue Jan 5 22:14:10 2010
New Revision: 44963
URL:
http://svn.reactos.org/svn/reactos?rev=44963&view=rev
Log:
Clean up the start code
Modified:
trunk/reactos/base/applications/mscutils/servman/start.c
Modified: trunk/reactos/base/applications/mscutils/servman/start.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mscutils…
==============================================================================
--- trunk/reactos/base/applications/mscutils/servman/start.c [iso-8859-1] (original)
+++ trunk/reactos/base/applications/mscutils/servman/start.c [iso-8859-1] Tue Jan 5
22:14:10 2010
@@ -3,7 +3,7 @@
* LICENSE: GPL - See COPYING in the top level directory
* FILE: base/applications/mscutils/servman/start.c
* PURPOSE: Start a service
- * COPYRIGHT: Copyright 2005-2009 Ged Murphy <gedmurphy(a)reactos.org>
+ * COPYRIGHT: Copyright 2005-2010 Ged Murphy <gedmurphy(a)reactos.org>
*
*/
@@ -11,7 +11,7 @@
static BOOL
DoStartService(PMAIN_WND_INFO Info,
- HWND hProgDlg)
+ HWND hProgress)
{
SC_HANDLE hSCManager;
SC_HANDLE hService;
@@ -25,72 +25,86 @@
hSCManager = OpenSCManager(NULL,
NULL,
- SC_MANAGER_ALL_ACCESS);
- if (!hSCManager)
+ SC_MANAGER_CONNECT);
+ if (hSCManager)
{
- return FALSE;
- }
+ hService = OpenService(hSCManager,
+ Info->pCurrentService->lpServiceName,
+ SERVICE_START | SERVICE_QUERY_STATUS);
+ if (hService)
+ {
+ if (hProgress)
+ {
+ /* Increment the progress bar */
+ IncrementProgressBar(hProgress, DEFAULT_STEP);
+ }
- hService = OpenService(hSCManager,
- Info->pCurrentService->lpServiceName,
- SERVICE_START | SERVICE_QUERY_STATUS);
- if (hService)
- {
- bRet = StartService(hService,
- 0,
- NULL);
- if (!bRet && GetLastError() == ERROR_SERVICE_ALREADY_RUNNING)
- {
- bRet = TRUE;
- }
- else if (bRet)
- {
- bRet = FALSE;
+ bRet = StartService(hService,
+ 0,
+ NULL);
+ if (!bRet && GetLastError() == ERROR_SERVICE_ALREADY_RUNNING)
+ {
+ /* If it's already running, just return TRUE */
+ bRet = TRUE;
+ }
+ else if (bRet)
+ {
+ bRet = FALSE;
- if (QueryServiceStatusEx(hService,
- SC_STATUS_PROCESS_INFO,
- (LPBYTE)&ServiceStatus,
- sizeof(SERVICE_STATUS_PROCESS),
- &BytesNeeded))
- {
- dwStartTickCount = GetTickCount();
- dwOldCheckPoint = ServiceStatus.dwCheckPoint;
- dwMaxWait = 30000; // 30 secs
+ /* Get the service status to check if it's running */
+ if (QueryServiceStatusEx(hService,
+ SC_STATUS_PROCESS_INFO,
+ (LPBYTE)&ServiceStatus,
+ sizeof(SERVICE_STATUS_PROCESS),
+ &BytesNeeded))
+ {
+ /* We don't want to wait for more than 30 seconds */
+ dwMaxWait = 30000;
+ dwStartTickCount = GetTickCount();
- while (ServiceStatus.dwCurrentState != SERVICE_RUNNING)
- {
- dwWaitTime = ServiceStatus.dwWaitHint / 10;
+ /* Loop until it's running */
+ while (ServiceStatus.dwCurrentState != SERVICE_RUNNING)
+ {
+ dwOldCheckPoint = ServiceStatus.dwCheckPoint;
+ dwWaitTime = ServiceStatus.dwWaitHint / 10;
- if (!QueryServiceStatusEx(hService,
- SC_STATUS_PROCESS_INFO,
- (LPBYTE)&ServiceStatus,
- sizeof(SERVICE_STATUS_PROCESS),
- &BytesNeeded))
- {
- break;
- }
-
- if (ServiceStatus.dwCheckPoint > dwOldCheckPoint)
- {
- /* The service is making progress*/
- dwStartTickCount = GetTickCount();
- dwOldCheckPoint = ServiceStatus.dwCheckPoint;
- }
- else
- {
- if (GetTickCount() >= dwStartTickCount + dwMaxWait)
+ /* Get the latest status info */
+ if (!QueryServiceStatusEx(hService,
+ SC_STATUS_PROCESS_INFO,
+ (LPBYTE)&ServiceStatus,
+ sizeof(SERVICE_STATUS_PROCESS),
+ &BytesNeeded))
{
- /* We exceeded our max wait time, give up */
+ /* Something went wrong... */
break;
}
+
+ /* Is the service making progress? */
+ if (ServiceStatus.dwCheckPoint > dwOldCheckPoint)
+ {
+ /* It is, get the latest tickcount to reset the max wait time
*/
+ dwStartTickCount = GetTickCount();
+ dwOldCheckPoint = ServiceStatus.dwCheckPoint;
+ }
+ else
+ {
+ /* It's not, make sure we haven't exceeded our wait
time */
+ if (GetTickCount() >= dwStartTickCount + dwMaxWait)
+ {
+ /* We have, give up */
+ break;
+ }
+ }
+
+ /* Adjust the wait hint times */
+ if (dwWaitTime < 200)
+ dwWaitTime = 200;
+ else if (dwWaitTime > 10000)
+ dwWaitTime = 10000;
+
+ /* Wait before trying again */
+ Sleep(dwWaitTime);
}
-
- if (dwWaitTime < 200)
- dwWaitTime = 200;
- else if (dwWaitTime > 10000)
- dwWaitTime = 10000;
-
- Sleep(dwWaitTime);
}
if (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
@@ -98,13 +112,12 @@
bRet = TRUE;
}
}
+
+ CloseServiceHandle(hService);
}
- CloseServiceHandle(hService);
+ CloseServiceHandle(hSCManager);
}
-
- CloseServiceHandle(hSCManager);
-
return bRet;
}
@@ -112,31 +125,22 @@
BOOL
DoStart(PMAIN_WND_INFO Info)
{
- HWND hProgDlg;
+ HWND hProgress;
BOOL bRet = FALSE;
- hProgDlg = CreateProgressDialog(Info->hMainWnd,
- IDS_PROGRESS_INFO_START);
+ /* Create a progress window to track the progress of the stopping service */
+ hProgress = CreateProgressDialog(Info->hMainWnd,
+ IDS_PROGRESS_INFO_START);
+ if (hProgress)
+ {
+ /* Set the service name and reset the progress bag */
+ InitializeProgressDialog(hProgress, Info->pCurrentService->lpServiceName);
- if (hProgDlg)
- {
- InitializeProgressDialog(hProgDlg, Info->pCurrentService->lpServiceName);
+ /* Start the requested service */
+ bRet = DoStartService(Info, hProgress);
- bRet = DoStartService(Info,
- hProgDlg);
-
- if (bRet)
- {
- CompleteProgressBar(hProgDlg);
- Sleep(500);
- bRet = TRUE;
- }
- else
- {
- GetError();
- }
-
- DestroyWindow(hProgDlg);
+ /* Complete and destroy the progress bar */
+ DestroyProgressDialog(hProgress, bRet);
}
return bRet;