mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 13:45:50 +00:00
implement ScmrSetServiceStatus, this goes some way to being able to manually control services
svn path=/trunk/; revision=27565
This commit is contained in:
parent
31491cefa9
commit
f8ab7f007a
3 changed files with 59 additions and 7 deletions
|
@ -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
|
DWORD
|
||||||
ScmCreateNewServiceRecord(LPWSTR lpServiceName,
|
ScmCreateNewServiceRecord(LPWSTR lpServiceName,
|
||||||
PSERVICE *lpServiceRecord)
|
PSERVICE *lpServiceRecord)
|
||||||
|
@ -542,8 +573,8 @@ ScmControlService(PSERVICE Service,
|
||||||
DPRINT("ScmControlService() called\n");
|
DPRINT("ScmControlService() called\n");
|
||||||
|
|
||||||
ControlPacket = (SCM_CONTROL_PACKET*) HeapAlloc(GetProcessHeap(),
|
ControlPacket = (SCM_CONTROL_PACKET*) HeapAlloc(GetProcessHeap(),
|
||||||
HEAP_ZERO_MEMORY,
|
HEAP_ZERO_MEMORY,
|
||||||
sizeof(SCM_CONTROL_PACKET));
|
sizeof(SCM_CONTROL_PACKET));
|
||||||
if (ControlPacket == NULL)
|
if (ControlPacket == NULL)
|
||||||
return ERROR_NOT_ENOUGH_MEMORY;
|
return ERROR_NOT_ENOUGH_MEMORY;
|
||||||
|
|
||||||
|
@ -597,7 +628,7 @@ ScmSendStartCommand(PSERVICE Service,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
TotalLength++;
|
TotalLength++;
|
||||||
DPRINT("ArgsLength: %ld\nTotalLength: %ld\n\n", ArgsLength, TotalLength);
|
DPRINT("ArgsLength: %ld TotalLength: %ld\n", ArgsLength, TotalLength);
|
||||||
|
|
||||||
/* Allocate a control packet */
|
/* Allocate a control packet */
|
||||||
ControlPacket = (SCM_CONTROL_PACKET*) HeapAlloc(GetProcessHeap(),
|
ControlPacket = (SCM_CONTROL_PACKET*) HeapAlloc(GetProcessHeap(),
|
||||||
|
|
|
@ -700,11 +700,31 @@ ScmrQueryServiceStatus(handle_t BindingHandle,
|
||||||
/* Function 7 */
|
/* Function 7 */
|
||||||
unsigned long
|
unsigned long
|
||||||
ScmrSetServiceStatus(handle_t BindingHandle,
|
ScmrSetServiceStatus(handle_t BindingHandle,
|
||||||
unsigned long hServiceStatus) /* FIXME */
|
unsigned long hServiceStatus,
|
||||||
|
LPSERVICE_STATUS lpServiceStatus)
|
||||||
{
|
{
|
||||||
DPRINT1("ScmrSetServiceStatus() is unimplemented\n");
|
PSERVICE lpService;
|
||||||
/* FIXME */
|
|
||||||
return ERROR_CALL_NOT_IMPLEMENTED;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -102,6 +102,7 @@ DWORD ScmStartService(PSERVICE Service,
|
||||||
PSERVICE ScmGetServiceEntryByName(LPWSTR lpServiceName);
|
PSERVICE ScmGetServiceEntryByName(LPWSTR lpServiceName);
|
||||||
PSERVICE ScmGetServiceEntryByDisplayName(LPWSTR lpDisplayName);
|
PSERVICE ScmGetServiceEntryByDisplayName(LPWSTR lpDisplayName);
|
||||||
PSERVICE ScmGetServiceEntryByResumeCount(DWORD dwResumeCount);
|
PSERVICE ScmGetServiceEntryByResumeCount(DWORD dwResumeCount);
|
||||||
|
PSERVICE ScmGetServiceEntryByThreadId(ULONG ThreadId);
|
||||||
DWORD ScmCreateNewServiceRecord(LPWSTR lpServiceName,
|
DWORD ScmCreateNewServiceRecord(LPWSTR lpServiceName,
|
||||||
PSERVICE *lpServiceRecord);
|
PSERVICE *lpServiceRecord);
|
||||||
DWORD ScmMarkServiceForDelete(PSERVICE pService);
|
DWORD ScmMarkServiceForDelete(PSERVICE pService);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue