[SERVICES]
authorEric Kohl <eric.kohl@reactos.org>
Sun, 27 Nov 2016 20:12:39 +0000 (20:12 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Sun, 27 Nov 2016 20:12:39 +0000 (20:12 +0000)
Delete service registry keys recursively.

svn path=/trunk/; revision=73400

reactos/base/system/services/config.c
reactos/base/system/services/rpcserver.c
reactos/base/system/services/services.h

index 351a2c2..6e37617 100644 (file)
@@ -615,4 +615,62 @@ done:
     return dwError;
 }
 
+
+DWORD
+ScmDeleteServiceKey(
+    _In_ HKEY hServicesKey,
+    _In_ PCWSTR pszServiceName)
+{
+    DWORD dwMaxSubkeyLen, dwMaxValueLen;
+    DWORD dwMaxLen, dwSize;
+    PWSTR pszName = NULL;
+    HKEY hServiceKey;
+    DWORD dwError;
+
+    dwError = RegOpenKeyExW(hServicesKey, pszServiceName, 0, KEY_READ, &hServiceKey);
+    if (dwError != ERROR_SUCCESS)
+        return dwError;
+
+    /* Get maximum length of key and value names */
+    dwError = RegQueryInfoKeyW(hServiceKey, NULL, NULL, NULL, NULL,
+                               &dwMaxSubkeyLen, NULL, NULL, &dwMaxValueLen, NULL, NULL, NULL);
+    if (dwError != ERROR_SUCCESS)
+        goto done;
+
+    dwMaxSubkeyLen++;
+    dwMaxValueLen++;
+    dwMaxLen = max(dwMaxSubkeyLen, dwMaxValueLen);
+
+    /* Allocate the name buffer */
+    pszName = HeapAlloc(GetProcessHeap(), 0, dwMaxLen * sizeof(WCHAR));
+    if (pszName == NULL)
+    {
+        dwError = ERROR_NOT_ENOUGH_MEMORY;
+        goto done;
+    }
+
+    /* Recursively delete all the subkeys */
+    while (TRUE)
+    {
+        dwSize = dwMaxLen;
+        if (RegEnumKeyExW(hServiceKey, 0, pszName, &dwSize,
+                          NULL, NULL, NULL, NULL))
+            break;
+
+        dwError = ScmDeleteServiceKey(hServiceKey, pszName);
+        if (dwError != ERROR_SUCCESS)
+            goto done;
+    }
+
+    dwError = RegDeleteKeyW(hServicesKey, pszServiceName);
+
+done:
+    if (pszName != NULL)
+        HeapFree(GetProcessHeap(), 0, pszName);
+
+    RegCloseKey(hServiceKey);
+
+    return dwError;
+}
+
 /* EOF */
index b43d49a..cfce13b 100644 (file)
@@ -1026,8 +1026,8 @@ DWORD RCloseServiceHandle(
                    it is now safe to delete the service */
 
                 /* Delete the Service Key */
-                dwError = RegDeleteKeyW(hServicesKey,
-                                        lpService->lpServiceName);
+                dwError = ScmDeleteServiceKey(hServicesKey,
+                                              lpService->lpServiceName);
 
                 RegCloseKey(hServicesKey);
 
@@ -1443,7 +1443,7 @@ DWORD RSetServiceObjectSecurity(
 {
     PSERVICE_HANDLE hSvc;
     PSERVICE lpService;
-    ULONG DesiredAccess = 0;
+    ACCESS_MASK DesiredAccess = 0;
     HANDLE hToken = NULL;
     HKEY hServiceKey = NULL;
     BOOL bDatabaseLocked = FALSE;
index 5dc4980..8f4aadb 100644 (file)
@@ -142,6 +142,10 @@ ScmReadSecurityDescriptor(
     _In_ HKEY hServiceKey,
     _Out_ PSECURITY_DESCRIPTOR *ppSecurityDescriptor);
 
+DWORD
+ScmDeleteServiceKey(
+    _In_ HKEY hServicesKey,
+    _In_ PCWSTR pszServiceName);
 
 /* controlset.c */