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