Start services again and call a services main routine.
Modified: trunk/reactos/lib/advapi32/service/sctrl.c
Modified: trunk/reactos/subsys/system/services/database.c

Modified: trunk/reactos/lib/advapi32/service/sctrl.c
--- trunk/reactos/lib/advapi32/service/sctrl.c	2005-01-08 14:54:59 UTC (rev 12889)
+++ trunk/reactos/lib/advapi32/service/sctrl.c	2005-01-08 18:11:46 UTC (rev 12890)
@@ -19,7 +19,7 @@
 
 /* TYPES *********************************************************************/
 
-typedef struct
+typedef struct _ACTIVE_SERVICE
 {
   DWORD ThreadId;
   UNICODE_STRING ServiceName;
@@ -28,31 +28,32 @@
   SERVICE_STATUS ServiceStatus;
 } ACTIVE_SERVICE, *PACTIVE_SERVICE;
 
+
 /* GLOBALS *******************************************************************/
 
-static ULONG ActiveServiceCount;
-static PACTIVE_SERVICE ActiveServices;
+static DWORD dwActiveServiceCount = 0;
+static PACTIVE_SERVICE lpActiveServices = NULL;
 /* static PHANDLE ActiveServicesThreadHandles; */ /* uncomment when in use */
 
+
 /* FUNCTIONS *****************************************************************/
 
-
 static PACTIVE_SERVICE
 ScLookupServiceByServiceName(LPWSTR lpServiceName)
 {
   DWORD i;
 
-  for (i = 0; i < ActiveServiceCount; i++)
+  for (i = 0; i < dwActiveServiceCount; i++)
     {
-      if (_wcsicmp(ActiveServices[i].ServiceName.Buffer, lpServiceName) == 0)
+      if (_wcsicmp(lpActiveServices[i].ServiceName.Buffer, lpServiceName) == 0)
 	{
-	  return(&ActiveServices[i]);
+	  return &lpActiveServices[i];
 	}
     }
 
   SetLastError(ERROR_SERVICE_DOES_NOT_EXIST);
 
-  return(NULL);
+  return NULL;
 }
 
 
@@ -61,20 +62,38 @@
 {
   DWORD i;
 
-  for (i = 0; i < ActiveServiceCount; i++)
+  for (i = 0; i < dwActiveServiceCount; i++)
     {
-      if (ActiveServices[i].ThreadId == ThreadId)
+      if (lpActiveServices[i].ThreadId == ThreadId)
 	{
-	  return(&ActiveServices[i]);
+	  return &lpActiveServices[i];
 	}
     }
 
   SetLastError(ERROR_SERVICE_DOES_NOT_EXIST);
 
-  return(NULL);
+  return NULL;
 }
 
 
+static DWORD WINAPI
+ScServiceMainStub(LPVOID Context)
+{
+  PACTIVE_SERVICE lpService;
+
+  lpService = (PACTIVE_SERVICE)Context;
+
+  DPRINT("ScServiceMainStub() called\n");
+
+  /* FIXME: Send argc and argv (from command line) as arguments */
+
+
+  (lpService->MainFunction)(0, NULL);
+
+  return ERROR_SUCCESS;
+}
+
+
 static DWORD
 ScConnectControlPipe(HANDLE *hPipe)
 {
@@ -82,25 +101,31 @@
   DWORD dwProcessId;
   DWORD dwState;
 
-  WaitNamedPipeW(L"\\\\.\\pipe\\net\\NtControlPipe",
-		 15000);
+  if (!WaitNamedPipeW(L"\\\\.\\pipe\\net\\NtControlPipe", 15000))
+    {
+      DPRINT1("WaitNamedPipe() failed (Error %lu)\n", GetLastError());
+      return ERROR_FAILED_SERVICE_CONTROLLER_CONNECT;
+    }
 
   *hPipe = CreateFileW(L"\\\\.\\pipe\\net\\NtControlPipe",
 		       GENERIC_READ | GENERIC_WRITE,
-		       FILE_SHARE_READ | FILE_SHARE_WRITE,
+		       0,
 		       NULL,
 		       OPEN_EXISTING,
 		       FILE_ATTRIBUTE_NORMAL,
 		       NULL);
   if (*hPipe == INVALID_HANDLE_VALUE)
-    return(ERROR_FAILED_SERVICE_CONTROLLER_CONNECT);
+    {
+      DPRINT1("CreateFileW() failed (Error %lu)\n", GetLastError());
+      return ERROR_FAILED_SERVICE_CONTROLLER_CONNECT;
+    }
 
   dwState = PIPE_READMODE_MESSAGE;
   if (!SetNamedPipeHandleState(*hPipe, &dwState, NULL, NULL))
     {
       CloseHandle(hPipe);
       *hPipe = INVALID_HANDLE_VALUE;
-      return(ERROR_FAILED_SERVICE_CONTROLLER_CONNECT);
+      return ERROR_FAILED_SERVICE_CONTROLLER_CONNECT;
     }
 
   dwProcessId = GetCurrentProcessId();
@@ -110,15 +135,37 @@
 	    &dwBytesWritten,
 	    NULL);
 
