Author: gedmurphy
Date: Tue Jan  5 19:08:41 2010
New Revision: 44951
URL: 
http://svn.reactos.org/svn/reactos?rev=44951&view=rev
Log:
- Reimplement service stop routines.
- Stopping single services should now work again, full dependency trees won't yet.
Modified:
    trunk/reactos/base/applications/mscutils/servman/control.c
    trunk/reactos/base/applications/mscutils/servman/precomp.h
    trunk/reactos/base/applications/mscutils/servman/progress.c
    trunk/reactos/base/applications/mscutils/servman/start.c
    trunk/reactos/base/applications/mscutils/servman/stop.c
Modified: trunk/reactos/base/applications/mscutils/servman/control.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mscutils…
==============================================================================
--- trunk/reactos/base/applications/mscutils/servman/control.c [iso-8859-1] (original)
+++ trunk/reactos/base/applications/mscutils/servman/control.c [iso-8859-1] Tue Jan  5
19:08:41 2010
@@ -48,7 +48,7 @@
                     DWORD dwOldCheckPoint = ServiceStatus.dwCheckPoint;
                     DWORD dwMaxWait = 2000 * 60; // wait for 2 mins
-                    IncrementProgressBar(hProgDlg);
+                    IncrementProgressBar(hProgDlg, DEFAULT_STEP);
                     while (ServiceStatus.dwCurrentState != Control)
                     {
@@ -66,7 +66,7 @@
                         if (ServiceStatus.dwCheckPoint > dwOldCheckPoint)
                         {
                             /* The service is making progress, increment the progress bar
*/
-                            IncrementProgressBar(hProgDlg);
+                            IncrementProgressBar(hProgDlg, DEFAULT_STEP);
                             dwStartTickCount = GetTickCount();
                             dwOldCheckPoint = ServiceStatus.dwCheckPoint;
                         }
Modified: trunk/reactos/base/applications/mscutils/servman/precomp.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mscutils…
==============================================================================
--- trunk/reactos/base/applications/mscutils/servman/precomp.h [iso-8859-1] (original)
+++ trunk/reactos/base/applications/mscutils/servman/precomp.h [iso-8859-1] Tue Jan  5
19:08:41 2010
@@ -94,8 +94,10 @@
 BOOL DoResume(PMAIN_WND_INFO Info);
 /* progress.c */
-HWND CreateProgressDialog(HWND hParent, LPTSTR lpServiceName, UINT Event);
-VOID IncrementProgressBar(HWND hProgDlg);
+#define DEFAULT_STEP 0
+HWND CreateProgressDialog(HWND hParent, LPTSTR lpServiceName, UINT LabelId);
+BOOL DestroyProgressDialog(HWND hProgDlg, BOOL bComplete);
+VOID IncrementProgressBar(HWND hProgDlg, UINT NewPos);
 VOID CompleteProgressBar(HWND hProgDlg);
 /* query.c */
Modified: trunk/reactos/base/applications/mscutils/servman/progress.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mscutils…
==============================================================================
--- trunk/reactos/base/applications/mscutils/servman/progress.c [iso-8859-1] (original)
+++ trunk/reactos/base/applications/mscutils/servman/progress.c [iso-8859-1] Tue Jan  5
19:08:41 2010
@@ -18,41 +18,51 @@
     hProgBar = GetDlgItem(hProgDlg,
                           IDC_SERVCON_PROGRESS);
-
     if (hProgBar)
     {
         INT pos = 0;
-        pos = SendMessage(hProgBar,
-                          PBM_GETPOS,
-                          0,
-                          0);
+        pos = SendMessageW(hProgBar,
+                           PBM_GETPOS,
+                           0,
+                           0);
-        for (; pos <= PROGRESSRANGE; pos++)
+        while (pos <= PROGRESSRANGE)
         {
-            SendMessage(hProgBar,
-                        PBM_DELTAPOS,
-                        pos,
-                        0);
+            SendMessageW(hProgBar,
+                         PBM_DELTAPOS,
+                         pos,
+                         0);
             Sleep(15);
+            pos++;
         }
     }
 }
 VOID
-IncrementProgressBar(HWND hProgDlg)
+IncrementProgressBar(HWND hProgDlg,
+                     UINT NewPos)
 {
     HWND hProgBar;
     hProgBar = GetDlgItem(hProgDlg,
                           IDC_SERVCON_PROGRESS);
-
     if (hProgBar)
     {
-        SendMessage(hProgBar,
-                    PBM_STEPIT,
-                    0,
-                    0);
+        if (NewPos == DEFAULT_STEP)
+        {
+            SendMessageW(hProgBar,
+                         PBM_STEPIT,
+                         0,
+                         0);
+        }
+        else
+        {
+            SendMessageW(hProgBar,
+                         PBM_SETPOS,
+                         NewPos,
+                         0);
+        }
     }
 }
