static RTL_RESOURCE DatabaseLock;
static DWORD dwResumeCount = 1;
+static CRITICAL_SECTION NamedPipeCriticalSection;
+static CRITICAL_SECTION StartServiceCriticalSection;
/* FUNCTIONS *****************************************************************/
ControlPacket->hServiceStatus = (SERVICE_STATUS_HANDLE)Service;
wcscpy(&ControlPacket->szArguments[0], Service->lpServiceName);
+ EnterCriticalSection(&NamedPipeCriticalSection);
+
/* Send the control packet */
WriteFile(Service->ControlPipeHandle,
ControlPacket,
&dwReadCount,
NULL);
+ LeaveCriticalSection(&NamedPipeCriticalSection);
+
/* Release the contol packet */
HeapFree(GetProcessHeap(),
0,
/* Terminate the argument list */
*Ptr = 0;
+ EnterCriticalSection(&NamedPipeCriticalSection);
+
/* Send the start command */
WriteFile(Service->ControlPipeHandle,
ControlPacket,
&dwReadCount,
NULL);
+ LeaveCriticalSection(&NamedPipeCriticalSection);
+
/* Release the contol packet */
HeapFree(GetProcessHeap(),
0,
PSERVICE_GROUP Group = Service->lpGroup;
DWORD dwError = ERROR_SUCCESS;
+ EnterCriticalSection(&StartServiceCriticalSection);
+
DPRINT("ScmStartService() called\n");
Service->ControlPipeHandle = INVALID_HANDLE_VALUE;
}
DPRINT("ScmStartService() done (Error %lu)\n", dwError);
+ LeaveCriticalSection(&StartServiceCriticalSection);
if (dwError == ERROR_SUCCESS)
{
RtlReleaseResource(&DatabaseLock);
}
+
+VOID
+ScmInitNamedPipeCriticalSection(VOID)
+{
+ InitializeCriticalSection(&NamedPipeCriticalSection);
+ InitializeCriticalSection(&StartServiceCriticalSection);
+}
+
+
+VOID
+ScmDeleteNamedPipeCriticalSection(VOID)
+{
+ DeleteCriticalSection(&StartServiceCriticalSection);
+ DeleteCriticalSection(&NamedPipeCriticalSection);
+}
+
/* EOF */