-  return(ERROR_SUCCESS);
+  DPRINT("Sent process id %lu\n", dwProcessId);
+
+  return ERROR_SUCCESS;
 }
 
 
-static VOID
-ScServiceDispatcher(HANDLE hPipe, PVOID p1, PVOID p2)
+static BOOL
+ScServiceDispatcher(HANDLE hPipe,
+		    PUCHAR lpBuffer,
+		    DWORD dwBufferSize)
 {
-  DPRINT1("ScDispatcherLoop() called\n");
+  PACTIVE_SERVICE lpService;
+  HANDLE ThreadHandle;
 
+  DPRINT("ScDispatcherLoop() called\n");
+
+  lpService = &lpActiveServices[0];
+
+  ThreadHandle = CreateThread(NULL,
+			      0,
+			      ScServiceMainStub,
+			      lpService,
+			      CREATE_SUSPENDED,
+			      &lpService->ThreadId);
+  if (ThreadHandle == NULL)
+    return FALSE;
+
+  ResumeThread(ThreadHandle);
+
+  CloseHandle(ThreadHandle);
+
 #if 0
   while (TRUE)
     {
@@ -128,19 +175,8 @@
 
     }
 #endif
-}
 
-
-DWORD WINAPI
-ScServiceMainStub(LPVOID Context)
-{
-  LPSERVICE_MAIN_FUNCTIONW lpServiceProc = (LPSERVICE_MAIN_FUNCTIONW)Context;
-
-  /* FIXME: Send argc and argv (from command line) as arguments */
-
-  (lpServiceProc)(0, NULL);
-
-  return ERROR_SUCCESS;
+  return TRUE;
 }
 
 
@@ -161,7 +197,7 @@
   if (!NT_SUCCESS(RtlAnsiStringToUnicodeString(&ServiceNameU, &ServiceNameA, TRUE)))
     {
       SetLastError(ERROR_OUTOFMEMORY);
-      return((SERVICE_STATUS_HANDLE)0);
+      return (SERVICE_STATUS_HANDLE)0;
     }
 
   SHandle = RegisterServiceCtrlHandlerW(ServiceNameU.Buffer,
@@ -169,7 +205,7 @@
 
   RtlFreeUnicodeString(&ServiceNameU);
 
-  return(SHandle);
+  return SHandle;
 }
 
 
@@ -187,12 +223,12 @@
   Service = ScLookupServiceByServiceName((LPWSTR)lpServiceName);
   if (Service == NULL)
     {
-      return((SERVICE_STATUS_HANDLE)NULL);
+      return (SERVICE_STATUS_HANDLE)NULL;
     }
 
   Service->HandlerFunction = lpHandlerProc;
 
-  return((SERVICE_STATUS_HANDLE)Service->ThreadId);
+  return (SERVICE_STATUS_HANDLE)Service->ThreadId;
 }
 
 
