From e9982e936fad9f01981f23ed6f4c745d46ae95ce Mon Sep 17 00:00:00 2001 From: Ged Murphy Date: Tue, 10 Jul 2007 14:54:30 +0000 Subject: [PATCH] fix SetServiceStatus to now call ScmrSetServiceStatus to set the service data svn path=/trunk/; revision=27566 --- reactos/dll/win32/advapi32/service/scm.c | 117 +++++++++++++-------- reactos/dll/win32/advapi32/service/sctrl.c | 30 +----- 2 files changed, 76 insertions(+), 71 deletions(-) diff --git a/reactos/dll/win32/advapi32/service/scm.c b/reactos/dll/win32/advapi32/service/scm.c index 48e065fa740..8c5ea24bdc9 100644 --- a/reactos/dll/win32/advapi32/service/scm.c +++ b/reactos/dll/win32/advapi32/service/scm.c @@ -1829,6 +1829,69 @@ QueryServiceObjectSecurity(SC_HANDLE hService, return TRUE; } +/********************************************************************** + * SetServiceObjectSecurity + * + * @implemented + */ +BOOL STDCALL +SetServiceObjectSecurity(SC_HANDLE hService, + SECURITY_INFORMATION dwSecurityInformation, + PSECURITY_DESCRIPTOR lpSecurityDescriptor) +{ + PSECURITY_DESCRIPTOR SelfRelativeSD = NULL; + ULONG Length; + NTSTATUS Status; + DWORD dwError; + + Length = 0; + Status = RtlMakeSelfRelativeSD(lpSecurityDescriptor, + SelfRelativeSD, + &Length); + if (Status != STATUS_BUFFER_TOO_SMALL) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + SelfRelativeSD = HeapAlloc(GetProcessHeap(), 0, Length); + if (SelfRelativeSD == NULL) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + + Status = RtlMakeSelfRelativeSD(lpSecurityDescriptor, + SelfRelativeSD, + &Length); + if (!NT_SUCCESS(Status)) + { + HeapFree(GetProcessHeap(), 0, SelfRelativeSD); + SetLastError(RtlNtStatusToDosError(Status)); + return FALSE; + } + + HandleBind(); + + /* Call to services.exe using RPC */ + dwError = ScmrSetServiceObjectSecurity(BindingHandle, + (unsigned int)hService, + dwSecurityInformation, + (unsigned char *)SelfRelativeSD, + Length); + + HeapFree(GetProcessHeap(), 0, SelfRelativeSD); + + if (dwError != ERROR_SUCCESS) + { + DPRINT1("ScmrServiceObjectSecurity() failed (Error %lu)\n", dwError); + SetLastError(dwError); + return FALSE; + } + + return TRUE; +} + /********************************************************************** * QueryServiceStatus @@ -1896,67 +1959,35 @@ QueryServiceStatusEx(SC_HANDLE hService, return TRUE; } - /********************************************************************** - * SetServiceObjectSecurity + * SetServiceStatus * * @implemented */ BOOL STDCALL -SetServiceObjectSecurity(SC_HANDLE hService, - SECURITY_INFORMATION dwSecurityInformation, - PSECURITY_DESCRIPTOR lpSecurityDescriptor) +SetServiceStatus(SERVICE_STATUS_HANDLE hServiceStatus, + LPSERVICE_STATUS lpServiceStatus) { - PSECURITY_DESCRIPTOR SelfRelativeSD = NULL; - ULONG Length; - NTSTATUS Status; DWORD dwError; - Length = 0; - Status = RtlMakeSelfRelativeSD(lpSecurityDescriptor, - SelfRelativeSD, - &Length); - if (Status != STATUS_BUFFER_TOO_SMALL) - { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - - SelfRelativeSD = HeapAlloc(GetProcessHeap(), 0, Length); - if (SelfRelativeSD == NULL) - { - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } - - Status = RtlMakeSelfRelativeSD(lpSecurityDescriptor, - SelfRelativeSD, - &Length); - if (!NT_SUCCESS(Status)) - { - HeapFree(GetProcessHeap(), 0, SelfRelativeSD); - SetLastError(RtlNtStatusToDosError(Status)); - return FALSE; - } + DPRINT("SetServiceStatus() called\n"); + DPRINT("ThreadId %lu, data addr %p called\n", hServiceStatus, lpServiceStatus); HandleBind(); /* Call to services.exe using RPC */ - dwError = ScmrSetServiceObjectSecurity(BindingHandle, - (unsigned int)hService, - dwSecurityInformation, - (unsigned char *)SelfRelativeSD, - Length); - - HeapFree(GetProcessHeap(), 0, SelfRelativeSD); - + dwError = ScmrSetServiceStatus(BindingHandle, + (unsigned long)hServiceStatus, + lpServiceStatus); if (dwError != ERROR_SUCCESS) { - DPRINT1("ScmrServiceObjectSecurity() failed (Error %lu)\n", dwError); + DPRINT1("ScmrSetServiceStatus() failed (Error %lu)\n", dwError); SetLastError(dwError); return FALSE; } + DPRINT("SetServiceStatus() done (ret %lu\n", dwError); + return TRUE; } diff --git a/reactos/dll/win32/advapi32/service/sctrl.c b/reactos/dll/win32/advapi32/service/sctrl.c index 8310a83cd3a..77c532f97e5 100644 --- a/reactos/dll/win32/advapi32/service/sctrl.c +++ b/reactos/dll/win32/advapi32/service/sctrl.c @@ -64,7 +64,7 @@ ScLookupServiceByServiceName(LPCWSTR lpServiceName) return NULL; } - +/* static PACTIVE_SERVICE ScLookupServiceByThreadId(DWORD ThreadId) { @@ -82,7 +82,7 @@ ScLookupServiceByThreadId(DWORD ThreadId) return NULL; } - +*/ static DWORD WINAPI ScServiceMainStub(LPVOID Context) @@ -486,32 +486,6 @@ SetServiceBits(SERVICE_STATUS_HANDLE hServiceStatus, } -/********************************************************************** - * SetServiceStatus - * - * @implemented - */ -BOOL STDCALL -SetServiceStatus(SERVICE_STATUS_HANDLE hServiceStatus, - LPSERVICE_STATUS lpServiceStatus) -{ - PACTIVE_SERVICE Service; - - Service = ScLookupServiceByThreadId((DWORD)hServiceStatus); - if (!Service) - { - SetLastError(ERROR_INVALID_HANDLE); - return FALSE; - } - - RtlCopyMemory(&Service->ServiceStatus, - lpServiceStatus, - sizeof(SERVICE_STATUS)); - - return TRUE; -} - - /********************************************************************** * StartServiceCtrlDispatcherA *