xref: /reactos/base/system/services/services.h (revision b36d9bd9)
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