Reactos
at master 295 lines 7.0 kB view raw
1/* 2 * services.h 3 */ 4 5#ifndef _SERVICES_H 6#define _SERVICES_H 7 8#include <stdio.h> 9#include <stdlib.h> 10 11#define WIN32_NO_STATUS 12#define _INC_WINDOWS 13#define COM_NO_WINDOWS_H 14 15#include <windef.h> 16#include <winbase.h> 17#include <winsvc.h> 18#include <winreg.h> 19#include <winuser.h> 20#include <netevent.h> 21 22#define NTOS_MODE_USER 23#include <ndk/setypes.h> 24#include <ndk/obfuncs.h> 25#include <ndk/rtlfuncs.h> 26 27#include <services/services.h> 28#include <svcctl_s.h> 29 30#include "resource.h" 31 32typedef struct _SERVICE_GROUP 33{ 34 LIST_ENTRY GroupListEntry; 35 LPWSTR lpGroupName; 36 37 DWORD dwRefCount; 38 BOOLEAN ServicesRunning; 39 ULONG TagCount; 40 PULONG TagArray; 41 42 WCHAR szGroupName[1]; 43} SERVICE_GROUP, *PSERVICE_GROUP; 44 45 46typedef struct _SERVICE_IMAGE 47{ 48 LIST_ENTRY ImageListEntry; 49 LPWSTR pszImagePath; 50 LPWSTR pszAccountName; 51 DWORD dwImageRunCount; 52 53 HANDLE hControlPipe; 54 HANDLE hProcess; 55 DWORD dwProcessId; 56 HANDLE hToken; 57 HANDLE hProfile; 58} SERVICE_IMAGE, *PSERVICE_IMAGE; 59 60 61typedef struct _SERVICE 62{ 63 LIST_ENTRY ServiceListEntry; 64 LPWSTR lpServiceName; 65 LPWSTR lpDisplayName; 66 PSERVICE_GROUP lpGroup; 67 PSERVICE_IMAGE lpImage; 68 BOOL bDeleted; 69 DWORD dwResumeCount; 70 LONG RefCount; 71 72 SERVICE_STATUS Status; 73 DWORD dwStartType; 74 DWORD dwErrorControl; 75 DWORD dwTag; 76 77 DWORD dwServiceBits; 78 DWORD dwServiceTag; 79 80 ULONG Flags; 81 82 PSECURITY_DESCRIPTOR pSecurityDescriptor; 83 84 BOOLEAN ServiceVisited; 85 86 WCHAR szServiceName[1]; 87} SERVICE, *PSERVICE; 88 89 90#define LOCK_TAG 0x4C697041 /* 'ApiL' */ 91 92typedef struct _START_LOCK 93{ 94 DWORD Tag; /* Must be LOCK_TAG */ 95 DWORD TimeWhenLocked; /* Number of seconds since 1970 */ 96 PSID LockOwnerSid; /* It is NULL if the SCM acquired the lock */ 97} START_LOCK, *PSTART_LOCK; 98 99 100/* VARIABLES ***************************************************************/ 101 102extern LIST_ENTRY ServiceListHead; 103extern LIST_ENTRY GroupListHead; 104extern LIST_ENTRY ImageListHead; 105extern BOOL ScmInitialize; 106extern BOOL ScmShutdown; 107extern BOOL ScmLiveSetup; 108extern BOOL ScmSetupInProgress; 109extern PSECURITY_DESCRIPTOR pPipeSD; 110 111 112/* FUNCTIONS ***************************************************************/ 113 114/* config.c */ 115 116DWORD ScmOpenServiceKey(LPWSTR lpServiceName, 117 REGSAM samDesired, 118 PHKEY phKey); 119 120DWORD ScmCreateServiceKey(LPCWSTR lpServiceName, 121 REGSAM samDesired, 122 PHKEY phKey); 123 124DWORD ScmWriteDependencies(HKEY hServiceKey, 125 LPCWSTR lpDependencies, 126 DWORD dwDependenciesLength); 127 128DWORD ScmMarkServiceForDelete(PSERVICE pService); 129BOOL ScmIsDeleteFlagSet(HKEY hServiceKey); 130 131DWORD ScmReadString(HKEY hServiceKey, 132 LPCWSTR lpValueName, 133 LPWSTR *lpValue); 134 135DWORD 136ScmReadDependencies(HKEY hServiceKey, 137 LPWSTR *lpDependencies, 138 DWORD *lpdwDependenciesLength); 139 140DWORD 141ScmSetServicePassword( 142 _In_ PCWSTR pszServiceName, 143 _In_ PCWSTR pszPassword); 144 145DWORD 146ScmWriteSecurityDescriptor( 147 _In_ HKEY hServiceKey, 148 _In_ PSECURITY_DESCRIPTOR pSecurityDescriptor); 149 150DWORD 151ScmReadSecurityDescriptor( 152 _In_ HKEY hServiceKey, 153 _Out_ PSECURITY_DESCRIPTOR *ppSecurityDescriptor); 154 155DWORD 156ScmDeleteRegKey( 157 _In_ HKEY hKey, 158 _In_ PCWSTR pszSubKey); 159 160DWORD 161ScmDecryptPassword( 162 _In_ PVOID ContextHandle, 163 _In_ PBYTE pPassword, 164 _In_ DWORD dwPasswordSize, 165 _Out_ PWSTR *pDecryptedPassword); 166 167 168/* controlset.c */ 169 170DWORD 171ScmCreateLastKnownGoodControlSet(VOID); 172 173DWORD 174ScmAcceptBoot(VOID); 175 176DWORD 177ScmRunLastKnownGood(VOID); 178 179 180/* database.c */ 181 182DWORD ScmCreateServiceDatabase(VOID); 183VOID ScmShutdownServiceDatabase(VOID); 184VOID ScmGetBootAndSystemDriverState(VOID); 185VOID ScmAutoStartServices(VOID); 186VOID ScmAutoShutdownServices(VOID); 187DWORD ScmStartService(PSERVICE Service, 188 DWORD argc, 189 const PCWSTR* argv); 190 191DWORD ScmReferenceService(PSERVICE lpService); 192DWORD ScmDereferenceService(PSERVICE lpService); 193 194VOID ScmRemoveServiceImage(PSERVICE_IMAGE pServiceImage); 195PSERVICE ScmGetServiceEntryByName(LPCWSTR lpServiceName); 196PSERVICE ScmGetServiceEntryByDisplayName(LPCWSTR lpDisplayName); 197PSERVICE ScmGetServiceEntryByResumeCount(DWORD dwResumeCount); 198DWORD ScmCreateNewServiceRecord(LPCWSTR lpServiceName, 199 PSERVICE *lpServiceRecord, 200 DWORD dwServiceType, 201 DWORD dwStartType); 202VOID ScmDeleteServiceRecord(PSERVICE lpService); 203DWORD ScmMarkServiceForDelete(PSERVICE pService); 204 205DWORD 206ScmSendControlPacket( 207 _In_ HANDLE hControlPipe, 208 _In_ PCWSTR pServiceName, 209 _In_ DWORD dwControl, 210 _In_ DWORD dwControlpacketSize, 211 _In_ PVOID pControlPacket); 212 213DWORD 214ScmControlServiceEx( 215 _In_ HANDLE hControlPipe, 216 _In_ PCWSTR pServiceName, 217 _In_ DWORD dwControl, 218 _In_ SERVICE_STATUS_HANDLE hServiceStatus, 219 _In_opt_ DWORD dwServiceTag, 220 _In_opt_ DWORD argc, 221 _In_reads_opt_(argc) const PCWSTR* argv); 222 223DWORD 224ScmControlService( 225 _In_ HANDLE hControlPipe, 226 _In_ PCWSTR pServiceName, 227 _In_ DWORD dwControl, 228 _In_ SERVICE_STATUS_HANDLE hServiceStatus); 229 230BOOL ScmLockDatabaseExclusive(VOID); 231BOOL ScmLockDatabaseShared(VOID); 232VOID ScmUnlockDatabase(VOID); 233 234VOID ScmInitNamedPipeCriticalSection(VOID); 235VOID ScmDeleteNamedPipeCriticalSection(VOID); 236 237DWORD ScmGetServiceNameFromTag(PTAG_INFO_NAME_FROM_TAG_IN_PARAMS InParams, 238 PTAG_INFO_NAME_FROM_TAG_OUT_PARAMS *OutParams); 239 240DWORD ScmGenerateServiceTag(PSERVICE lpServiceRecord); 241 242/* driver.c */ 243 244DWORD ScmStartDriver(PSERVICE lpService); 245DWORD ScmControlDriver(PSERVICE lpService, 246 DWORD dwControl, 247 LPSERVICE_STATUS lpServiceStatus); 248 249 250/* groupdb.c */ 251 252PSERVICE_GROUP 253ScmGetServiceGroupByName( 254 _In_ LPCWSTR lpGroupName); 255 256DWORD ScmCreateGroupList(VOID); 257DWORD ScmSetServiceGroup(PSERVICE lpService, 258 LPCWSTR lpGroupName); 259 260 261/* lock.c */ 262 263DWORD ScmAcquireServiceStartLock(IN BOOL IsServiceController, 264 OUT LPSC_RPC_LOCK lpLock); 265DWORD ScmReleaseServiceStartLock(IN OUT LPSC_RPC_LOCK lpLock); 266VOID ScmQueryServiceLockStatusW(OUT LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus); 267VOID ScmQueryServiceLockStatusA(OUT LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus); 268 269 270/* rpcserver.c */ 271 272VOID ScmStartRpcServer(VOID); 273 274 275/* security.c */ 276 277DWORD ScmInitializeSecurity(VOID); 278VOID ScmShutdownSecurity(VOID); 279 280DWORD 281ScmCreateDefaultServiceSD( 282 PSECURITY_DESCRIPTOR *ppSecurityDescriptor); 283 284 285/* services.c */ 286 287VOID PrintString(LPCSTR fmt, ...); 288DWORD SetSecurityServicesEvent(VOID); 289VOID ScmLogEvent(DWORD dwEventId, 290 WORD wType, 291 WORD wStrings, 292 LPCWSTR *lpStrings); 293VOID ScmWaitForLsa(VOID); 294 295#endif /* _SERVICES_H */