@@ -208,7 +244,7 @@
 	       BOOL bUpdateImmediately)
 {
   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-  return(FALSE);
+  return FALSE;
 }
 
 
@@ -242,14 +278,14 @@
   if (!Service)
     {
       SetLastError(ERROR_INVALID_HANDLE);
-      return(FALSE);
+      return FALSE;
     }
 
   RtlCopyMemory(&Service->ServiceStatus,
 		lpServiceStatus,
 		sizeof(SERVICE_STATUS));
 
-  return(TRUE);
+  return TRUE;
 }
 
 
@@ -261,65 +297,71 @@
 BOOL STDCALL
 StartServiceCtrlDispatcherA(LPSERVICE_TABLE_ENTRYA lpServiceStartTable)
 {
-  // FIXME how to deal with diffs between ANSI/UNICODE
-#if 0
-  LPSERVICE_TABLE_ENTRYW ServiceStartTableW;
-  ANSI_STRING ServiceNameA;
-  UNICODE_STRING ServiceNameW;
-  ULONG i, j;
-  ULONG Count;
-  BOOL b;
+  ULONG i;
+  HANDLE hPipe;
+  DWORD dwError;
+  PUCHAR lpMessageBuffer;
 
+  DPRINT("StartServiceCtrlDispatcherA() called\n");
+
   i = 0;
   while (lpServiceStartTable[i].lpServiceProc != NULL)
     {
       i++;
     }
-  Count = i;
 
-  ServiceStartTableW = RtlAllocateHeap(RtlGetProcessHeap(),
-				       HEAP_ZERO_MEMORY,
-				       sizeof(SERVICE_TABLE_ENTRYW) * Count);
-  for (i = 0; i < Count; i++)
-  {
-    RtlInitAnsiString(
-      &ServiceNameA,
-   	  lpServiceStartTable[i].lpServiceName);
-    if (!NT_SUCCESS(RtlAnsiStringToUnicodeString(
-      &ServiceNameW,
-   	  &ServiceNameA,
-   		TRUE)))
+  dwActiveServiceCount = i;
+  lpActiveServices = RtlAllocateHeap(RtlGetProcessHeap(),
+				     HEAP_ZERO_MEMORY,
+				     dwActiveServiceCount * sizeof(ACTIVE_SERVICE));
+  if (lpActiveServices == NULL)
     {
-      for (j = 0; j < i; j++)
-      {
-        RtlInitUnicodeString(
-          &ServiceNameW,
-     	    ServiceStartTableW[j].lpServiceName);
-        RtlFreeUnicodeString(&ServiceNameW);
-      }
-      RtlFreeHeap(RtlGetProcessHeap(), 0, ServiceStartTableW);
-      SetLastError(ERROR_OUTOFMEMORY);
-  	  return FALSE;
+      return FALSE;
     }
-    ServiceStartTableW[i].lpServiceName = ServiceNameW.Buffer;
-    ServiceStartTableW[i].lpServiceProc = 
-      lpServiceStartTable[i].lpServiceProc;
-  }
 
-  b = StartServiceCtrlDispatcherW(ServiceStartTableW);
+  /* Copy service names and start procedure */
+  for (i = 0; i < dwActiveServiceCount; i++)
+    {
+      RtlCreateUnicodeStringFromAsciiz(&lpActiveServices[i].ServiceName,
+				       lpServiceStartTable[i].lpServiceName);
+      lpActiveServices[i].MainFunction = (LPSERVICE_MAIN_FUNCTIONW)lpServiceStartTable[i].lpServiceProc;
+    }
 
-  for (i = 0; i < Count; i++)
+  dwError = ScConnectControlPipe(&hPipe);
+  if (dwError != ERROR_SUCCESS)
     {
-      RtlFreeHeap(RtlGetProcessHeap(), 0, ServiceStartTableW[i].lpServiceName);
+      /* Free the service table */
+      RtlFreeHeap(RtlGetProcessHeap(), 0, lpActiveServices);
+      lpActiveServices = NULL;
+      dwActiveServiceCount = 0;
+      return FALSE;
     }
 
-  RtlFreeHeap(RtlGetProcessHeap(), 0, ServiceStartTableW);
+  lpMessageBuffer = RtlAllocateHeap(RtlGetProcessHeap(),
+				    HEAP_ZERO_MEMORY,
+				    256);
+  if (lpMessageBuffer == NULL)
+    {
+      /* Free the service table */
+      RtlFreeHeap(RtlGetProcessHeap(), 0, lpActiveServices);
+      lpActiveServices = NULL;
+      dwActiveServiceCount = 0;
+      CloseHandle(hPipe);
+      return FALSE;
+    }
 
-  return b;
-#else
-  UNIMPLEMENTED;
-  return 0;
-#endif
+  ScServiceDispatcher(hPipe, lpMessageBuffer, 256);
+  CloseHandle(hPipe);
+
+  /* Free the message buffer */
+  RtlFreeHeap(RtlGetProcessHeap(), 0, lpMessageBuffer);
+
+  /* Free the service table */
+  RtlFreeHeap(RtlGetProcessHeap(), 0, lpActiveServices);
+  lpActiveServices = NULL;
+  dwActiveServiceCount = 0;
+
+  return TRUE;
 }
 
 
