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,
return Status;
}
+ EnterCriticalSection(&StartServiceCriticalSection);
+
/* Create '\\.\pipe\net\NtControlPipeXXX' instance */
swprintf(NtControlPipeName, L"\\\\.\\pipe\\net\\NtControlPipe%u", ServiceCurrent);
Service->ControlPipeHandle = CreateNamedPipeW(NtControlPipeName,
if (Service->ControlPipeHandle == INVALID_HANDLE_VALUE)
{
DPRINT1("Failed to create control pipe!\n");
+ LeaveCriticalSection(&StartServiceCriticalSection);
return GetLastError();
}
Service->ControlPipeHandle = INVALID_HANDLE_VALUE;
DPRINT1("Starting '%S' failed!\n", Service->lpServiceName);
+ LeaveCriticalSection(&StartServiceCriticalSection);
return dwError;
}
CloseHandle(ProcessInformation.hThread);
CloseHandle(ProcessInformation.hProcess);
+ LeaveCriticalSection(&StartServiceCriticalSection);
+
return dwError;
}
RtlReleaseResource(&DatabaseLock);
}
+
+VOID
+ScmInitNamedPipeCriticalSection(VOID)
+{
+ InitializeCriticalSection(&NamedPipeCriticalSection);
+ InitializeCriticalSection(&StartServiceCriticalSection);
+}
+
+
+VOID
+ScmDeleteNamedPipeCriticalSection(VOID)
+{
+ DeleteCriticalSection(&StartServiceCriticalSection);
+ DeleteCriticalSection(&NamedPipeCriticalSection);
+}
+
/* EOF */