- Use one instead of two critical sections to synchronize service start and control actions.
- Fail, if an already running service is started again.
svn path=/trunk/; revision=50977
static RTL_RESOURCE DatabaseLock;
static DWORD dwResumeCount = 1;
static RTL_RESOURCE DatabaseLock;
static DWORD dwResumeCount = 1;
-static CRITICAL_SECTION NamedPipeCriticalSection;
-static CRITICAL_SECTION StartServiceCriticalSection;
+static CRITICAL_SECTION ControlServiceCriticalSection;
/* FUNCTIONS *****************************************************************/
/* FUNCTIONS *****************************************************************/
DPRINT("ScmControlService() called\n");
DPRINT("ScmControlService() called\n");
+ EnterCriticalSection(&ControlServiceCriticalSection);
+
TotalLength = wcslen(Service->lpServiceName) + 1;
ControlPacket = (SCM_CONTROL_PACKET*)HeapAlloc(GetProcessHeap(),
TotalLength = wcslen(Service->lpServiceName) + 1;
ControlPacket = (SCM_CONTROL_PACKET*)HeapAlloc(GetProcessHeap(),
ControlPacket->hServiceStatus = (SERVICE_STATUS_HANDLE)Service;
wcscpy(&ControlPacket->szArguments[0], Service->lpServiceName);
ControlPacket->hServiceStatus = (SERVICE_STATUS_HANDLE)Service;
wcscpy(&ControlPacket->szArguments[0], Service->lpServiceName);
- EnterCriticalSection(&NamedPipeCriticalSection);
-
/* Send the control packet */
WriteFile(Service->ControlPipeHandle,
ControlPacket,
/* Send the control packet */
WriteFile(Service->ControlPipeHandle,
ControlPacket,
- LeaveCriticalSection(&NamedPipeCriticalSection);
-
/* Release the contol packet */
HeapFree(GetProcessHeap(),
0,
/* Release the contol packet */
HeapFree(GetProcessHeap(),
0,
dwError = ReplyPacket.dwError;
}
dwError = ReplyPacket.dwError;
}
+ LeaveCriticalSection(&ControlServiceCriticalSection);
+
DPRINT("ScmControlService() done\n");
return dwError;
DPRINT("ScmControlService() done\n");
return dwError;
/* Terminate the argument list */
*Ptr = 0;
/* Terminate the argument list */
*Ptr = 0;
- EnterCriticalSection(&NamedPipeCriticalSection);
-
/* Send the start command */
WriteFile(Service->ControlPipeHandle,
ControlPacket,
/* Send the start command */
WriteFile(Service->ControlPipeHandle,
ControlPacket,
- LeaveCriticalSection(&NamedPipeCriticalSection);
-
/* Release the contol packet */
HeapFree(GetProcessHeap(),
0,
/* Release the contol packet */
HeapFree(GetProcessHeap(),
0,
/* Create '\\.\pipe\net\NtControlPipeXXX' instance */
swprintf(NtControlPipeName, L"\\\\.\\pipe\\net\\NtControlPipe%u", ServiceCurrent);
/* Create '\\.\pipe\net\NtControlPipeXXX' instance */
swprintf(NtControlPipeName, L"\\\\.\\pipe\\net\\NtControlPipe%u", ServiceCurrent);
+
+ DPRINT1("Service: %p ImagePath: %wZ PipeName: %S\n", Service, &ImagePath, NtControlPipeName);
+
Service->ControlPipeHandle = CreateNamedPipeW(NtControlPipeName,
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
Service->ControlPipeHandle = CreateNamedPipeW(NtControlPipeName,
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
PSERVICE_GROUP Group = Service->lpGroup;
DWORD dwError = ERROR_SUCCESS;
PSERVICE_GROUP Group = Service->lpGroup;
DWORD dwError = ERROR_SUCCESS;
- EnterCriticalSection(&StartServiceCriticalSection);
-
DPRINT("ScmStartService() called\n");
DPRINT("ScmStartService() called\n");
+ DPRINT1("Start Service %p (%S)\n", Service, Service->lpServiceName);
+
+ EnterCriticalSection(&ControlServiceCriticalSection);
+
+ if (Service->Status.dwCurrentState != SERVICE_STOPPED)
+ {
+ DPRINT1("Service %S is already running!\n", Service->lpServiceName);
+ LeaveCriticalSection(&ControlServiceCriticalSection);
+ return ERROR_SERVICE_ALREADY_RUNNING;
+ }
+
Service->ControlPipeHandle = INVALID_HANDLE_VALUE;
DPRINT("Service->Type: %lu\n", Service->Status.dwServiceType);
Service->ControlPipeHandle = INVALID_HANDLE_VALUE;
DPRINT("Service->Type: %lu\n", Service->Status.dwServiceType);
+ LeaveCriticalSection(&ControlServiceCriticalSection);
+
DPRINT("ScmStartService() done (Error %lu)\n", dwError);
DPRINT("ScmStartService() done (Error %lu)\n", dwError);
- LeaveCriticalSection(&StartServiceCriticalSection);
if (dwError == ERROR_SUCCESS)
{
if (dwError == ERROR_SUCCESS)
{
VOID
ScmInitNamedPipeCriticalSection(VOID)
{
VOID
ScmInitNamedPipeCriticalSection(VOID)
{
- InitializeCriticalSection(&NamedPipeCriticalSection);
- InitializeCriticalSection(&StartServiceCriticalSection);
+ InitializeCriticalSection(&ControlServiceCriticalSection);
}
VOID
ScmDeleteNamedPipeCriticalSection(VOID)
{
}
VOID
ScmDeleteNamedPipeCriticalSection(VOID)
{
- DeleteCriticalSection(&StartServiceCriticalSection);
- DeleteCriticalSection(&NamedPipeCriticalSection);
+ DeleteCriticalSection(&ControlServiceCriticalSection);