Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296/* * services.h */
#ifndef _SERVICES_H#define _SERVICES_H
#include <stdio.h>#include <stdlib.h>
#define WIN32_NO_STATUS#define _INC_WINDOWS#define COM_NO_WINDOWS_H
#include <windef.h>#include <winbase.h>#include <winsvc.h>#include <winreg.h>#include <winuser.h>#include <netevent.h>
#define NTOS_MODE_USER#include <ndk/setypes.h>#include <ndk/obfuncs.h>#include <ndk/rtlfuncs.h>
#include <services/services.h>#include <svcctl_s.h>
#include "resource.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;
typedef struct _SERVICE_IMAGE{ LIST_ENTRY ImageListEntry; LPWSTR pszImagePath; LPWSTR pszAccountName; DWORD dwImageRunCount;
HANDLE hControlPipe; HANDLE hProcess; DWORD dwProcessId; HANDLE hToken; HANDLE hProfile;} SERVICE_IMAGE, *PSERVICE_IMAGE;
typedef struct _SERVICE{ LIST_ENTRY ServiceListEntry; LPWSTR lpServiceName; LPWSTR lpDisplayName; PSERVICE_GROUP lpGroup; PSERVICE_IMAGE lpImage; BOOL bDeleted; DWORD dwResumeCount; LONG RefCount;
SERVICE_STATUS Status; DWORD dwStartType; DWORD dwErrorControl; DWORD dwTag;
DWORD dwServiceBits; DWORD dwServiceTag;
ULONG Flags;
PSECURITY_DESCRIPTOR pSecurityDescriptor;
BOOLEAN ServiceVisited;
WCHAR szServiceName[1];} SERVICE, *PSERVICE;
#define LOCK_TAG 0x4C697041 /* 'ApiL' */
typedef struct _START_LOCK{ DWORD Tag; /* Must be LOCK_TAG */ DWORD TimeWhenLocked; /* Number of seconds since 1970 */ PSID LockOwnerSid; /* It is NULL if the SCM acquired the lock */} START_LOCK, *PSTART_LOCK;
/* VARIABLES ***************************************************************/
extern LIST_ENTRY ServiceListHead;extern LIST_ENTRY GroupListHead;extern LIST_ENTRY ImageListHead;extern BOOL ScmInitialize;extern BOOL ScmShutdown;extern BOOL ScmLiveSetup;extern BOOL ScmSetupInProgress;extern PSECURITY_DESCRIPTOR pPipeSD;
/* FUNCTIONS ***************************************************************/
/* config.c */
DWORD ScmOpenServiceKey(LPWSTR lpServiceName, REGSAM samDesired, PHKEY phKey);
DWORD ScmCreateServiceKey(LPCWSTR lpServiceName, REGSAM samDesired, PHKEY phKey);
DWORD ScmWriteDependencies(HKEY hServiceKey, LPCWSTR lpDependencies, DWORD dwDependenciesLength);
DWORD ScmMarkServiceForDelete(PSERVICE pService);BOOL ScmIsDeleteFlagSet(HKEY hServiceKey);
DWORD ScmReadString(HKEY hServiceKey, LPCWSTR lpValueName, LPWSTR *lpValue);
DWORDScmReadDependencies(HKEY hServiceKey, LPWSTR *lpDependencies, DWORD *lpdwDependenciesLength);
DWORDScmSetServicePassword( _In_ PCWSTR pszServiceName, _In_ PCWSTR pszPassword);
DWORDScmWriteSecurityDescriptor( _In_ HKEY hServiceKey, _In_ PSECURITY_DESCRIPTOR pSecurityDescriptor);
DWORDScmReadSecurityDescriptor( _In_ HKEY hServiceKey, _Out_ PSECURITY_DESCRIPTOR *ppSecurityDescriptor);
DWORDScmDeleteRegKey( _In_ HKEY hKey, _In_ PCWSTR pszSubKey);
DWORDScmDecryptPassword( _In_ PVOID ContextHandle, _In_ PBYTE pPassword, _In_ DWORD dwPasswordSize, _Out_ PWSTR *pDecryptedPassword);
/* controlset.c */
DWORDScmCreateLastKnownGoodControlSet(VOID);
DWORDScmAcceptBoot(VOID);
DWORDScmRunLastKnownGood(VOID);
/* database.c */
DWORD ScmCreateServiceDatabase(VOID);VOID ScmShutdownServiceDatabase(VOID);VOID ScmGetBootAndSystemDriverState(VOID);VOID ScmAutoStartServices(VOID);VOID ScmAutoShutdownServices(VOID);DWORD ScmStartService(PSERVICE Service, DWORD argc, const PCWSTR* argv);
DWORD ScmReferenceService(PSERVICE lpService);DWORD ScmDereferenceService(PSERVICE lpService);
VOID ScmRemoveServiceImage(PSERVICE_IMAGE pServiceImage);PSERVICE ScmGetServiceEntryByName(LPCWSTR lpServiceName);PSERVICE ScmGetServiceEntryByDisplayName(LPCWSTR lpDisplayName);PSERVICE ScmGetServiceEntryByResumeCount(DWORD dwResumeCount);DWORD ScmCreateNewServiceRecord(LPCWSTR lpServiceName, PSERVICE *lpServiceRecord, DWORD dwServiceType, DWORD dwStartType);VOID ScmDeleteServiceRecord(PSERVICE lpService);DWORD ScmMarkServiceForDelete(PSERVICE pService);
DWORDScmSendControlPacket( _In_ HANDLE hControlPipe, _In_ PCWSTR pServiceName, _In_ DWORD dwControl, _In_ DWORD dwControlpacketSize, _In_ PVOID pControlPacket);
DWORDScmControlServiceEx( _In_ HANDLE hControlPipe, _In_ PCWSTR pServiceName, _In_ DWORD dwControl, _In_ SERVICE_STATUS_HANDLE hServiceStatus, _In_opt_ DWORD dwServiceTag, _In_opt_ DWORD argc, _In_reads_opt_(argc) const PCWSTR* argv);
DWORDScmControlService( _In_ HANDLE hControlPipe, _In_ PCWSTR pServiceName, _In_ DWORD dwControl, _In_ SERVICE_STATUS_HANDLE hServiceStatus);
BOOL ScmLockDatabaseExclusive(VOID);BOOL ScmLockDatabaseShared(VOID);VOID ScmUnlockDatabase(VOID);
VOID ScmInitNamedPipeCriticalSection(VOID);VOID ScmDeleteNamedPipeCriticalSection(VOID);
DWORD ScmGetServiceNameFromTag(PTAG_INFO_NAME_FROM_TAG_IN_PARAMS InParams, PTAG_INFO_NAME_FROM_TAG_OUT_PARAMS *OutParams);
DWORD ScmGenerateServiceTag(PSERVICE lpServiceRecord);
/* driver.c */
DWORD ScmStartDriver(PSERVICE lpService);DWORD ScmControlDriver(PSERVICE lpService, DWORD dwControl, LPSERVICE_STATUS lpServiceStatus);
/* groupdb.c */
PSERVICE_GROUPScmGetServiceGroupByName( _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 ScmQueryServiceLockStatusW(OUT LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus);VOID ScmQueryServiceLockStatusA(OUT LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus);
/* rpcserver.c */
VOID ScmStartRpcServer(VOID);
/* security.c */
DWORD ScmInitializeSecurity(VOID);VOID ScmShutdownSecurity(VOID);
DWORDScmCreateDefaultServiceSD( PSECURITY_DESCRIPTOR *ppSecurityDescriptor);
/* services.c */
VOID PrintString(LPCSTR fmt, ...);DWORD SetSecurityServicesEvent(VOID);VOID ScmLogEvent(DWORD dwEventId, WORD wType, WORD wStrings, LPCWSTR *lpStrings);VOID ScmWaitForLsa(VOID);
#endif /* _SERVICES_H */