Simplify services.exe.
Modified: trunk/reactos/subsys/system/services/database.c
Modified: trunk/reactos/subsys/system/services/rpcserver.c
Modified: trunk/reactos/subsys/system/services/services.h

Modified: trunk/reactos/subsys/system/services/database.c
--- trunk/reactos/subsys/system/services/database.c	2005-10-22 18:32:16 UTC (rev 18684)
+++ trunk/reactos/subsys/system/services/database.c	2005-10-22 18:59:39 UTC (rev 18685)
@@ -56,7 +56,7 @@
 /* FUNCTIONS *****************************************************************/
 
 PSERVICE
-ScmGetServiceEntryByName(PUNICODE_STRING ServiceName)
+ScmGetServiceEntryByName(LPWSTR lpServiceName)
 {
   PLIST_ENTRY ServiceEntry;
   PSERVICE CurrentService;
@@ -69,9 +69,9 @@
       CurrentService = CONTAINING_RECORD(ServiceEntry,
 					 SERVICE,
 					 ServiceListEntry);
-      if (RtlEqualUnicodeString(&CurrentService->ServiceName, ServiceName, TRUE))
+      if (_wcsicmp(CurrentService->lpServiceName, lpServiceName) == 0)
 	{
-	  DPRINT("Found service: '%wZ'\n", &CurrentService->ServiceName);
+	  DPRINT("Found service: '%S'\n", CurrentService->lpServiceName);
 	  return CurrentService;
 	}
 
@@ -183,70 +183,44 @@
 
 
 static NTSTATUS STDCALL
-CreateServiceListEntry(PUNICODE_STRING ServiceName)
+CreateServiceListEntry(LPWSTR lpServiceName)
 {
   RTL_QUERY_REGISTRY_TABLE QueryTable[6];
+  UNICODE_STRING ServiceName;
   PSERVICE Service = NULL;
   NTSTATUS Status;
 
   DPRINT("Service: '%wZ'\n", ServiceName);
 
+
   /* Allocate service entry */
-  Service = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-		      sizeof(SERVICE));
+  Service = HeapAlloc(GetProcessHeap(),
+                      HEAP_ZERO_MEMORY,
+                      sizeof(SERVICE) + ((wcslen(lpServiceName) + 1) * sizeof(WCHAR)));
   if (Service == NULL)
     {
       return STATUS_INSUFFICIENT_RESOURCES;
     }
 
   /* Copy service name */
-  Service->ServiceName.Length = ServiceName->Length;
-  Service->ServiceName.MaximumLength = ServiceName->Length + sizeof(WCHAR);
-  Service->ServiceName.Buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-					  Service->ServiceName.MaximumLength);
-  if (Service->ServiceName.Buffer == NULL)
-    {
-      HeapFree(GetProcessHeap(), 0, Service);
-      return STATUS_INSUFFICIENT_RESOURCES;
-    }
+  wcscpy(Service->szServiceName, lpServiceName);
+  Service->lpServiceName = Service->szServiceName;
 