@@ -334,6 +376,7 @@
   ULONG i;
   HANDLE hPipe;
   DWORD dwError;
+  PUCHAR lpMessageBuffer;
 
   DPRINT("StartServiceCtrlDispatcherW() called\n");
 
@@ -343,99 +386,58 @@
       i++;
     }
 
-  ActiveServiceCount = i;
-  ActiveServices = RtlAllocateHeap(RtlGetProcessHeap(),
-				   HEAP_ZERO_MEMORY,
-				   ActiveServiceCount * sizeof(ACTIVE_SERVICE));
-  if (ActiveServices == NULL)
+  dwActiveServiceCount = i;
+  lpActiveServices = RtlAllocateHeap(RtlGetProcessHeap(),
+				     HEAP_ZERO_MEMORY,
+				     dwActiveServiceCount * sizeof(ACTIVE_SERVICE));
+  if (lpActiveServices == NULL)
     {
-      return(FALSE);
+      return FALSE;
     }
 
   /* Copy service names and start procedure */
-  for (i = 0; i < ActiveServiceCount; i++)
+  for (i = 0; i < dwActiveServiceCount; i++)
     {
-      RtlCreateUnicodeString(&ActiveServices[i].ServiceName,
+      RtlCreateUnicodeString(&lpActiveServices[i].ServiceName,
 			     lpServiceStartTable[i].lpServiceName);
-      ActiveServices[i].MainFunction = lpServiceStartTable[i].lpServiceProc;
+      lpActiveServices[i].MainFunction = lpServiceStartTable[i].lpServiceProc;
     }
 
   dwError = ScConnectControlPipe(&hPipe);
-  if (dwError == ERROR_SUCCESS)
+  if (dwError != ERROR_SUCCESS)
     {
-      /* FIXME: free the service table */
-      return(FALSE);
+      /* Free the service table */
+      RtlFreeHeap(RtlGetProcessHeap(), 0, lpActiveServices);
+      lpActiveServices = NULL;
+      dwActiveServiceCount = 0;
+      return FALSE;
     }
 
-  ScServiceDispatcher(hPipe, NULL, NULL);
+  lpMessageBuffer = RtlAllocateHeap(RtlGetProcessHeap(),
+				    HEAP_ZERO_MEMORY,
+				    256);
+  if (lpMessageBuffer == NULL)
+    {
+      /* Free the service table */
+      RtlFreeHeap(RtlGetProcessHeap(), 0, lpActiveServices);
+      lpActiveServices = NULL;
+      dwActiveServiceCount = 0;
+      CloseHandle(hPipe);
+      return FALSE;
+    }
+
+  ScServiceDispatcher(hPipe, lpMessageBuffer, 256);
   CloseHandle(hPipe);
 
-  /* FIXME: free the service table */
+  /* Free the message buffer */
+  RtlFreeHeap(RtlGetProcessHeap(), 0, lpMessageBuffer);
 
-  return(TRUE);
+  /* Free the service table */
+  RtlFreeHeap(RtlGetProcessHeap(), 0, lpActiveServices);
+  lpActiveServices = NULL;
+  dwActiveServiceCount = 0;
 
-#if 0
-  ActiveServicesThreadHandles = RtlAllocateHeap(RtlGetProcessHeap(),
-						HEAP_ZERO_MEMORY,
-						(ActiveServiceCount + 1) * sizeof(HANDLE));
-  if (!ActiveServicesThreadHandles)
-    {
-      RtlFreeHeap(RtlGetProcessHeap(), 0, ActiveServices);
-      ActiveServices = NULL;
-      return(FALSE);
-    }
-
-  for (i = 0; i<ActiveServiceCount; i++)
-  {
-    h = CreateThread(
-      NULL,
-   	  0,
-   	  ScServiceMainStub,
-   	  lpServiceStartTable[i].lpServiceProc,
-   	  0,
-   	  &Tid);
-    if (h == INVALID_HANDLE_VALUE)
-    {
-      RtlFreeHeap(RtlGetProcessHeap(), 0, ActiveServicesThreadHandles);
-      ActiveServicesThreadHandles = NULL;
-      RtlFreeHeap(RtlGetProcessHeap(), 0, ActiveServices);
-      ActiveServices = NULL;
-      return(FALSE);
-    }
-    ActiveServicesThreadHandles[i + 1] = h;
-    ActiveServices[i].ThreadId = Tid;
-  }
-
-  while (ActiveServiceCount > 0)
-  {
-    r = WaitForMultipleObjects(
-      ActiveServiceCount + 1,
-   	  ActiveServicesThreadHandles,
-   		FALSE,
-   		INFINITE);
-    if (r == WAIT_OBJECT_0)
-    {
-      /* Received message from the scm */
-    }
-    else if (r > WAIT_OBJECT_0 && r < (WAIT_OBJECT_0 + ActiveServiceCount))
-    {
-      /* A service died */
-        
-      ActiveServiceCount--;
-      ActiveServicesThreadHandles[r - WAIT_OBJECT_0 - 1] =
-        ActiveServicesThreadHandles[ActiveServiceCount + 1];
-      RtlCopyMemory(
-        &ActiveServices[r - WAIT_OBJECT_0 - 2],
-        &ActiveServices[ActiveServiceCount],
-        sizeof(ACTIVE_SERVICE));
-    }
-    else
-    {
-      /* Bail */
-    }
-  }
   return TRUE;
-#endif
 }
 
 /* EOF */

