implement ScmrSetServiceStatus, this goes some way to being able to manually control services

svn path=/trunk/; revision=27565
This commit is contained in:
Ged Murphy 2007-07-10 14:49:51 +00:00
parent 31491cefa9
commit f8ab7f007a
3 changed files with 59 additions and 7 deletions

View file

@ -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(),

View file

@ -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;
}

View file

@ -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);