diff --git a/reactos/base/system/services/config.c b/reactos/base/system/services/config.c index 351a2c2079e..6e376178e81 100644 --- a/reactos/base/system/services/config.c +++ b/reactos/base/system/services/config.c @@ -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 */ diff --git a/reactos/base/system/services/rpcserver.c b/reactos/base/system/services/rpcserver.c index b43d49af796..cfce13b4366 100644 --- a/reactos/base/system/services/rpcserver.c +++ b/reactos/base/system/services/rpcserver.c @@ -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; diff --git a/reactos/base/system/services/services.h b/reactos/base/system/services/services.h index 5dc4980c1d1..8f4aadbfe6c 100644 --- a/reactos/base/system/services/services.h +++ b/reactos/base/system/services/services.h @@ -142,6 +142,10 @@ ScmReadSecurityDescriptor( _In_ HKEY hServiceKey, _Out_ PSECURITY_DESCRIPTOR *ppSecurityDescriptor); +DWORD +ScmDeleteServiceKey( + _In_ HKEY hServicesKey, + _In_ PCWSTR pszServiceName); /* controlset.c */