[FREELDR] Merge boot-drive and partition functionalities together (#6760)
[reactos.git] / base / system / services / services.h
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 PSECURITY_DESCRIPTOR pPipeSD;
106
107
108 /* FUNCTIONS ***************************************************************/
109
110 /* config.c */
111
112 DWORD ScmOpenServiceKey(LPWSTR lpServiceName,
113 REGSAM samDesired,
114 PHKEY phKey);
115
116 DWORD ScmCreateServiceKey(LPCWSTR lpServiceName,
117 REGSAM samDesired,
118 PHKEY phKey);
119
120 DWORD ScmWriteDependencies(HKEY hServiceKey,
121 LPCWSTR lpDependencies,
122 DWORD dwDependenciesLength);
123
124 DWORD ScmMarkServiceForDelete(PSERVICE pService);
125 BOOL ScmIsDeleteFlagSet(HKEY hServiceKey);
126
127 DWORD ScmReadString(HKEY hServiceKey,
128 LPCWSTR lpValueName,
129 LPWSTR *lpValue);
130
131 DWORD
132 ScmReadDependencies(HKEY hServiceKey,
133 LPWSTR *lpDependencies,
134 DWORD *lpdwDependenciesLength);
135
136 DWORD
137 ScmSetServicePassword(
138 IN PCWSTR pszServiceName,
139 IN PCWSTR pszPassword);
140
141 DWORD
142 ScmWriteSecurityDescriptor(
143 _In_ HKEY hServiceKey,
144 _In_ PSECURITY_DESCRIPTOR pSecurityDescriptor);
145
146 DWORD
147 ScmReadSecurityDescriptor(
148 _In_ HKEY hServiceKey,
149 _Out_ PSECURITY_DESCRIPTOR *ppSecurityDescriptor);
150
151 DWORD
152 ScmDeleteRegKey(
153 _In_ HKEY hKey,
154 _In_ PCWSTR pszSubKey);
155
156 DWORD
157 ScmDecryptPassword(
158 _In_ PVOID ContextHandle,
159 _In_ PBYTE pPassword,
160 _In_ DWORD dwPasswordSize,
161 _Out_ PWSTR *pDecryptedPassword);
162
163
164 /* controlset.c */
165
166 DWORD
167 ScmCreateLastKnownGoodControlSet(VOID);
168
169 DWORD
170 ScmAcceptBoot(VOID);
171
172 DWORD
173 ScmRunLastKnownGood(VOID);
174
175
176 /* database.c */
177
178 DWORD ScmCreateServiceDatabase(VOID);
179 VOID ScmShutdownServiceDatabase(VOID);
180 VOID ScmGetBootAndSystemDriverState(VOID);
181 VOID ScmAutoStartServices(VOID);
182 VOID ScmAutoShutdownServices(VOID);
183 DWORD ScmStartService(PSERVICE Service,
184 DWORD argc,
185 LPWSTR *argv);
186
187 VOID ScmRemoveServiceImage(PSERVICE_IMAGE pServiceImage);
188 PSERVICE ScmGetServiceEntryByName(LPCWSTR lpServiceName);
189 PSERVICE ScmGetServiceEntryByDisplayName(LPCWSTR lpDisplayName);
190 PSERVICE ScmGetServiceEntryByResumeCount(DWORD dwResumeCount);
191 DWORD ScmCreateNewServiceRecord(LPCWSTR lpServiceName,
192 PSERVICE *lpServiceRecord,
193 DWORD dwServiceType,
194 DWORD dwStartType);
195 VOID ScmDeleteServiceRecord(PSERVICE lpService);
196 DWORD ScmMarkServiceForDelete(PSERVICE pService);
197
198 DWORD ScmControlService(HANDLE hControlPipe,
199 PWSTR pServiceName,
200 SERVICE_STATUS_HANDLE hServiceStatus,
201 DWORD dwControl);
202
203 BOOL ScmLockDatabaseExclusive(VOID);
204 BOOL ScmLockDatabaseShared(VOID);
205 VOID ScmUnlockDatabase(VOID);
206
207 VOID ScmInitNamedPipeCriticalSection(VOID);
208 VOID ScmDeleteNamedPipeCriticalSection(VOID);
209
210 DWORD ScmGetServiceNameFromTag(PTAG_INFO_NAME_FROM_TAG_IN_PARAMS InParams,
211 PTAG_INFO_NAME_FROM_TAG_OUT_PARAMS *OutParams);
212
213 DWORD ScmGenerateServiceTag(PSERVICE lpServiceRecord);
214
215 /* driver.c */
216
217 DWORD ScmStartDriver(PSERVICE lpService);
218 DWORD ScmControlDriver(PSERVICE lpService,
219 DWORD dwControl,
220 LPSERVICE_STATUS lpServiceStatus);
221
222
223 /* groupdb.c */
224
225 PSERVICE_GROUP
226 ScmGetServiceGroupByName(
227 _In_ LPCWSTR lpGroupName);
228
229 DWORD ScmCreateGroupList(VOID);
230 DWORD ScmSetServiceGroup(PSERVICE lpService,
231 LPCWSTR lpGroupName);
232
233
234 /* lock.c */
235
236 DWORD ScmAcquireServiceStartLock(IN BOOL IsServiceController,
237 OUT LPSC_RPC_LOCK lpLock);
238 DWORD ScmReleaseServiceStartLock(IN OUT LPSC_RPC_LOCK lpLock);
239 VOID ScmQueryServiceLockStatusW(OUT LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus);
240 VOID ScmQueryServiceLockStatusA(OUT LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus);
241
242
243 /* rpcserver.c */
244
245 VOID ScmStartRpcServer(VOID);
246
247
248 /* security.c */
249
250 DWORD ScmInitializeSecurity(VOID);
251 VOID ScmShutdownSecurity(VOID);
252
253 DWORD
254 ScmCreateDefaultServiceSD(
255 PSECURITY_DESCRIPTOR *ppSecurityDescriptor);
256
257
258 /* services.c */
259
260 VOID PrintString(LPCSTR fmt, ...);
261 DWORD SetSecurityServicesEvent(VOID);
262 VOID ScmLogEvent(DWORD dwEventId,
263 WORD wType,
264 WORD wStrings,
265 LPCWSTR *lpStrings);
266 VOID ScmWaitForLsa(VOID);
267
268 #endif /* _SERVICES_H */