-  RtlCopyMemory(Service->ServiceName.Buffer,
-		ServiceName->Buffer,
-		ServiceName->Length);
-  Service->ServiceName.Buffer[ServiceName->Length / sizeof(WCHAR)] = 0;
-
-  /* Build registry path */
-  Service->RegistryPath.MaximumLength = MAX_PATH * sizeof(WCHAR);
-  Service->RegistryPath.Buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-					   MAX_PATH * sizeof(WCHAR));
-  if (Service->ServiceName.Buffer == NULL)
-    {
-      HeapFree(GetProcessHeap(), 0, Service->ServiceName.Buffer);
-      HeapFree(GetProcessHeap(), 0, Service);
-      return STATUS_INSUFFICIENT_RESOURCES;
-    }
-
-  wcscpy(Service->RegistryPath.Buffer,
-	 L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\");
-  wcscat(Service->RegistryPath.Buffer,
-	 Service->ServiceName.Buffer);
-  Service->RegistryPath.Length = wcslen(Service->RegistryPath.Buffer) * sizeof(WCHAR);
-
   /* Get service data */
   RtlZeroMemory(&QueryTable,
 		sizeof(QueryTable));
 
   QueryTable[0].Name = L"Start";
   QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED;
-  QueryTable[0].EntryContext = &Service->Start;
+  QueryTable[0].EntryContext = &Service->dwStartType;
 
   QueryTable[1].Name = L"Type";
   QueryTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED;
-  QueryTable[1].EntryContext = &Service->Type;
+  QueryTable[1].EntryContext = &Service->Status.dwServiceType;
 
   QueryTable[2].Name = L"ErrorControl";
   QueryTable[2].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED;
-  QueryTable[2].EntryContext = &Service->ErrorControl;
+  QueryTable[2].EntryContext = &Service->dwErrorControl;
 
   QueryTable[3].Name = L"Group";
   QueryTable[3].Flags = RTL_QUERY_REGISTRY_DIRECT;
@@ -254,38 +228,38 @@
 
   QueryTable[4].Name = L"Tag";
   QueryTable[4].Flags = RTL_QUERY_REGISTRY_DIRECT;
-  QueryTable[4].EntryContext = &Service->Tag;
+  QueryTable[4].EntryContext = &Service->dwTag;
 
   Status = RtlQueryRegistryValues(RTL_REGISTRY_SERVICES,
-				  ServiceName->Buffer,
+				  lpServiceName,
 				  QueryTable,
 				  NULL,
 				  NULL);
   if (!NT_SUCCESS(Status))
     {
       PrintString("RtlQueryRegistryValues() failed (Status %lx)\n", Status);
-      RtlFreeUnicodeString(&Service->RegistryPath);
-      RtlFreeUnicodeString(&Service->ServiceName);
       HeapFree(GetProcessHeap(), 0, Service);
       return Status;
     }
 
-  DPRINT("ServiceName: '%wZ'\n", &Service->ServiceName);
-  DPRINT("RegistryPath: '%wZ'\n", &Service->RegistryPath);
+  DPRINT("ServiceName: '%S'\n", Service->lpServiceName);
   DPRINT("ServiceGroup: '%wZ'\n", &Service->ServiceGroup);
   DPRINT("Start %lx  Type %lx  Tag %lx  ErrorControl %lx\n",
-	 Service->Start, Service->Type, Service->Tag, Service->ErrorControl);
+         Service->dwStartType,
+         Service->Status.dwServiceType,
+         Service->dwTag,
+         Service->dwErrorControl);
 
   /* Append service entry */
   InsertTailList(&ServiceListHead,
 		 &Service->ServiceListEntry);
 
-  Service->CurrentState = SERVICE_STOPPED;
-  Service->ControlsAccepted = 0;
-  Service->Win32ExitCode = 0;
-  Service->ServiceSpecificExitCode = 0;
-  Service->CheckPoint = 0;
-  Service->WaitHint = 2000; /* 2 seconds */
+  Service->Status.dwCurrentState = SERVICE_STOPPED;
+  Service->Status.dwControlsAccepted = 0;
+  Service->Status.dwWin32ExitCode = 0;
+  Service->Status.dwServiceSpecificExitCode = 0;
+  Service->Status.dwCheckPoint = 0;
+  Service->Status.dwWaitHint = 2000; /* 2 seconds */
 
   return STATUS_SUCCESS;
 }
@@ -376,7 +350,7 @@
 	      SubKeyName.Buffer[SubKeyName.Length / sizeof(WCHAR)] = 0;
 
 	      DPRINT("KeyName: '%wZ'\n", &SubKeyName);
-	      Status = CreateServiceListEntry(&SubKeyName);
+	      Status = CreateServiceListEntry(SubKeyName.Buffer);
 
 	      /* Ignore services without proper registry. */
 	      if (Status == STATUS_OBJECT_NAME_NOT_FOUND)
