+/*
+ * services.h
+ */
+
+#include <stdio.h>
+#define WIN32_NO_STATUS
#include <windows.h>
#define NTOS_MODE_USER
#include <ndk/ntndk.h>
+#include <services/services.h>
+
+
+typedef struct _SERVICE_GROUP
+{
+ LIST_ENTRY GroupListEntry;
+ LPWSTR lpGroupName;
+
+ DWORD dwRefCount;
+ BOOLEAN ServicesRunning;
+ ULONG TagCount;
+ PULONG TagArray;
+
+ WCHAR szGroupName[1];
+} SERVICE_GROUP, *PSERVICE_GROUP;
-/*
- * services.h
- */
typedef struct _SERVICE
{
- LIST_ENTRY ServiceListEntry;
- UNICODE_STRING ServiceName;
- UNICODE_STRING RegistryPath;
- UNICODE_STRING ServiceGroup;
-
- ULONG Start;
- ULONG Type;
- ULONG ErrorControl;
- ULONG Tag;
-
- ULONG CurrentState;
- ULONG ControlsAccepted;
- ULONG Win32ExitCode;
- ULONG ServiceSpecificExitCode;
- ULONG CheckPoint;
- ULONG WaitHint;
-
- BOOLEAN ServiceVisited;
-
- HANDLE ControlPipeHandle;
- ULONG ProcessId;
- ULONG ThreadId;
+ LIST_ENTRY ServiceListEntry;
+ LPWSTR lpServiceName;
+ LPWSTR lpDisplayName;
+ LPWSTR lpServiceGroup;
+ BOOL bDeleted;
+ DWORD dwResumeCount;
+
+ SERVICE_STATUS Status;
+ DWORD dwStartType;
+ DWORD dwErrorControl;
+ DWORD dwTag;
+
+ ULONG Flags;
+
+ PSECURITY_DESCRIPTOR lpSecurityDescriptor;
+
+ BOOLEAN ServiceVisited;
+
+ HANDLE ControlPipeHandle;
+ ULONG ProcessId;
+ ULONG ThreadId;
+
+ WCHAR szServiceName[1];
} SERVICE, *PSERVICE;
-/* services.c */
+/* VARIABLES ***************************************************************/
-VOID PrintString(LPCSTR fmt, ...);
+extern LIST_ENTRY ServiceListHead;
+extern LIST_ENTRY GroupListHead;
+extern BOOL ScmShutdown;
+
+
+/* FUNCTIONS ***************************************************************/
+
+/* config.c */
+
+DWORD ScmOpenServiceKey(LPWSTR lpServiceName,
+ REGSAM samDesired,
+ PHKEY phKey);
+
+DWORD ScmCreateServiceKey(LPWSTR lpServiceName,
+ REGSAM samDesired,
+ PHKEY phKey);
+
+DWORD ScmWriteDependencies(HKEY hServiceKey,
+ LPWSTR lpDependencies,
+ DWORD dwDependenciesLength);
+
+DWORD ScmMarkServiceForDelete(PSERVICE pService);
+BOOL ScmIsDeleteFlagSet(HKEY hServiceKey);
+
+DWORD ScmReadString(HKEY hServiceKey,
+ LPWSTR lpValueName,
+ LPWSTR *lpValue);
/* database.c */
-NTSTATUS ScmCreateServiceDataBase(VOID);
+DWORD ScmCreateServiceDatabase(VOID);
VOID ScmGetBootAndSystemDriverState(VOID);
VOID ScmAutoStartServices(VOID);
-PSERVICE
-ScmGetServiceEntryByName(PUNICODE_STRING ServiceName);
+PSERVICE ScmGetServiceEntryByName(LPWSTR lpServiceName);
+PSERVICE ScmGetServiceEntryByDisplayName(LPWSTR lpDisplayName);
+PSERVICE ScmGetServiceEntryByResumeCount(DWORD dwResumeCount);
+DWORD ScmCreateNewServiceRecord(LPWSTR lpServiceName,
+ PSERVICE *lpServiceRecord);
+DWORD ScmMarkServiceForDelete(PSERVICE pService);
+
+
+/* driver.c */
+
+NTSTATUS ScmLoadDriver(PSERVICE lpService);
+DWORD ScmUnloadDriver(PSERVICE lpService);
+DWORD ScmControlDriver(PSERVICE lpService,
+ DWORD dwControl,
+ LPSERVICE_STATUS lpServiceStatus);
+
+
+/* groupdb.c */
+
+DWORD ScmCreateGroupList(VOID);
/* rpcserver.c */
VOID ScmStartRpcServer(VOID);
+/* services.c */
+
+VOID PrintString(LPCSTR fmt, ...);
+
+
+
/* EOF */