diff --git a/reactos/base/system/services/database.c b/reactos/base/system/services/database.c index c3e516cd314..140c10ce75d 100644 --- a/reactos/base/system/services/database.c +++ b/reactos/base/system/services/database.c @@ -128,6 +128,37 @@ ScmGetServiceEntryByResumeCount(DWORD dwResumeCount) } +PSERVICE +ScmGetServiceEntryByThreadId(ULONG ThreadId) +{ + PLIST_ENTRY ServiceEntry; + PSERVICE CurrentService; + + DPRINT("ScmGetServiceEntryByThreadId() called\n"); + DPRINT("Finding ThreadId %lu\n", ThreadId); + + ServiceEntry = ServiceListHead.Flink; + while (ServiceEntry != &ServiceListHead) + { + CurrentService = CONTAINING_RECORD(ServiceEntry, + SERVICE, + ServiceListEntry); + DPRINT("Found threadId %lu\n", CurrentService->ThreadId); + if (CurrentService->ThreadId == ThreadId) + { + DPRINT("Found service: '%S'\n", CurrentService->lpDisplayName); + return CurrentService; + } + + ServiceEntry = ServiceEntry->Flink; + } + + DPRINT("Couldn't find a matching service\n"); + + return NULL; +} + + DWORD ScmCreateNewServiceRecord(LPWSTR lpServiceName, PSERVICE *lpServiceRecord) @@ -542,8 +573,8 @@ ScmControlService(PSERVICE Service, DPRINT("ScmControlService() called\n"); ControlPacket = (SCM_CONTROL_PACKET*) HeapAlloc(GetProcessHeap(), - HEAP_ZERO_MEMORY, - sizeof(SCM_CONTROL_PACKET)); + HEAP_ZERO_MEMORY, + sizeof(SCM_CONTROL_PACKET)); if (ControlPacket == NULL) return ERROR_NOT_ENOUGH_MEMORY; @@ -597,7 +628,7 @@ ScmSendStartCommand(PSERVICE Service, } } TotalLength++; - DPRINT("ArgsLength: %ld\nTotalLength: %ld\n\n", ArgsLength, TotalLength); + DPRINT("ArgsLength: %ld TotalLength: %ld\n", ArgsLength, TotalLength); /* Allocate a control packet */ ControlPacket = (SCM_CONTROL_PACKET*) HeapAlloc(GetProcessHeap(), diff --git a/reactos/base/system/services/rpcserver.c b/reactos/base/system/services/rpcserver.c index d83dfe3016e..ef82f0b0834 100644 --- a/reactos/base/system/services/rpcserver.c +++ b/reactos/base/system/services/rpcserver.c @@ -700,11 +700,31 @@ ScmrQueryServiceStatus(handle_t BindingHandle, /* Function 7 */ unsigned long ScmrSetServiceStatus(handle_t BindingHandle, - unsigned long hServiceStatus) /* FIXME */ + unsigned long hServiceStatus, + LPSERVICE_STATUS lpServiceStatus) { - DPRINT1("ScmrSetServiceStatus() is unimplemented\n"); - /* FIXME */ - return ERROR_CALL_NOT_IMPLEMENTED; + PSERVICE lpService; + + DPRINT("ScmrSetServiceStatus() called\n"); + + if (ScmShutdown) + return ERROR_SHUTDOWN_IN_PROGRESS; + + lpService = ScmGetServiceEntryByThreadId((ULONG)hServiceStatus); + if (lpService == NULL) + { + DPRINT1("lpService == NULL!\n"); + return ERROR_INVALID_HANDLE; + } + + RtlCopyMemory(&lpService->Status, + lpServiceStatus, + sizeof(SERVICE_STATUS)); + + DPRINT("Set %S to %lu\n", lpService->lpDisplayName, lpService->Status.dwCurrentState); + DPRINT("ScmrSetServiceStatus() done\n"); + + return ERROR_SUCCESS; } diff --git a/reactos/base/system/services/services.h b/reactos/base/system/services/services.h index 2ef9b3473a2..f823a7816aa 100644 --- a/reactos/base/system/services/services.h +++ b/reactos/base/system/services/services.h @@ -102,6 +102,7 @@ DWORD ScmStartService(PSERVICE Service, PSERVICE ScmGetServiceEntryByName(LPWSTR lpServiceName); PSERVICE ScmGetServiceEntryByDisplayName(LPWSTR lpDisplayName); PSERVICE ScmGetServiceEntryByResumeCount(DWORD dwResumeCount); +PSERVICE ScmGetServiceEntryByThreadId(ULONG ThreadId); DWORD ScmCreateNewServiceRecord(LPWSTR lpServiceName, PSERVICE *lpServiceRecord); DWORD ScmMarkServiceForDelete(PSERVICE pService);