[ros-diffs] [gedmurphy] 40802: Rewrite, the last method of getting service dependants and dependent services was flawed/buggy.

gedmurphy at svn.reactos.org gedmurphy at svn.reactos.org
Wed May 6 00:04:20 CEST 2009


Author: gedmurphy
Date: Wed May  6 02:04:19 2009
New Revision: 40802

URL: http://svn.reactos.org/svn/reactos?rev=40802&view=rev
Log:
Rewrite, the last method of getting service dependants and dependent services was flawed/buggy.

Modified:
    trunk/reactos/base/applications/mscutils/servman/dependencies.c
    trunk/reactos/base/applications/mscutils/servman/precomp.h
    trunk/reactos/base/applications/mscutils/servman/propsheet_depends.c
    trunk/reactos/base/applications/mscutils/servman/stop.c

Modified: trunk/reactos/base/applications/mscutils/servman/dependencies.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mscutils/servman/dependencies.c?rev=40802&r1=40801&r2=40802&view=diff
==============================================================================
--- trunk/reactos/base/applications/mscutils/servman/dependencies.c [iso-8859-1] (original)
+++ trunk/reactos/base/applications/mscutils/servman/dependencies.c [iso-8859-1] Wed May  6 02:04:19 2009
@@ -9,8 +9,78 @@
 
 #include "precomp.h"
 
+
+/*
+ * Services which depend on the given service.
+ * The return components depend on this service
+ */
+LPTSTR
+GetDependentServices(SC_HANDLE hService)
+{
+    LPQUERY_SERVICE_CONFIG lpServiceConfig;
+    LPTSTR lpStr = NULL;
+    DWORD bytesNeeded;
+    DWORD bytes;
+
+    if (!QueryServiceConfig(hService,
+                            NULL,
+                            0,
+                            &bytesNeeded) &&
+        GetLastError() == ERROR_INSUFFICIENT_BUFFER)
+    {
+        lpServiceConfig = HeapAlloc(ProcessHeap,
+                                    0,
+                                    bytesNeeded);
+        if (lpServiceConfig)
+        {
+            if (QueryServiceConfig(hService,
+                                   lpServiceConfig,
+                                   bytesNeeded,
+                                   &bytesNeeded))
+            {
+                if (lpServiceConfig)
+                {
+                    lpStr = lpServiceConfig->lpDependencies;
+                    bytes = 0;
+
+                    while (TRUE)
+                    {
+                        bytes++;
+
+                        if (!*lpStr && !*(lpStr + 1))
+                        {
+                            bytes++;
+                            break;
+                        }
+
+                        lpStr++;
+                    }
+
+                    bytes *= sizeof(TCHAR);
+                    lpStr = HeapAlloc(ProcessHeap,
+                                      0,
+                                      bytes);
+                    if (lpStr)
+                    {
+                        CopyMemory(lpStr,
+                                   lpServiceConfig->lpDependencies,
+                                   bytes);
+                    }
+                }
+            }
+        }
+    }
+
+    return lpStr;
+}
+
+
+/*
+ * Services which the given service depends on (1st treeview)
+ * The service depends on the return components 
+ */
 LPENUM_SERVICE_STATUS
