[SERVICES]
[reactos.git] / reactos / base / system / services / database.c
index 7a9819e..ed0bdcb 100644 (file)
@@ -30,6 +30,8 @@ LIST_ENTRY ServiceListHead;
 static RTL_RESOURCE DatabaseLock;
 static DWORD dwResumeCount = 1;
 
 static RTL_RESOURCE DatabaseLock;
 static DWORD dwResumeCount = 1;
 
+static CRITICAL_SECTION NamedPipeCriticalSection;
+static CRITICAL_SECTION StartServiceCriticalSection;
 
 /* FUNCTIONS *****************************************************************/
 
 
 /* FUNCTIONS *****************************************************************/
 
@@ -704,6 +706,8 @@ ScmControlService(PSERVICE Service,
     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,
@@ -718,6 +722,8 @@ ScmControlService(PSERVICE Service,
              &dwReadCount,
              NULL);
 
              &dwReadCount,
              NULL);
 
+    LeaveCriticalSection(&NamedPipeCriticalSection);
+
     /* Release the contol packet */
     HeapFree(GetProcessHeap(),
              0,
     /* Release the contol packet */
     HeapFree(GetProcessHeap(),
              0,
@@ -795,6 +801,8 @@ ScmSendStartCommand(PSERVICE Service,
     /* 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,
@@ -809,6 +817,8 @@ ScmSendStartCommand(PSERVICE Service,
              &dwReadCount,
              NULL);
 
              &dwReadCount,
              NULL);
 
+    LeaveCriticalSection(&NamedPipeCriticalSection);
+
     /* Release the contol packet */
     HeapFree(GetProcessHeap(),
              0,
     /* Release the contol packet */
     HeapFree(GetProcessHeap(),
              0,
@@ -912,6 +922,8 @@ ScmStartUserModeService(PSERVICE Service,
         return Status;
     }
 
         return Status;
     }
 
+    EnterCriticalSection(&StartServiceCriticalSection);
+
     /* Create '\\.\pipe\net\NtControlPipeXXX' instance */
     swprintf(NtControlPipeName, L"\\\\.\\pipe\\net\\NtControlPipe%u", ServiceCurrent);
     Service->ControlPipeHandle = CreateNamedPipeW(NtControlPipeName,
     /* Create '\\.\pipe\net\NtControlPipeXXX' instance */
     swprintf(NtControlPipeName, L"\\\\.\\pipe\\net\\NtControlPipe%u", ServiceCurrent);
     Service->ControlPipeHandle = CreateNamedPipeW(NtControlPipeName,
@@ -926,6 +938,7 @@ ScmStartUserModeService(PSERVICE Service,
     if (Service->ControlPipeHandle == INVALID_HANDLE_VALUE)
     {
         DPRINT1("Failed to create control pipe!\n");
     if (Service->ControlPipeHandle == INVALID_HANDLE_VALUE)
     {
         DPRINT1("Failed to create control pipe!\n");
+        LeaveCriticalSection(&StartServiceCriticalSection);
         return GetLastError();
     }
 
         return GetLastError();
     }
 
@@ -957,6 +970,7 @@ ScmStartUserModeService(PSERVICE Service,
         Service->ControlPipeHandle = INVALID_HANDLE_VALUE;
 
         DPRINT1("Starting '%S' failed!\n", Service->lpServiceName);
         Service->ControlPipeHandle = INVALID_HANDLE_VALUE;
 
         DPRINT1("Starting '%S' failed!\n", Service->lpServiceName);
+        LeaveCriticalSection(&StartServiceCriticalSection);
         return dwError;
     }
 
         return dwError;
     }
 
@@ -1016,6 +1030,8 @@ ScmStartUserModeService(PSERVICE Service,
     CloseHandle(ProcessInformation.hThread);
     CloseHandle(ProcessInformation.hProcess);
 
     CloseHandle(ProcessInformation.hThread);
     CloseHandle(ProcessInformation.hProcess);
 
+    LeaveCriticalSection(&StartServiceCriticalSection);
+
     return dwError;
 }
 
     return dwError;
 }
 
@@ -1257,4 +1273,20 @@ ScmUnlockDatabase(VOID)
     RtlReleaseResource(&DatabaseLock);
 }
 
     RtlReleaseResource(&DatabaseLock);
 }
 
+
+VOID
+ScmInitNamedPipeCriticalSection(VOID)
+{
+    InitializeCriticalSection(&NamedPipeCriticalSection);
+    InitializeCriticalSection(&StartServiceCriticalSection);
+}
+
+
+VOID
+ScmDeleteNamedPipeCriticalSection(VOID)
+{
+    DeleteCriticalSection(&StartServiceCriticalSection);
+    DeleteCriticalSection(&NamedPipeCriticalSection);
+}
+
 /* EOF */
 /* EOF */