#define _SERVICES_H
#include <stdio.h>
+#include <stdlib.h>
#define WIN32_NO_STATUS
#define _INC_WINDOWS
#include <winbase.h>
#include <winsvc.h>
#include <winreg.h>
+#include <winuser.h>
#include <netevent.h>
#define NTOS_MODE_USER
#include <ndk/obfuncs.h>
#include <services/services.h>
#include <svcctl_s.h>
+#include "resource.h"
+
typedef struct _SERVICE_GROUP
{
LIST_ENTRY GroupListEntry;
typedef struct _SERVICE_IMAGE
{
LIST_ENTRY ImageListEntry;
+ LPWSTR pszImagePath;
+ LPWSTR pszAccountName;
DWORD dwImageRunCount;
HANDLE hControlPipe;
HANDLE hProcess;
DWORD dwProcessId;
-
- WCHAR szImagePath[1];
+ HANDLE hToken;
+ HANDLE hProfile;
} SERVICE_IMAGE, *PSERVICE_IMAGE;
DWORD dwErrorControl;
DWORD dwTag;
+ DWORD dwServiceBits;
+
ULONG Flags;
- PSECURITY_DESCRIPTOR lpSecurityDescriptor;
+ PSECURITY_DESCRIPTOR pSecurityDescriptor;
BOOLEAN ServiceVisited;
{
DWORD Tag; /* Must be LOCK_TAG */
DWORD TimeWhenLocked; /* Number of seconds since 1970 */
- PSID LockOwnerSid; /* It is NULL if the SCM aquired the lock */
+ PSID LockOwnerSid; /* It is NULL if the SCM acquired the lock */
} START_LOCK, *PSTART_LOCK;
LPWSTR *lpDependencies,
DWORD *lpdwDependenciesLength);
+DWORD
+ScmSetServicePassword(
+ IN PCWSTR pszServiceName,
+ IN PCWSTR pszPassword);
+
+DWORD
+ScmWriteSecurityDescriptor(
+ _In_ HKEY hServiceKey,
+ _In_ PSECURITY_DESCRIPTOR pSecurityDescriptor);
+
+DWORD
+ScmReadSecurityDescriptor(
+ _In_ HKEY hServiceKey,
+ _Out_ PSECURITY_DESCRIPTOR *ppSecurityDescriptor);
+
+DWORD
+ScmDeleteRegKey(
+ _In_ HKEY hKey,
+ _In_ PCWSTR pszSubKey);
+
+DWORD
+ScmDecryptPassword(
+ _In_ PBYTE pPassword,
+ _In_ DWORD dwPasswordSize,
+ _Out_ PWSTR *pDecryptedPassword);
+
/* controlset.c */
DWORD argc,
LPWSTR *argv);
+VOID ScmRemoveServiceImage(PSERVICE_IMAGE pServiceImage);
PSERVICE ScmGetServiceEntryByName(LPCWSTR lpServiceName);
PSERVICE ScmGetServiceEntryByDisplayName(LPCWSTR lpDisplayName);
PSERVICE ScmGetServiceEntryByResumeCount(DWORD dwResumeCount);
DWORD ScmCreateNewServiceRecord(LPCWSTR lpServiceName,
- PSERVICE *lpServiceRecord);
+ PSERVICE *lpServiceRecord,
+ DWORD dwServiceType,
+ DWORD dwStartType);
VOID ScmDeleteServiceRecord(PSERVICE lpService);
DWORD ScmMarkServiceForDelete(PSERVICE pService);
-DWORD ScmControlService(PSERVICE Service,
+DWORD ScmControlService(HANDLE hControlPipe,
+ PWSTR pServiceName,
+ SERVICE_STATUS_HANDLE hServiceStatus,
DWORD dwControl);
BOOL ScmLockDatabaseExclusive(VOID);
/* driver.c */
-DWORD ScmLoadDriver(PSERVICE lpService);
-DWORD ScmUnloadDriver(PSERVICE lpService);
+DWORD ScmStartDriver(PSERVICE lpService);
DWORD ScmControlDriver(PSERVICE lpService,
DWORD dwControl,
LPSERVICE_STATUS lpServiceStatus);
/* groupdb.c */
+PSERVICE_GROUP
+ScmGetServiceGroupByName(
+ _In_ LPCWSTR lpGroupName);
+
DWORD ScmCreateGroupList(VOID);
DWORD ScmSetServiceGroup(PSERVICE lpService,
LPCWSTR lpGroupName);
/* lock.c */
+
DWORD ScmAcquireServiceStartLock(IN BOOL IsServiceController,
OUT LPSC_RPC_LOCK lpLock);
DWORD ScmReleaseServiceStartLock(IN OUT LPSC_RPC_LOCK lpLock);
VOID ScmStartRpcServer(VOID);
+/* security.c */
+
+DWORD ScmInitializeSecurity(VOID);
+VOID ScmShutdownSecurity(VOID);
+
+DWORD
+ScmCreateDefaultServiceSD(
+ PSECURITY_DESCRIPTOR *ppSecurityDescriptor);
+
+
/* services.c */
VOID PrintString(LPCSTR fmt, ...);
-VOID ScmLogError(DWORD dwEventId,
+VOID ScmLogEvent(DWORD dwEventId,
+ WORD wType,
WORD wStrings,
LPCWSTR *lpStrings);
VOID ScmWaitForLsa(VOID);