Author: ekohl Date: Sat Jun 11 09:41:05 2016 New Revision: 71611 URL: http://svn.reactos.org/svn/reactos?rev=71611&view=rev Log: [SERVICES] - Read the service security descriptors when the service list is created. - Assign and write the default security descriptor when a service does not have its own security desciptor. - Delete a service security desciptor when the service is deleted.
Modified: trunk/reactos/base/system/services/config.c trunk/reactos/base/system/services/database.c trunk/reactos/base/system/services/services.h Modified: trunk/reactos/base/system/services/config.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/services/config.c?rev=71611&r1=71610&r2=71611&view=diff ============================================================================== --- trunk/reactos/base/system/services/config.c [iso-8859-1] (original) +++ trunk/reactos/base/system/services/config.c [iso-8859-1] Sat Jun 11 09:41:05 2016 @@ -586,10 +586,17 @@ _Out_ PSECURITY_DESCRIPTOR *ppSecurityDescriptor) { PSECURITY_DESCRIPTOR pRelativeSD = NULL; + PSECURITY_DESCRIPTOR pResizedBuffer = NULL; HKEY hSecurityKey = NULL; DWORD dwBufferLength = 0; + DWORD dwAbsoluteSDSize = 0; DWORD dwType; DWORD dwError; + NTSTATUS Status; + + DPRINT("ScmReadSecurityDescriptor()\n"); + + *ppSecurityDescriptor = NULL; dwError = RegOpenKeyExW(hServiceKey, L"Security", @@ -598,7 +605,11 @@ &hSecurityKey); if (dwError != ERROR_SUCCESS) { -DPRINT1("\n"); + DPRINT("RegOpenKeyExW() failed (Error %lu)\n", dwError); + + /* Do not fail if the Security key does not exist */ + if (dwError == ERROR_FILE_NOT_FOUND) + dwError = ERROR_SUCCESS; goto done; } @@ -610,19 +621,24 @@ &dwBufferLength); if (dwError != ERROR_SUCCESS) { -DPRINT1("\n"); + DPRINT("RegQueryValueExW() failed (Error %lu)\n", dwError); + + /* Do not fail if the Security value does not exist */ + if (dwError == ERROR_FILE_NOT_FOUND) + dwError = ERROR_SUCCESS; goto done; } + DPRINT("dwBufferLength: %lu\n", dwBufferLength); pRelativeSD = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, dwBufferLength); if (pRelativeSD == NULL) { -DPRINT1("\n"); return ERROR_OUTOFMEMORY; } + DPRINT("pRelativeSD: %lu\n", pRelativeSD); dwError = RegQueryValueExW(hSecurityKey, L"Security", 0, @@ -631,20 +647,48 @@ &dwBufferLength); if (dwError != ERROR_SUCCESS) { -DPRINT1("\n"); goto done; } - + Status = RtlSelfRelativeToAbsoluteSD2(pRelativeSD, + &dwAbsoluteSDSize); + if (Status == STATUS_BUFFER_TOO_SMALL) + { + pResizedBuffer = RtlReAllocateHeap(RtlGetProcessHeap(), + 0, + pRelativeSD, + dwAbsoluteSDSize); + if (pResizedBuffer == NULL) + { + dwError = ERROR_OUTOFMEMORY; + goto done; + } + + pRelativeSD = pResizedBuffer; + Status = RtlSelfRelativeToAbsoluteSD2(pRelativeSD, + &dwAbsoluteSDSize); + if (!NT_SUCCESS(Status)) + { + dwError = RtlNtStatusToDosError(Status); + goto done; + } + } + else if (!NT_SUCCESS(Status)) + { + + dwError = RtlNtStatusToDosError(Status); + goto done; + } + + *ppSecurityDescriptor = pRelativeSD; done: - if (pRelativeSD != NULL) + if (dwError != ERROR_SUCCESS && pRelativeSD != NULL) RtlFreeHeap(RtlGetProcessHeap(), 0, pRelativeSD); if (hSecurityKey != NULL) RegCloseKey(hSecurityKey); - return dwError; } Modified: trunk/reactos/base/system/services/database.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/services/database.c?rev=71611&r1=71610&r2=71611&view=diff ============================================================================== --- trunk/reactos/base/system/services/database.c [iso-8859-1] (original) +++ trunk/reactos/base/system/services/database.c [iso-8859-1] Sat Jun 11 09:41:05 2016 @@ -554,8 +554,10 @@ /* Decrement the group reference counter */ ScmSetServiceGroup(lpService, NULL); - /* FIXME: SecurityDescriptor */ - + /* Release the SecurityDescriptor */ + if ((lpService->pSecurityDescriptor != NULL) && + (lpService->pSecurityDescriptor != pDefaultServiceSD)) + HeapFree(GetProcessHeap(), 0, lpService->pSecurityDescriptor); /* Remove the Service from the List */ RemoveEntryList(&lpService->ServiceListEntry); @@ -693,7 +695,27 @@ if (ScmIsDeleteFlagSet(hServiceKey)) lpService->bDeleted = TRUE; -done:; + if (lpService->Status.dwServiceType & SERVICE_WIN32) + { + dwError = ScmReadSecurityDescriptor(hServiceKey, + &lpService->pSecurityDescriptor); + if (dwError != ERROR_SUCCESS) + goto done; + + /* Assing the default security descriptor if the security descriptor cannot be read */ + if (lpService->pSecurityDescriptor == NULL) + { + DPRINT("No security descriptor found! Assign default security descriptor!\n"); + lpService->pSecurityDescriptor = pDefaultServiceSD; + + dwError = ScmWriteSecurityDescriptor(hServiceKey, + lpService->pSecurityDescriptor); + if (dwError != ERROR_SUCCESS) + goto done; + } + } + +done: if (lpGroup != NULL) HeapFree(GetProcessHeap(), 0, lpGroup); Modified: trunk/reactos/base/system/services/services.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/services/services.h?rev=71611&r1=71610&r2=71611&view=diff ============================================================================== --- trunk/reactos/base/system/services/services.h [iso-8859-1] (original) +++ trunk/reactos/base/system/services/services.h [iso-8859-1] Sat Jun 11 09:41:05 2016 @@ -139,6 +139,11 @@ _In_ HKEY hServiceKey, _In_ PSECURITY_DESCRIPTOR pSecurityDescriptor); +DWORD +ScmReadSecurityDescriptor( + _In_ HKEY hServiceKey, + _Out_ PSECURITY_DESCRIPTOR *ppSecurityDescriptor); + /* controlset.c */