Modified: trunk/reactos/subsys/system/services/database.c
--- trunk/reactos/subsys/system/services/database.c	2005-01-08 14:54:59 UTC (rev 12889)
+++ trunk/reactos/subsys/system/services/database.c	2005-01-08 18:11:46 UTC (rev 12890)
@@ -81,7 +81,7 @@
 
 /* FUNCTIONS *****************************************************************/
 
-static NTSTATUS STDCALL 
+static NTSTATUS STDCALL
 CreateGroupOrderListRoutine(PWSTR ValueName,
 			    ULONG ValueType,
 			    PVOID ValueData,
@@ -127,6 +127,7 @@
   return STATUS_SUCCESS;
 }
 
+
 static NTSTATUS STDCALL
 CreateGroupListRoutine(PWSTR ValueName,
 		       ULONG ValueType,
@@ -148,15 +149,15 @@
 					sizeof(SERVICE_GROUP));
       if (Group == NULL)
 	{
-	  return(STATUS_INSUFFICIENT_RESOURCES);
+	  return STATUS_INSUFFICIENT_RESOURCES;
 	}
 
       if (!RtlCreateUnicodeString(&Group->GroupName,
 				  (PWSTR)ValueData))
 	{
-	  return(STATUS_INSUFFICIENT_RESOURCES);
+	  return STATUS_INSUFFICIENT_RESOURCES;
 	}