@@ -68,18 +78,21 @@
         {
             HWND hProgBar;
-            /* set the progress bar range and step */
+            /* Get a handle to the progress bar */
             hProgBar = GetDlgItem(hDlg,
                                   IDC_SERVCON_PROGRESS);
-            SendMessage(hProgBar,
-                        PBM_SETRANGE,
-                        0,
-                        MAKELPARAM(0, PROGRESSRANGE));
-            SendMessage(hProgBar,
-                        PBM_SETSTEP,
-                        (WPARAM)1,
-                        0);
+            /* Set the progress bar range */
+            SendMessageW(hProgBar,
+                         PBM_SETRANGE,
+                         0,
+                         MAKELPARAM(0, PROGRESSRANGE));
+
+            /* Set the progress bar step */
+            SendMessageW(hProgBar,
+                         PBM_SETSTEP,
+                         (WPARAM)1,
+                         0);
         }
         break;
@@ -98,43 +111,70 @@
     }
     return TRUE;
-
 }
 HWND
 CreateProgressDialog(HWND hParent,
                      LPTSTR lpServiceName,
-                     UINT Event)
+                     UINT LabelId)
 {
     HWND hProgDlg;
-    TCHAR ProgDlgBuf[100];
+    LPWSTR lpProgStr;
     /* open the progress dialog */
-    hProgDlg = CreateDialog(hInstance,
-                            MAKEINTRESOURCE(IDD_DLG_PROGRESS),
-                            hParent,
-                            ProgressDialogProc);
+    hProgDlg = CreateDialogW(hInstance,
+                             MAKEINTRESOURCEW(IDD_DLG_PROGRESS),
+                             hParent,
+                             ProgressDialogProc);
     if (hProgDlg != NULL)
     {
-        /* write the  info to the progress dialog */
-        LoadString(hInstance,
-                   Event,
-                   ProgDlgBuf,
-                   sizeof(ProgDlgBuf) / sizeof(TCHAR));
+        /* Load the label Id */
+        if (AllocAndLoadString(&lpProgStr,
+                               hInstance,
+                               LabelId))
+        {
+            /* Write it to the dialog */
+            SendDlgItemMessageW(hProgDlg,
+                                IDC_SERVCON_INFO,
+                                WM_SETTEXT,
+                                0,
+                                (LPARAM)lpProgStr);
-        SendDlgItemMessage(hProgDlg,
-                           IDC_SERVCON_INFO,
-                           WM_SETTEXT,
-                           0,
-                           (LPARAM)ProgDlgBuf);
+            HeapFree(GetProcessHeap(),
+                     0,
+                     lpProgStr);
+        }
-        /* write the service name to the progress dialog */
-        SendDlgItemMessage(hProgDlg,
-                           IDC_SERVCON_NAME,
-                           WM_SETTEXT,
-                           0,
-                           (LPARAM)lpServiceName);
+        /* Write the service name to the dialog */
+        SendDlgItemMessageW(hProgDlg,
+                            IDC_SERVCON_NAME,
+                            WM_SETTEXT,
+                            0,
+                            (LPARAM)lpServiceName);
     }
     return hProgDlg;
 }