-GetDependentServices(SC_HANDLE hService,
+GetServiceDependents(SC_HANDLE hService,
                      LPDWORD lpdwCount)
 {
     LPENUM_SERVICE_STATUS lpDependencies;
@@ -150,7 +220,7 @@
         }
 
         /* Get the list of dependencies */
-        lpDependencies = GetDependentServices(pStopInfo->hMainService, &dwCount);
+        lpDependencies = GetServiceDependents(pStopInfo->hMainService, &dwCount);
         if (lpDependencies)
         {
             LPENUM_SERVICE_STATUS lpEnumServiceStatus;

Modified: trunk/reactos/base/applications/mscutils/servman/precomp.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mscutils/servman/precomp.h?rev=40802&r1=40801&r2=40802&view=diff
==============================================================================
--- trunk/reactos/base/applications/mscutils/servman/precomp.h [iso-8859-1] (original)
+++ trunk/reactos/base/applications/mscutils/servman/precomp.h [iso-8859-1] Wed May  6 02:04:19 2009
@@ -106,9 +106,10 @@
 BOOL GetServiceList(PMAIN_WND_INFO Info, DWORD *NumServices);
 
 /* dependencies */
-LPENUM_SERVICE_STATUS GetDependentServices(SC_HANDLE hService, LPDWORD lpdwCount);
+LPENUM_SERVICE_STATUS GetServiceDependents(SC_HANDLE hService, LPDWORD lpdwCount);
 BOOL HasDependentServices(SC_HANDLE hService);
 INT_PTR CALLBACK StopDependsDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
+LPTSTR GetDependentServices(SC_HANDLE hService);
 
 /* propsheet.c */
 typedef struct _SERVICEPROPSHEET

Modified: trunk/reactos/base/applications/mscutils/servman/propsheet_depends.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mscutils/servman/propsheet_depends.c?rev=40802&r1=40801&r2=40802&view=diff
==============================================================================
--- trunk/reactos/base/applications/mscutils/servman/propsheet_depends.c [iso-8859-1] (original)
+++ trunk/reactos/base/applications/mscutils/servman/propsheet_depends.c [iso-8859-1] Wed May  6 02:04:19 2009
@@ -61,7 +61,6 @@
     LPQUERY_SERVICE_CONFIG lpServiceConfig;
     SC_HANDLE hService;
     HTREEITEM hChild;
-    DWORD bytesNeeded;
     LPTSTR lpStr;
     LPTSTR lpNoDepends;
 
@@ -71,75 +70,54 @@
     if (hService)
     {
 
-        if (!QueryServiceConfig(hService,
-                                NULL,
-                                0,
-                                &bytesNeeded) &&
-            GetLastError() == ERROR_INSUFFICIENT_BUFFER)
-        {
-            lpServiceConfig = HeapAlloc(ProcessHeap,
-                                        0,
-                                        bytesNeeded);
-            if (lpServiceConfig)
-            {
-                if (QueryServiceConfig(hService,
-                                       lpServiceConfig,
-                                       bytesNeeded,
-                                       &bytesNeeded))
+        lpStr = GetDependentServices(hService);
+        if (lpStr)
+        {
+            while (*lpStr)
+            {
+                hChild = AddItemToTreeView(hTreeView,
+                                           hParent,
+                                           lpServiceConfig->lpDisplayName,
+                                           lpServiceConfig->dwServiceType);
+
+
+                AddServiceDependency(dlgInfo,
+                                     hTreeView,
+                                     hSCManager,
+                                     lpStr,
+                                     hChild,
+                                     hwndDlg);
+
+                while (*lpStr++)
+                    ;
+            }
+        }
+        else
+        {
+            if (TreeView_GetCount(hTreeView) == 0)
+            {
+                if (AllocAndLoadString(&lpNoDepends, hInstance, IDS_NO_DEPENDS))
                 {
-                    if (lpServiceConfig)
-                    {
-                        lpStr = lpServiceConfig->lpDependencies;
-
-                        if (*lpStr)
-                        {
-                            while (*lpStr)
-                            {
-                                hChild = AddItemToTreeView(hTreeView,
-                                                           hParent,
-                                                           lpServiceConfig->lpDisplayName,
-                                                           lpServiceConfig->dwServiceType);
-
-                                AddServiceDependency(dlgInfo,
-                                                     hTreeView,
-                                                     hSCManager,
-                                                     lpStr,
-                                                     hChild,
-                                                     hwndDlg);
-
-                                while (*lpStr++)
-                                    ;
-                            }
-                        }
-                        else
-                        {
-                            if (TreeView_GetCount(hTreeView) == 0)
-                            {
-                                if (AllocAndLoadString(&lpNoDepends, hInstance, IDS_NO_DEPENDS))
-                                {
-                                    lpStr = lpNoDepends;
-                                }
-
-                                AddItemToTreeView(hTreeView,
-                                                  hParent,
-                                                  lpStr,
-                                                  0);
-
-                                HeapFree(ProcessHeap,
-                                         0,
-                                         lpNoDepends);
-
-                                EnableWindow(hTreeView, FALSE);
-                            }
-                        }
-                    }
+                    lpStr = lpNoDepends;
                 }
+
+                AddItemToTreeView(hTreeView,
+                                  hParent,
+                                  lpStr,
+                                  0);
 
                 HeapFree(ProcessHeap,
                          0,
-                         lpServiceConfig);
-            }
-        }
+                         lpNoDepends);
+
+                EnableWindow(hTreeView, FALSE);
+            }
+        }
+
+
+        HeapFree(ProcessHeap,
+                 0,
+                 lpStr);
 
         CloseServiceHandle(hService);
     }
@@ -147,68 +125,95 @@
 }
 
 static VOID
