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