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