[SERVICES]
authorEric Kohl <eric.kohl@reactos.org>
Sun, 27 Mar 2011 13:12:12 +0000 (13:12 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Sun, 27 Mar 2011 13:12:12 +0000 (13:12 +0000)
ScmWriteDependencies:
- Fixed an off-by-one bug. This bug caused a wrong calculation of the 'DependOnGroup' value data length. Group dependencies were not written properly to the registry.

- Write 'DependOnService' and 'DependOnService' values to the registry only if the dependency strings are not empty. Delete a value if the corresponding dependency string is empty.

This fixes another winetest.

svn path=/trunk/; revision=51172

reactos/base/system/services/config.c

index b056af5..bcde1d4 100644 (file)
@@ -125,7 +125,7 @@ ScmWriteDependencies(HKEY hServiceKey,
         lpDst = lpGroupDeps;
         while (*lpSrc != 0)
         {
-            dwLength = wcslen(lpSrc);
+            dwLength = wcslen(lpSrc) + 1;
             if (*lpSrc == SC_GROUP_IDENTIFIERW)
             {
                 lpSrc++;
@@ -157,21 +157,37 @@ ScmWriteDependencies(HKEY hServiceKey,
         *lpDst = 0;
         dwServiceLength++;
 
-        dwError = RegSetValueExW(hServiceKey,
-                                 L"DependOnGroup",
-                                 0,
-                                 REG_MULTI_SZ,
-                                 (LPBYTE)lpGroupDeps,
-                                 dwGroupLength * sizeof(WCHAR));
-
-        if (dwError == ERROR_SUCCESS)
+        if (dwGroupLength > 1)
         {
             dwError = RegSetValueExW(hServiceKey,
-                                     L"DependOnService",
+                                     L"DependOnGroup",
                                      0,
                                      REG_MULTI_SZ,
-                                     (LPBYTE)lpServiceDeps,
-                                     dwServiceLength * sizeof(WCHAR));
+                                     (LPBYTE)lpGroupDeps,
+                                     dwGroupLength * sizeof(WCHAR));
+        }
+        else
+        {
+            RegDeleteValueW(hServiceKey,
+                            L"DependOnGroup");
+        }
+
+        if (dwError == ERROR_SUCCESS)
+        {
+            if (dwServiceLength > 1)
+            {
+                dwError = RegSetValueExW(hServiceKey,
+                                         L"DependOnService",
+                                         0,
+                                         REG_MULTI_SZ,
+                                         (LPBYTE)lpServiceDeps,
+                                         dwServiceLength * sizeof(WCHAR));
+            }
+            else
+            {
+                RegDeleteValueW(hServiceKey,
+                                L"DependOnService");
+            }
         }
 
         HeapFree(GetProcessHeap(), 0, lpGroupDeps);