@@ -415,9 +389,9 @@
   PLIST_ENTRY GroupEntry;
   PSERVICE_GROUP CurrentGroup;
 
-  DPRINT("ScmCheckDriver(%wZ) called\n", &Service->ServiceName);
+  DPRINT("ScmCheckDriver(%S) called\n", Service->lpServiceName);
 
-  if (Service->Type == SERVICE_KERNEL_DRIVER)
+  if (Service->Status.dwServiceType == SERVICE_KERNEL_DRIVER)
     {
       RtlInitUnicodeString(&DirName,
 			   L"\\Driver");
@@ -461,21 +435,21 @@
       if (Status == STATUS_NO_MORE_ENTRIES)
 	{
 	  /* FIXME: Add current service to 'failed service' list */
-	  DPRINT("Service '%wZ' failed\n", &Service->ServiceName);
+	  DPRINT("Service '%S' failed\n", Service->lpServiceName);
 	  break;
 	}
 
       if (!NT_SUCCESS(Status))
 	break;
 
-      DPRINT("Comparing: '%wZ'  '%wZ'\n", &Service->ServiceName, &DirInfo->ObjectName);
+      DPRINT("Comparing: '%S'  '%wZ'\n", Service->lpServiceName, &DirInfo->ObjectName);
 
-      if (RtlEqualUnicodeString(&Service->ServiceName, &DirInfo->ObjectName, TRUE))
+       if (_wcsicmp(Service->lpServiceName, DirInfo->ObjectName.Buffer) == 0)
 	{
-	  DPRINT("Found: '%wZ'  '%wZ'\n", &Service->ServiceName, &DirInfo->ObjectName);
+	  DPRINT("Found: '%S'  '%wZ'\n", Service->lpServiceName, &DirInfo->ObjectName);
 
 	  /* Mark service as 'running' */
-	  Service->CurrentState = SERVICE_RUNNING;
+	  Service->Status.dwCurrentState = SERVICE_RUNNING;
 
 	  /* Find the driver's group and mark it as 'running' */
 	  if (Service->ServiceGroup.Buffer != NULL)
@@ -520,11 +494,11 @@
     {
       CurrentService = CONTAINING_RECORD(ServiceEntry, SERVICE, ServiceListEntry);
 
-      if (CurrentService->Start == SERVICE_BOOT_START ||
-	  CurrentService->Start == SERVICE_SYSTEM_START)
+      if (CurrentService->dwStartType == SERVICE_BOOT_START ||
+	  CurrentService->dwStartType == SERVICE_SYSTEM_START)
 	{
 	  /* Check driver */
-	  DPRINT("  Checking service: %wZ\n", &CurrentService->ServiceName);
+	  DPRINT("  Checking service: %S\n", CurrentService->lpServiceName);
 
 	  ScmCheckDriver(CurrentService);
 	}
@@ -549,7 +523,7 @@
   DPRINT("ScmSendStartCommand() called\n");
 
   /* Calculate the total length of the start command line */
-  TotalLength = wcslen(Service->ServiceName.Buffer) + 1;
+  TotalLength = wcslen(Service->lpServiceName) + 1;
 #if 0
   if (Arguments != NULL)
   {
@@ -574,8 +548,8 @@
   StartPacket->Command = SCM_START_COMMAND;
   StartPacket->Size = TotalLength;
   Ptr = &StartPacket->Arguments[0];
-  wcscpy(Ptr, Service->ServiceName.Buffer);
-  Ptr += (wcslen(Service->ServiceName.Buffer) + 1);
+  wcscpy(Ptr, Service->lpServiceName);
+  Ptr += (wcslen(Service->lpServiceName) + 1);
 
   /* FIXME: Copy argument list */
 
@@ -626,7 +600,7 @@
   QueryTable[1].EntryContext = &ImagePath;
 
   Status = RtlQueryRegistryValues(RTL_REGISTRY_SERVICES,
-				  Service->ServiceName.Buffer,
+				  Service->lpServiceName,
 				  QueryTable,
 				  NULL,
 				  NULL);
@@ -680,7 +654,7 @@
       CloseHandle(Service->ControlPipeHandle);
       Service->ControlPipeHandle = INVALID_HANDLE_VALUE;
 
-      DPRINT1("Starting '%S' failed!\n", Service->ServiceName.Buffer);
+      DPRINT1("Starting '%S' failed!\n", Service->lpServiceName);
       return STATUS_UNSUCCESSFUL;
     }
 
@@ -752,20 +726,30 @@
 ScmStartService(PSERVICE Service,
 		PSERVICE_GROUP Group)
 {
+  WCHAR szDriverPath[MAX_PATH];
+  UNICODE_STRING DriverPath;
   NTSTATUS Status;
 
   DPRINT("ScmStartService() called\n");
 
   Service->ControlPipeHandle = INVALID_HANDLE_VALUE;
-  DPRINT("Service->Type: %u\n", Service->Type);
+  DPRINT("Service->Type: %lu\n", Service->Status.dwServiceType);
 
-  if (Service->Type == SERVICE_KERNEL_DRIVER ||
-      Service->Type == SERVICE_FILE_SYSTEM_DRIVER ||
-      Service->Type == SERVICE_RECOGNIZER_DRIVER)
+  if (Service->Status.dwServiceType == SERVICE_KERNEL_DRIVER ||
+      Service->Status.dwServiceType == SERVICE_FILE_SYSTEM_DRIVER ||
+      Service->Status.dwServiceType == SERVICE_RECOGNIZER_DRIVER)
     {
       /* Load driver */
-      DPRINT("  Path: %wZ\n", &Service->RegistryPath);
-      Status = NtLoadDriver(&Service->RegistryPath);
+      wcscpy(szDriverPath,
+             L"\\Registry\\Machine\\System\\CurrentControlSet\\Services");
+      wcscat(szDriverPath,
+             Service->lpServiceName);
+
+      RtlInitUnicodeString(&DriverPath,
+                           szDriverPath);
+
+      DPRINT("  Path: %wZ\n", &DriverPath);
+      Status = NtLoadDriver(&DriverPath);
     }
   else
     {
@@ -781,7 +765,7 @@
 	{
 	  Group->ServicesRunning = TRUE;
 	}
-      Service->CurrentState = SERVICE_RUNNING;
+      Service->Status.dwCurrentState = SERVICE_RUNNING;
     }
 #if 0
   else
@@ -852,9 +836,9 @@
 	      CurrentService = CONTAINING_RECORD(ServiceEntry, SERVICE, ServiceListEntry);
 
 	      if ((RtlEqualUnicodeString(&CurrentGroup->GroupName, &CurrentService->ServiceGroup, TRUE)) &&
-	          (CurrentService->Start == SERVICE_AUTO_START) &&
+	          (CurrentService->dwStartType == SERVICE_AUTO_START) &&
 	          (CurrentService->ServiceVisited == FALSE) &&
-		  (CurrentService->Tag == CurrentGroup->TagArray[i]))
+		  (CurrentService->dwTag == CurrentGroup->TagArray[i]))
 	        {
 	          CurrentService->ServiceVisited = TRUE;
 	          ScmStartService(CurrentService,
@@ -872,7 +856,7 @@
 	  CurrentService = CONTAINING_RECORD(ServiceEntry, SERVICE, ServiceListEntry);
 
 	  if ((RtlEqualUnicodeString(&CurrentGroup->GroupName, &CurrentService->ServiceGroup, TRUE)) &&
-	      (CurrentService->Start == SERVICE_AUTO_START) &&
+	      (CurrentService->dwStartType == SERVICE_AUTO_START) &&
 	      (CurrentService->ServiceVisited == FALSE))
 	    {
 	      CurrentService->ServiceVisited = TRUE;
@@ -893,7 +877,7 @@
       CurrentService = CONTAINING_RECORD(ServiceEntry, SERVICE, ServiceListEntry);
 
       if ((CurrentService->ServiceGroup.Length != 0) &&
-	  (CurrentService->Start == SERVICE_AUTO_START) &&
+	  (CurrentService->dwStartType == SERVICE_AUTO_START) &&
 	  (CurrentService->ServiceVisited == FALSE))
 	{
 	  CurrentService->ServiceVisited = TRUE;
@@ -911,7 +895,7 @@
       CurrentService = CONTAINING_RECORD(ServiceEntry, SERVICE, ServiceListEntry);
 
       if ((CurrentService->ServiceGroup.Length == 0) &&
-	  (CurrentService->Start == SERVICE_AUTO_START) &&
+	  (CurrentService->dwStartType == SERVICE_AUTO_START) &&
 	  (CurrentService->ServiceVisited == FALSE))
 	{
 	  CurrentService->ServiceVisited = TRUE;

Modified: trunk/reactos/subsys/system/services/rpcserver.c
--- trunk/reactos/subsys/system/services/rpcserver.c	2005-10-22 18:32:16 UTC (rev 18684)
+++ trunk/reactos/subsys/system/services/rpcserver.c	2005-10-22 18:59:39 UTC (rev 18685)
@@ -306,13 +306,9 @@
 
 
   /* Return service status information */
-  lpServiceStatus->dwServiceType = lpService->Type;
-  lpServiceStatus->dwCurrentState = lpService->CurrentState;
-  lpServiceStatus->dwControlsAccepted = lpService->ControlsAccepted;
-  lpServiceStatus->dwWin32ExitCode = lpService->Win32ExitCode;
-  lpServiceStatus->dwServiceSpecificExitCode = lpService->ServiceSpecificExitCode;
-  lpServiceStatus->dwCheckPoint = lpService->CheckPoint;
-  lpServiceStatus->dwWaitHint = lpService->WaitHint;
+  RtlCopyMemory(lpServiceStatus,
+                &lpService->Status,
+                sizeof(SERVICE_STATUS));
 
   return ERROR_SUCCESS;
 }
@@ -435,13 +431,7 @@
   }
 
   /* Return service status information */
-  lpServiceStatus->dwServiceType = lpService->Type;
-  lpServiceStatus->dwCurrentState = lpService->CurrentState;
-  lpServiceStatus->dwControlsAccepted = lpService->ControlsAccepted;
-  lpServiceStatus->dwWin32ExitCode = lpService->Win32ExitCode;
-  lpServiceStatus->dwServiceSpecificExitCode = lpService->ServiceSpecificExitCode;
-  lpServiceStatus->dwCheckPoint = lpService->CheckPoint;
-  lpServiceStatus->dwWaitHint = lpService->WaitHint;
+  RtlCopyMemory(lpServiceStatus, &lpService->Status, sizeof(SERVICE_STATUS));
 
   return ERROR_SUCCESS;
 }
@@ -479,7 +469,29 @@
 }
 
 
+/* Function 11 */
 #if 0
+unsigned long
+ScmrChangeServiceConfigW([in] handle_t BiningHandle,
+                         [in] SC_HANDLE hService,
+                         [in] DWORD dwServiceType,
+                         [in] DWORD dwStartType,
+                         [in] DWORD dwErrorControl,
+                         [in, string, unique] LPCWSTR lpBinaryPathName,
+                         [in, string, unique] LPCWSTR lpLoadOrderGroup,
+                         [in, out, unique] LPDWORD lpdwTagId,
+                         [in, size_is(dwDependenciesLength), unique] LPCWSTR lpDependencies,
+                         [in] DWORD dwDependenciesLength,
+                         [in, string, unique] LPCWSTR lpServiceStartName,
+                         [in, size_is(dwPasswordLength), unique] LPCWSTR lpPassword,
+                         [in] DWORD dwPasswordLength,
+                         [in, string, unique] LPCWSTR lpDisplayName)
+{
+}
+#endif
+
+
+#if 0
 static DWORD
 CreateServiceKey(LPWSTR lpServiceName, PHKEY phKey)
 {
@@ -592,6 +604,8 @@
     }
 
     /* FIXME: Allocate and fill a service entry */
+//    dwError = CreateNewServiceListEntry(lpServiceName,
+//                                        &lpServiceEntry)
 
 //    if (lpdwTagId != NULL)
 //        *lpdwTagId = 0;
@@ -605,7 +619,7 @@
     if (dwError != ERROR_SUCCESS)
         goto done;
 
-    if ((lpDisplayName != NULL) && (wcslen(lpDisplayName) > 0))
+    if (lpDisplayName != NULL && *lpDisplayName != 0)
     {
         RegSetValueExW(hServiceKey,
                        L"DisplayName",
@@ -683,6 +697,16 @@
             goto done;
     }
 
+    if (lpDependencies != NULL && *lpDependencies != 0)
+    {
+        /* FIXME: Write dependencies */
+    }
+
+    if (lpPassword != NULL)
+    {
+        /* FIXME: Write password */
+    }
+
 done:;
     if (hServiceKey != NULL)
         RegCloseKey(hServiceKey);
@@ -750,7 +774,6 @@
                  unsigned long dwDesiredAccess,
                  unsigned int *hService)
 {
-  UNICODE_STRING ServiceName;
   PSERVICE lpService;
   PMANAGER_HANDLE hManager;
   SC_HANDLE hHandle;
@@ -772,10 +795,7 @@
   /* FIXME: Lock the service list */
 
   /* Get service database entry */
-  RtlInitUnicodeString(&ServiceName,
-                       lpServiceName);
-
-  lpService = ScmGetServiceEntryByName(&ServiceName);
+  lpService = ScmGetServiceEntryByName(lpServiceName);
   if (lpService == NULL)
   {
     DPRINT1("Could not find a service!\n");

Modified: trunk/reactos/subsys/system/services/services.h
--- trunk/reactos/subsys/system/services/services.h	2005-10-22 18:32:16 UTC (rev 18684)
+++ trunk/reactos/subsys/system/services/services.h	2005-10-22 18:59:39 UTC (rev 18685)
@@ -11,28 +11,24 @@
 
 typedef struct _SERVICE
 {
-  LIST_ENTRY ServiceListEntry;
-  UNICODE_STRING ServiceName;
-  UNICODE_STRING RegistryPath;
-  UNICODE_STRING ServiceGroup;
+    LIST_ENTRY ServiceListEntry;
+    LPWSTR lpServiceName;
+    UNICODE_STRING ServiceGroup;
 
-  ULONG Start;
-  ULONG Type;
-  ULONG ErrorControl;
-  ULONG Tag;
+    SERVICE_STATUS Status;
+    DWORD dwStartType;
+    DWORD dwErrorControl;
+    DWORD dwTag;
 
-  ULONG CurrentState;
-  ULONG ControlsAccepted;
-  ULONG Win32ExitCode;
-  ULONG ServiceSpecificExitCode;
-  ULONG CheckPoint;
-  ULONG WaitHint;
+    ULONG Flags;
 
-  BOOLEAN ServiceVisited;
+    BOOLEAN ServiceVisited;
 
-  HANDLE ControlPipeHandle;
-  ULONG ProcessId;
-  ULONG ThreadId;
+    HANDLE ControlPipeHandle;
+    ULONG ProcessId;
+    ULONG ThreadId;
+
+    WCHAR szServiceName[1];
 } SERVICE, *PSERVICE;
 
 
@@ -47,7 +43,7 @@
 VOID ScmGetBootAndSystemDriverState(VOID);
 VOID ScmAutoStartServices(VOID);
 
-PSERVICE ScmGetServiceEntryByName(PUNICODE_STRING ServiceName);
+PSERVICE ScmGetServiceEntryByName(LPWSTR lpServiceName);
 DWORD ScmMarkServiceForDelete(PSERVICE pService);