-/* $Id: database.c,v 1.14 2004/04/11 16:10:05 jfilby Exp $
+/* $Id: database.c,v 1.15 2004/04/12 17:14:54 navaraf Exp $
*
* service control manager
*
#include <debug.h>
-/* TYPES *********************************************************************/
-
-typedef struct _SERVICE_GROUP
-{
- LIST_ENTRY GroupListEntry;
- UNICODE_STRING GroupName;
-
- BOOLEAN ServicesRunning;
-
-} SERVICE_GROUP, *PSERVICE_GROUP;
-
-
-typedef struct _SERVICE
-{
- LIST_ENTRY ServiceListEntry;
- UNICODE_STRING ServiceName;
- UNICODE_STRING RegistryPath;
- UNICODE_STRING ServiceGroup;
-
- ULONG Start;
- ULONG Type;
- ULONG ErrorControl;
- ULONG Tag;
-
- BOOLEAN ServiceRunning;
- BOOLEAN ServiceVisited;
-
- HANDLE ControlPipeHandle;
- ULONG ProcessId;
- ULONG ThreadId;
-} SERVICE, *PSERVICE;
-
-
/* GLOBALS *******************************************************************/
LIST_ENTRY GroupListHead;
}
-static NTSTATUS STDCALL
-CreateServiceListEntry(PUNICODE_STRING ServiceName)
+PSERVICE FASTCALL
+ScmCreateServiceListEntry(PUNICODE_STRING ServiceName)
{
RTL_QUERY_REGISTRY_TABLE QueryTable[6];
PSERVICE Service = NULL;
sizeof(SERVICE));
if (Service == NULL)
{
- return(STATUS_INSUFFICIENT_RESOURCES);
+ return NULL;
}
/* Copy service name */
if (Service->ServiceName.Buffer == NULL)
{
HeapFree(GetProcessHeap(), 0, Service);
- return(STATUS_INSUFFICIENT_RESOURCES);
+ return NULL;
}
RtlCopyMemory(Service->ServiceName.Buffer,
ServiceName->Buffer,
{
HeapFree(GetProcessHeap(), 0, Service->ServiceName.Buffer);
HeapFree(GetProcessHeap(), 0, Service);
- return(STATUS_INSUFFICIENT_RESOURCES);
+ return NULL;
}
wcscpy(Service->RegistryPath.Buffer,
L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\");
RtlFreeUnicodeString(&Service->RegistryPath);
RtlFreeUnicodeString(&Service->ServiceName);
HeapFree(GetProcessHeap(), 0, Service);
- return(Status);
+ return NULL;
}
DPRINT("ServiceName: '%wZ'\n", &Service->ServiceName);
InsertTailList(&ServiceListHead,
&Service->ServiceListEntry);
- return(STATUS_SUCCESS);
+ return Service;
}
SubKeyName.Buffer[SubKeyName.Length / sizeof(WCHAR)] = 0;
DPRINT("KeyName: '%wZ'\n", &SubKeyName);
- Status = CreateServiceListEntry(&SubKeyName);
+ if (ScmCreateServiceListEntry(&SubKeyName) == NULL)
+ {
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
}
}
}
-static NTSTATUS
+NTSTATUS FASTCALL
ScmStartService(PSERVICE Service,
PSERVICE_GROUP Group)
{
}
#endif
- return(STATUS_SUCCESS);
+ return Status; //(STATUS_SUCCESS);
}
}
}
+/*
+ * FIXME: Doesn't work!!!
+ */
+PSERVICE FASTCALL
+ScmFindService(PUNICODE_STRING ServiceName)
+{
+ PSERVICE CurrentService;
+ PLIST_ENTRY ServiceEntry;
+
+ ServiceEntry = ServiceListHead.Flink;
+ while (ServiceEntry != &ServiceListHead)
+ {
+ CurrentService = CONTAINING_RECORD(ServiceEntry, SERVICE, ServiceListEntry);
+ if (!RtlCompareUnicodeString(ServiceName, &CurrentService->ServiceName, TRUE))
+ {
+ return CurrentService;
+ }
+ ServiceEntry = ServiceEntry->Flink;
+ }
+
+ return NULL;
+}
+
/* EOF */