-      
+
       RtlZeroMemory(&QueryTable, sizeof(QueryTable));
       QueryTable[0].Name = (PWSTR)ValueData;
       QueryTable[0].QueryRoutine = CreateGroupOrderListRoutine;
@@ -173,7 +174,7 @@
 		     &Group->GroupListEntry);
     }
 
-  return(STATUS_SUCCESS);
+  return STATUS_SUCCESS;
 }
 
 
@@ -191,7 +192,7 @@
 		      sizeof(SERVICE));
   if (Service == NULL)
     {
-      return(STATUS_INSUFFICIENT_RESOURCES);
+      return STATUS_INSUFFICIENT_RESOURCES;
     }
 
   /* Copy service name */
@@ -202,8 +203,9 @@
   if (Service->ServiceName.Buffer == NULL)
     {
       HeapFree(GetProcessHeap(), 0, Service);
-      return(STATUS_INSUFFICIENT_RESOURCES);
+      return STATUS_INSUFFICIENT_RESOURCES;
     }
+
   RtlCopyMemory(Service->ServiceName.Buffer,
 		ServiceName->Buffer,
 		ServiceName->Length);
@@ -217,8 +219,9 @@
     {
       HeapFree(GetProcessHeap(), 0, Service->ServiceName.Buffer);
       HeapFree(GetProcessHeap(), 0, Service);
-      return(STATUS_INSUFFICIENT_RESOURCES);
+      return STATUS_INSUFFICIENT_RESOURCES;
     }
+
   wcscpy(Service->RegistryPath.Buffer,
 	 L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\");
   wcscat(Service->RegistryPath.Buffer,
@@ -260,7 +263,7 @@
       RtlFreeUnicodeString(&Service->RegistryPath);
       RtlFreeUnicodeString(&Service->ServiceName);
       HeapFree(GetProcessHeap(), 0, Service);
-      return(Status);
+      return Status;
     }
 
   DPRINT("ServiceName: '%wZ'\n", &Service->ServiceName);
@@ -273,7 +276,7 @@
   InsertTailList(&ServiceListHead,
 		 &Service->ServiceListEntry);
 
-  return(STATUS_SUCCESS);
+  return STATUS_SUCCESS;
 }
 
 
@@ -311,7 +314,7 @@
 				  NULL,
 				  NULL);
   if (!NT_SUCCESS(Status))
-    return(Status);
+    return Status;
 
   RtlRosInitUnicodeStringFromLiteral(&ServicesKeyName,
 		       L"\\Registry\\Machine\\System\\CurrentControlSet\\Services");
@@ -327,7 +330,7 @@
 			 &ObjectAttributes,
 			 0);
   if (!NT_SUCCESS(Status))
-    return(Status);
+    return Status;
 
   /* Allocate key info buffer */
   KeyInfoLength = sizeof(KEY_BASIC_INFORMATION) + MAX_PATH * sizeof(WCHAR);
@@ -335,7 +338,7 @@
   if (KeyInfo == NULL)
     {
       NtClose(ServicesKey);
-      return(STATUS_INSUFFICIENT_RESOURCES);
+      return STATUS_INSUFFICIENT_RESOURCES;
     }
 
   Index = 0;
@@ -379,7 +382,7 @@
 
   DPRINT("ScmCreateServiceDataBase() done\n");
 
-  return(STATUS_SUCCESS);
+  return STATUS_SUCCESS;
 }
 
 
@@ -421,7 +424,7 @@
 				 &ObjectAttributes);
   if (!NT_SUCCESS(Status))
     {
-      return(Status);
+      return Status;
     }
 
   BufferLength = sizeof(OBJECT_DIRECTORY_INFORMATION) +
@@ -485,7 +488,7 @@
 	   DirInfo);
   NtClose(DirHandle);
 
-  return(STATUS_SUCCESS);
+  return STATUS_SUCCESS;
 }
 
 
