-/* $Id$
+/*
*
* service control manager
- *
+ *
* ReactOS Operating System
- *
+ *
* --------------------------------------------------------------------
*
* This software is free software; you can redistribute it and/or
/* INCLUDES *****************************************************************/
-#define NTOS_MODE_USER
-#include <ntos.h>
-#include <rosrtl/string.h>
-
#include <windows.h>
-#include <tchar.h>
+#define NTOS_MODE_USER
+#include <ndk/ntndk.h>
#include <services/services.h>
+
#include "services.h"
#define NDEBUG
} SERVICE_GROUP, *PSERVICE_GROUP;
-typedef struct _SERVICE
-{
- LIST_ENTRY ServiceListEntry;
- UNICODE_STRING ServiceName;
- UNICODE_STRING RegistryPath;
- UNICODE_STRING ServiceGroup;
+/* GLOBALS *******************************************************************/
- ULONG Start;
- ULONG Type;
- ULONG ErrorControl;
- ULONG Tag;
+LIST_ENTRY GroupListHead;
+LIST_ENTRY ServiceListHead;
- BOOLEAN ServiceRunning;
- BOOLEAN ServiceVisited;
+static RTL_RESOURCE DatabaseLock;
- HANDLE ControlPipeHandle;
- ULONG ProcessId;
- ULONG ThreadId;
-} SERVICE, *PSERVICE;
+/* FUNCTIONS *****************************************************************/
-/* GLOBALS *******************************************************************/
+PSERVICE
+ScmGetServiceEntryByName(PUNICODE_STRING ServiceName)
+{
+ PLIST_ENTRY ServiceEntry;
+ PSERVICE CurrentService;
-LIST_ENTRY GroupListHead;
-LIST_ENTRY ServiceListHead;
+ DPRINT("ScmGetServiceEntryByName() called\n");
+ ServiceEntry = ServiceListHead.Flink;
+ while (ServiceEntry != &ServiceListHead)
+ {
+ CurrentService = CONTAINING_RECORD(ServiceEntry,
+ SERVICE,
+ ServiceListEntry);
+ if (RtlEqualUnicodeString(&CurrentService->ServiceName, ServiceName, TRUE))
+ {
+ DPRINT("Found service: '%wZ'\n", &CurrentService->ServiceName);
+ return CurrentService;
+ }
+
+ ServiceEntry = ServiceEntry->Flink;
+ }
+
+ DPRINT("Couldn't find a matching service\n");
+
+ return NULL;
+}
-/* FUNCTIONS *****************************************************************/
static NTSTATUS STDCALL
CreateGroupOrderListRoutine(PWSTR ValueName,
- ULONG ValueType,
- PVOID ValueData,
- ULONG ValueLength,
- PVOID Context,
- PVOID EntryContext)
+ ULONG ValueType,
+ PVOID ValueData,
+ ULONG ValueLength,
+ PVOID Context,
+ PVOID EntryContext)
{
- PSERVICE_GROUP Group;
+ PSERVICE_GROUP Group;
- DPRINT("IopGetGroupOrderList(%S, %x, %x, %x, %x, %x)\n",
- ValueName, ValueType, ValueData, ValueLength, Context, EntryContext);
+ DPRINT("IopGetGroupOrderList(%S, %x, %x, %x, %x, %x)\n",
+ ValueName, ValueType, ValueData, ValueLength, Context, EntryContext);
- if (ValueType == REG_BINARY &&
- ValueData != NULL &&
- ValueLength >= sizeof(DWORD) &&
- ValueLength >= (*(PULONG)ValueData + 1) * sizeof(DWORD))
+ if (ValueType == REG_BINARY &&
+ ValueData != NULL &&
+ ValueLength >= sizeof(DWORD) &&
+ ValueLength >= (*(PULONG)ValueData + 1) * sizeof(DWORD))
{
- Group = (PSERVICE_GROUP)Context;
- Group->TagCount = ((PULONG)ValueData)[0];
- if (Group->TagCount > 0)
+ Group = (PSERVICE_GROUP)Context;
+ Group->TagCount = ((PULONG)ValueData)[0];
+ if (Group->TagCount > 0)
{
- if (ValueLength >= (Group->TagCount + 1) * sizeof(DWORD))
+ if (ValueLength >= (Group->TagCount + 1) * sizeof(DWORD))
{
- Group->TagArray = (PULONG)HeapAlloc(GetProcessHeap(),
- HEAP_ZERO_MEMORY,
- Group->TagCount * sizeof(DWORD));
- if (Group->TagArray == NULL)
- {
- Group->TagCount = 0;
- return STATUS_INSUFFICIENT_RESOURCES;
- }
- RtlCopyMemory(Group->TagArray,
- (PULONG)ValueData + 1,
- Group->TagCount * sizeof(DWORD));
- }
- else
- {
- Group->TagCount = 0;
- return STATUS_UNSUCCESSFUL;
- }
- }
+ Group->TagArray = (PULONG)HeapAlloc(GetProcessHeap(),
+ HEAP_ZERO_MEMORY,
+ Group->TagCount * sizeof(DWORD));
+ if (Group->TagArray == NULL)
+ {
+ Group->TagCount = 0;
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ RtlCopyMemory(Group->TagArray,
+ (PULONG)ValueData + 1,
+ Group->TagCount * sizeof(DWORD));
+ }
+ else
+ {
+ Group->TagCount = 0;
+ return STATUS_UNSUCCESSFUL;
+ }
+ }
}
- return STATUS_SUCCESS;
+
+ return STATUS_SUCCESS;
}
PVOID Context,
PVOID EntryContext)
{
- PSERVICE_GROUP Group;
- RTL_QUERY_REGISTRY_TABLE QueryTable[2];
- NTSTATUS Status;
+ PSERVICE_GROUP Group;
+ RTL_QUERY_REGISTRY_TABLE QueryTable[2];
+ NTSTATUS Status;
- if (ValueType == REG_SZ)
+ if (ValueType == REG_SZ)
{
- DPRINT("Data: '%S'\n", (PWCHAR)ValueData);
-
- Group = (PSERVICE_GROUP)HeapAlloc(GetProcessHeap(),
- HEAP_ZERO_MEMORY,
- sizeof(SERVICE_GROUP));
- if (Group == NULL)
- {
- return STATUS_INSUFFICIENT_RESOURCES;
- }
+ DPRINT("Data: '%S'\n", (PWCHAR)ValueData);
- if (!RtlCreateUnicodeString(&Group->GroupName,
- (PWSTR)ValueData))
- {
- return STATUS_INSUFFICIENT_RESOURCES;
- }
+ Group = (PSERVICE_GROUP)HeapAlloc(GetProcessHeap(),
+ HEAP_ZERO_MEMORY,
+ sizeof(SERVICE_GROUP));
+ if (Group == NULL)
+ {
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
- RtlZeroMemory(&QueryTable, sizeof(QueryTable));
- QueryTable[0].Name = (PWSTR)ValueData;
- QueryTable[0].QueryRoutine = CreateGroupOrderListRoutine;
+ if (!RtlCreateUnicodeString(&Group->GroupName,
+ (PWSTR)ValueData))
+ {
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
- Status = RtlQueryRegistryValues(RTL_REGISTRY_CONTROL,
- L"GroupOrderList",
- QueryTable,
- (PVOID)Group,
- NULL);
- DPRINT("%x %d %S\n", Status, Group->TagCount, (PWSTR)ValueData);
+ RtlZeroMemory(&QueryTable, sizeof(QueryTable));
+ QueryTable[0].Name = (PWSTR)ValueData;
+ QueryTable[0].QueryRoutine = CreateGroupOrderListRoutine;
+ Status = RtlQueryRegistryValues(RTL_REGISTRY_CONTROL,
+ L"GroupOrderList",
+ QueryTable,
+ (PVOID)Group,
+ NULL);
+ DPRINT("%x %d %S\n", Status, Group->TagCount, (PWSTR)ValueData);
- InsertTailList(&GroupListHead,
- &Group->GroupListEntry);
+ InsertTailList(&GroupListHead,
+ &Group->GroupListEntry);
}
- return STATUS_SUCCESS;
+ return STATUS_SUCCESS;
}
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 */
+
return STATUS_SUCCESS;
}
{
RTL_QUERY_REGISTRY_TABLE QueryTable[2];
OBJECT_ATTRIBUTES ObjectAttributes;
- UNICODE_STRING ServicesKeyName;
+ UNICODE_STRING ServicesKeyName =
+ RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet\\Services");
UNICODE_STRING SubKeyName;
HKEY ServicesKey;
ULONG Index;
InitializeListHead(&GroupListHead);
InitializeListHead(&ServiceListHead);
+ /* Initialize the database lock */
+ RtlInitializeResource(&DatabaseLock);
+
/* Build group order list */
RtlZeroMemory(&QueryTable,
sizeof(QueryTable));
if (!NT_SUCCESS(Status))
return Status;
- RtlRosInitUnicodeStringFromLiteral(&ServicesKeyName,
+ RtlInitUnicodeString(&ServicesKeyName,
L"\\Registry\\Machine\\System\\CurrentControlSet\\Services");
InitializeObjectAttributes(&ObjectAttributes,
if (Service->Type == SERVICE_KERNEL_DRIVER)
{
- RtlRosInitUnicodeStringFromLiteral(&DirName,
+ RtlInitUnicodeString(&DirName,
L"\\Driver");
}
else
{
- RtlRosInitUnicodeStringFromLiteral(&DirName,
+ RtlInitUnicodeString(&DirName,
L"\\FileSystem");
}
DPRINT("Found: '%wZ' '%wZ'\n", &Service->ServiceName, &DirInfo->ObjectName);
/* Mark service as 'running' */
- Service->ServiceRunning = TRUE;
+ Service->CurrentState = SERVICE_RUNNING;
/* Find the driver's group and mark it as 'running' */
if (Service->ServiceGroup.Buffer != NULL)
{
Group->ServicesRunning = TRUE;
}
- Service->ServiceRunning = TRUE;
+ Service->CurrentState = SERVICE_RUNNING;
}
#if 0
else
}
}
- /* Start all services which have an invalid tag or which do not have a tag */
+ /* Start all services which have an invalid tag or which do not have a tag */
ServiceEntry = ServiceListHead.Flink;
while (ServiceEntry != &ServiceListHead)
{
}
}
+
+DWORD
+ScmMarkServiceForDelete(PSERVICE pService)
+{
+ DPRINT1("ScmMarkServiceForDelete() called\n");
+
+ return ERROR_SUCCESS;
+}
+
/* EOF */