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