@@ -521,14 +524,12 @@
 ScmStartService(PSERVICE Service,
 		PSERVICE_GROUP Group)
 {
-#if 0
   RTL_QUERY_REGISTRY_TABLE QueryTable[3];
   PROCESS_INFORMATION ProcessInformation;
   STARTUPINFOW StartupInfo;
   UNICODE_STRING ImagePath;
   ULONG Type;
   BOOL Result;
-#endif
   NTSTATUS Status;
 
   DPRINT("ScmStartService() called\n");
@@ -546,7 +547,6 @@
     }
   else
     {
-#if 0
       RtlInitUnicodeString(&ImagePath, NULL);
 
       /* Get service data */
@@ -614,7 +614,7 @@
 	      CloseHandle(Service->ControlPipeHandle);
 	      Service->ControlPipeHandle = INVALID_HANDLE_VALUE;
 
-	      DPRINT("Starting '%S' failed!\n", Service->ServiceName.Buffer);
+	      DPRINT1("Starting '%S' failed!\n", Service->ServiceName.Buffer);
 	      Status = STATUS_UNSUCCESSFUL;
 	    }
 	  else
@@ -633,15 +633,35 @@
 	      /* Resume Thread */
 	      ResumeThread(ProcessInformation.hThread);
 
-	      /* FIXME: connect control pipe */
+	      /* Connect control pipe */
 	      if (ConnectNamedPipe(Service->ControlPipeHandle, NULL))
 		{
+		  DWORD dwProcessId = 0;
+		  DWORD dwRead = 0;
+
 		  DPRINT("Control pipe connected!\n");
-		  Status = STATUS_SUCCESS;
+
+		  /* FIXME: Read thread id from pipe */
+		  if (!ReadFile(Service->ControlPipeHandle,
+				(LPVOID)&dwProcessId,
+				sizeof(DWORD),
+				&dwRead,
+				NULL))
+		    {
+		      DPRINT1("Reading the service control pipe failed (Error %lu)\n", GetLastError());
+		    }
+		  else
+		    {
+		      DPRINT("Received process id %lu\n", dwProcessId);
+
+		      /* FIXME: Send start command */
+
+		      Status = STATUS_SUCCESS;
+		    }
 		}
 	      else
 		{
-		  DPRINT1("Connecting control pipe failed!\n");
+		  DPRINT("Connecting control pipe failed!\n");
 
 		  /* Close control pipe */
 		  CloseHandle(Service->ControlPipeHandle);
@@ -656,13 +676,11 @@
 	      CloseHandle(ProcessInformation.hProcess);
 	    }
 	}
-#endif
-      Status = STATUS_SUCCESS;
     }
 
-#if 0
 Done:
-#endif
+  DPRINT("ScmStartService() done (Status %lx)\n", Status);
+
   if (NT_SUCCESS(Status))
     {
       if (Group != NULL)
@@ -674,36 +692,34 @@
 #if 0
   else
     {
-      if (CurrentService->ErrorControl == 1)
+      switch (Service->ErrorControl)
 	{
-	  /* Log error */
+	  case SERVICE_ERROR_NORMAL:
+	    /* FIXME: Log error */
+	    break;
 
-	}
-      else if (CurrentService->ErrorControl == 2)
-	{
-	  if (IsLastKnownGood == FALSE)
-	    {
-	      /* Boot last known good configuration */
+	  case SERVICE_ERROR_SEVERE:
+	    if (IsLastKnownGood == FALSE)
+	      {
+		/* FIXME: Boot last known good configuration */
+	      }
+	    break;
 
-	    }
+	  case SERVICE_ERROR_CRITICAL:
+	    if (IsLastKnownGood == FALSE)
+	      {
+		/* FIXME: Boot last known good configuration */
+	      }
+	    else
+	      {
+		/* FIXME: BSOD! */
+	      }
+	    break;
 	}
-      else if (CurrentService->ErrorControl == 3)
-	{
-	  if (IsLastKnownGood == FALSE)
-	    {
-	      /* Boot last known good configuration */
-
-	    }
-	  else
-	    {
-	      /* BSOD! */
-
-	    }
-	}
     }
 #endif
 
-  return(STATUS_SUCCESS);
+  return Status;
 }