+
+BOOL
+DestroyProgressDialog(HWND hwnd,
+                      BOOL bComplete)
+{
+    BOOL bRet = FALSE;
+
+    if (hwnd)
+    {
+        if (bComplete)
+        {
+            /* Complete the progress bar */
+            CompleteProgressBar(hwnd);
+
+            /* Wait for asthetics */
+            Sleep(500);
+        }
+
+        bRet = DestroyWindow(hwnd);
+    }
+
+    return bRet;
+}
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
19:08:41 2010
@@ -121,7 +121,7 @@
     if (hProgDlg)
     {
-        IncrementProgressBar(hProgDlg);
+        IncrementProgressBar(hProgDlg, DEFAULT_STEP);
         bRet = DoStartService(Info,
                               hProgDlg);
Modified: trunk/reactos/base/applications/mscutils/servman/stop.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mscutils…
==============================================================================
--- trunk/reactos/base/applications/mscutils/servman/stop.c [iso-8859-1] (original)
+++ trunk/reactos/base/applications/mscutils/servman/stop.c [iso-8859-1] Tue Jan  5
19:08:41 2010
@@ -12,60 +12,97 @@
 static BOOL
 StopService(PMAIN_WND_INFO pInfo,
-            LPWSTR lpServiceName)
+            LPWSTR lpServiceName,
+            HWND hProgress OPTIONAL)
 {
-    //SERVICE_STATUS_PROCESS ServiceStatus;
-    //DWORD dwBytesNeeded;
-    //DWORD dwStartTime;
-   // DWORD dwTimeout;
-    //HWND hProgDlg;
+    SC_HANDLE hSCManager;
+    SC_HANDLE hService;
+    SERVICE_STATUS_PROCESS ServiceStatus;
+    DWORD dwBytesNeeded;
+    DWORD dwStartTime;
+    DWORD dwTimeout;
     BOOL bRet = FALSE;
-/*
-    dwStartTime = GetTickCount();
-    dwTimeout = 30000; // 30 secs
-
-    hProgDlg = CreateProgressDialog(pStopInfo->pInfo->hMainWnd,
-
pStopInfo->pInfo->pCurrentService->lpServiceName,
-                                    IDS_PROGRESS_INFO_STOP);
-    if (hProgDlg)
-    {
-        IncrementProgressBar(hProgDlg);
-
-        if (ControlService(hService,
-                           SERVICE_CONTROL_STOP,
-                           (LPSERVICE_STATUS)&ServiceStatus))
-        {
-            while (ServiceStatus.dwCurrentState != SERVICE_STOPPED)
-            {
-                Sleep(ServiceStatus.dwWaitHint);
-
-                if (QueryServiceStatusEx(hService,
-                                         SC_STATUS_PROCESS_INFO,
-                                         (LPBYTE)&ServiceStatus,
-                                         sizeof(SERVICE_STATUS_PROCESS),
-                                         &dwBytesNeeded))
-                {
-                    if (GetTickCount() - dwStartTime > dwTimeout)
+
+    if (hProgress)
+    {
+        /* Increment the progress bar */
+        IncrementProgressBar(hProgress, DEFAULT_STEP);
+    }
+
+    hSCManager = OpenSCManager(NULL,
+                               NULL,
+                               SC_MANAGER_CONNECT);
+    if (hSCManager)
+    {
+        hService = OpenService(hSCManager,
+                               lpServiceName,
+                               SERVICE_STOP | SERVICE_QUERY_STATUS);
+        if (hService)
+        {
+            if (hProgress)
+            {
+                /* Increment the progress bar */
+                IncrementProgressBar(hProgress, DEFAULT_STEP);
+            }
+
+            /* Set the wait time to 30 secs */
+            dwStartTime = GetTickCount();
+            dwTimeout = 30000;
+
+            /* Send the service the stop code */
+            if (ControlService(hService,
+                               SERVICE_CONTROL_STOP,
+                               (LPSERVICE_STATUS)&ServiceStatus))
+            {
+                if (hProgress)
+                {
+                    /* Increment the progress bar */
+                    IncrementProgressBar(hProgress, DEFAULT_STEP);
+                }
+
+                while (ServiceStatus.dwCurrentState != SERVICE_STOPPED)
+                {
+                    Sleep(ServiceStatus.dwWaitHint);
+
+                    if (hProgress)
                     {
-                        We exceeded our max wait time, give up
-                        break;
+                        /* Increment the progress bar */
+                        IncrementProgressBar(hProgress, DEFAULT_STEP);
                     }
-                }
-            }
-
-            if (ServiceStatus.dwCurrentState == SERVICE_STOPPED)
-            {
-                bRet = TRUE;
-            }
-        }
-
-        CompleteProgressBar(hProgDlg);
-        Sleep(500);
-        DestroyWindow(hProgDlg);
+
+                    if (QueryServiceStatusEx(hService,
+                                             SC_STATUS_PROCESS_INFO,
+                                             (LPBYTE)&ServiceStatus,
+                                             sizeof(SERVICE_STATUS_PROCESS),
+                                             &dwBytesNeeded))
+                    {
+                        /* Have we exceeded our wait time? */
+                        if (GetTickCount() - dwStartTime > dwTimeout)
+                        {
+                            /* Yep, give up */
+                            break;
+                        }
+                    }
+                }
+
+                /* If the service is stopped, return TRUE */
+                if (ServiceStatus.dwCurrentState == SERVICE_STOPPED)
+                {
+                    bRet = TRUE;
+                }
+            }
+
+            CloseServiceHandle(hService);
+        }
+
+        CloseServiceHandle(hSCManager);
     }
-*/
+
     return bRet;
 }
+
+
+
 static BOOL
 StopDependantServices(PMAIN_WND_INFO pInfo,
@@ -118,6 +155,7 @@
 BOOL
 DoStop(PMAIN_WND_INFO pInfo)
 {
+    HWND hProgress;
     LPWSTR lpServiceList;
     BOOL bRet = FALSE;
@@ -138,18 +176,24 @@
                                     (LPARAM)lpServiceList) == IDOK)
                 {
                     /* Stop all the dependant services */
-                    if (StopDependantServices(pInfo,
pInfo->pCurrentService->lpServiceName))
-                    {
-                        /* Finally stop the requested service */
-                        bRet = StopService(pInfo,
pInfo->pCurrentService->lpServiceName);
-                    }
-                }
-            }
-        }
-        else
-        {
-            /* No dependants, just stop the service */
-            bRet = StopService(pInfo, pInfo->pCurrentService->lpServiceName);
+                    StopDependantServices(pInfo,
pInfo->pCurrentService->lpServiceName);
+                }
+            }
+        }
+
+        /* Create a progress window to track the progress of the stopping service */
+        hProgress = CreateProgressDialog(pInfo->hMainWnd,
+                                         pInfo->pCurrentService->lpServiceName,
+                                         IDS_PROGRESS_INFO_STOP);
+
+        /* Finally, stop the requested service */
+        bRet = StopService(pInfo,
+                           pInfo->pCurrentService->lpServiceName,
+                           hProgress);
+
+        if (hProgress)
+        {
+            DestroyProgressDialog(hProgress, TRUE);
         }
     }