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