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/servman/start.c?rev=44963&r1=44962&r2=44963&view=diff
==============================================================================
--- 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 <[email protected]>
+ * COPYRIGHT:   Copyright 2005-2010 Ged Murphy <[email protected]>
  *
  */
 
@@ -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;


Reply via email to