-AddServiceDependent(PSERVICEPROPSHEET dlgInfo,
-                    HWND hTreeView,
+AddServiceDependent(HWND hTreeView,
+                    HTREEITEM hParent,
                     SC_HANDLE hSCManager,
                     LPTSTR lpServiceName,
-                    HTREEITEM hParent,
-                    HWND hwndDlg)
+                    LPTSTR lpDisplayName,
+                    DWORD dwServiceType)
 {
     LPENUM_SERVICE_STATUS lpServiceStatus;
-    SC_HANDLE hService;
-    HTREEITEM hChild;
-    LPTSTR lpNoDepends;
+    SC_HANDLE hChildService;
+    HTREEITEM hChildNode;
     DWORD count;
     INT i;
 
-    hService = OpenService(hSCManager,
-                           lpServiceName,
-                           SERVICE_QUERY_STATUS | SERVICE_ENUMERATE_DEPENDENTS);
-    if (hService)
-    {
-        lpServiceStatus = GetDependentServices(hService, &count);
+
+    hChildNode = AddItemToTreeView(hTreeView,
+                                   hParent,
+                                   lpDisplayName,
+                                   dwServiceType);
+
+    hChildService = OpenService(hSCManager,
+                                lpServiceName,
+                                SERVICE_QUERY_STATUS | SERVICE_ENUMERATE_DEPENDENTS);
+    if (hChildService)
+    {
+        lpServiceStatus = GetServiceDependents(hChildService, &count);
         if (lpServiceStatus)
         {
             for (i = 0; i < count; i++)
             {
-                hChild = AddItemToTreeView(hTreeView,
-                                           hParent,
-                                           lpServiceStatus[i].lpDisplayName,
-                                           SERVICE_WIN32);
-
-                AddServiceDependent(dlgInfo,
-                                    hTreeView,
+                AddServiceDependent(hTreeView,
+                                    hChildNode,
                                     hSCManager,
                                     lpServiceStatus[i].lpServiceName,
-                                    hChild,
-                                    hwndDlg);
+                                    lpServiceStatus[i].lpDisplayName,
+                                    lpServiceStatus[i].ServiceStatus.dwServiceType);
             }
 
             HeapFree(ProcessHeap,
                      0,
                      lpServiceStatus);
         }
-        else
-        {
-            if (TreeView_GetCount(hTreeView) == 0)
-            {
-                AllocAndLoadString(&lpNoDepends, hInstance, IDS_NO_DEPENDS);
-
-                AddItemToTreeView(hTreeView,
-                                  hParent,
-                                  lpNoDepends,
-                                  0);
-
-                HeapFree(ProcessHeap,
-                         0,
-                         lpNoDepends);
-
-                EnableWindow(hTreeView, FALSE);
-            }
-        }
-    }
-}
-
+
+        CloseServiceHandle(hChildService);
+    }
+}
+
+static VOID
+SetServiceDependents(HWND hTreeView,
+                     SC_HANDLE hSCManager,
+                     SC_HANDLE hService)
+{
+    LPENUM_SERVICE_STATUS lpServiceStatus;
+    LPTSTR lpNoDepends;
+    DWORD count, i;
+
+    lpServiceStatus = GetServiceDependents(hService, &count);
+    if (lpServiceStatus)
+    {
+        for (i = 0; i < count; i++)
+        {
+            AddServiceDependent(hTreeView,
+                                NULL,
+                                hSCManager,
+                                lpServiceStatus[i].lpServiceName,
+                                lpServiceStatus[i].lpDisplayName,
+                                lpServiceStatus[i].ServiceStatus.dwServiceType);
+        }
+    }
+    else
+    {
+            AllocAndLoadString(&lpNoDepends, hInstance, IDS_NO_DEPENDS);
+
+            AddItemToTreeView(hTreeView,
+                              NULL,
+                              lpNoDepends,
+                              0);
+
+            HeapFree(ProcessHeap,
+                     0,
+                     lpNoDepends);
+
+            EnableWindow(hTreeView, FALSE);
+    }
+}
+
+static VOID
+SetDependentServices(SC_HANDLE hService)
+{
+}
 
 static VOID
 InitDependPage(PSERVICEPROPSHEET dlgInfo,
@@ -216,6 +221,7 @@
 {
     HWND hTreeView1, hTreeView2;
     SC_HANDLE hSCManager;
+    SC_HANDLE hService;
 
     dlgInfo->hDependsImageList = InitImageList(IDI_NODEPENDS,
                                                IDI_DRIVER,
@@ -245,19 +251,21 @@
                                SC_MANAGER_ALL_ACCESS);
     if (hSCManager)
     {
-        AddServiceDependency(dlgInfo,
-                             hTreeView1,
-                             hSCManager,
-                             dlgInfo->pService->lpServiceName,
-                             NULL,
-                             hwndDlg);
-
-        AddServiceDependent(dlgInfo,
-                            hTreeView2,
-                            hSCManager,
-                            dlgInfo->pService->lpServiceName,
-                            NULL,
-                            hwndDlg);
+        hService = OpenService(hSCManager,
+                               dlgInfo->pService->lpServiceName,
+                               SERVICE_QUERY_STATUS | SERVICE_ENUMERATE_DEPENDENTS | SERVICE_QUERY_CONFIG);
+        if (hService)
+        {
+            /* Set the first tree view */
+            SetServiceDependents(hTreeView1,
+                                 hSCManager,
+                                 hService);
+
+            /* Set the second tree view */
+            SetDependentServices(hService);
+
+            CloseServiceHandle(hService);
+        }
 
         CloseServiceHandle(hSCManager);
     }

Modified: trunk/reactos/base/applications/mscutils/servman/stop.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mscutils/servman/stop.c?rev=40802&r1=40801&r2=40802&view=diff
==============================================================================
--- trunk/reactos/base/applications/mscutils/servman/stop.c [iso-8859-1] (original)
+++ trunk/reactos/base/applications/mscutils/servman/stop.c [iso-8859-1] Wed May  6 02:04:19 2009
@@ -76,7 +76,7 @@
     DWORD dwCount;
     BOOL bRet = FALSE;
 
-    lpDependencies = GetDependentServices(hService, &dwCount);
+    lpDependencies = GetServiceDependents(hService, &dwCount);
     if (lpDependencies)
     {
         LPENUM_SERVICE_STATUS lpEnumServiceStatus;



More information about the Ros-diffs mailing list