0eda7ca019fcbd8c9db5f345b4ca56f77246f175
[reactos.git] / reactos / 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/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 DWORD dwImageRunCount;
47
48 HANDLE hControlPipe;
49 HANDLE hProcess;
50 DWORD dwProcessId;
51
52 WCHAR szImagePath[1];
53 } SERVICE_IMAGE, *PSERVICE_IMAGE;
54
55
56 typedef struct _SERVICE
57 {
58 LIST_ENTRY ServiceListEntry;
59 LPWSTR lpServiceName;
60 LPWSTR lpDisplayName;
61 PSERVICE_GROUP lpGroup;
62 PSERVICE_IMAGE lpImage;
63 BOOL bDeleted;
64 DWORD dwResumeCount;
65 DWORD dwRefCount;
66
67 SERVICE_STATUS Status;
68 DWORD dwStartType;
69 DWORD dwErrorControl;
70 DWORD dwTag;
71
72 ULONG Flags;
73
74 PSECURITY_DESCRIPTOR lpSecurityDescriptor;
75
76 BOOLEAN ServiceVisited;
77
78 WCHAR szServiceName[1];
79 } SERVICE, *PSERVICE;
80
81
82 #define LOCK_TAG 0x4C697041 /* 'ApiL' */
83
84 typedef struct _START_LOCK
85 {
86 DWORD Tag; /* Must be LOCK_TAG */
87 DWORD TimeWhenLocked; /* Number of seconds since 1970 */
88 PSID LockOwnerSid; /* It is NULL if the SCM aquired the lock */
89 } START_LOCK, *PSTART_LOCK;
90
91
92 /* VARIABLES ***************************************************************/
93
94 extern LIST_ENTRY ServiceListHead;
95 extern LIST_ENTRY GroupListHead;
96 extern LIST_ENTRY ImageListHead;
97 extern BOOL ScmInitialize;
98 extern BOOL ScmShutdown;
99
100
101 /* FUNCTIONS ***************************************************************/
102
103 /* config.c */
104
105 DWORD ScmOpenServiceKey(LPWSTR lpServiceName,
106 REGSAM samDesired,
107 PHKEY phKey);
108
109 DWORD ScmCreateServiceKey(LPCWSTR lpServiceName,
110 REGSAM samDesired,
111 PHKEY phKey);
112
113 DWORD ScmWriteDependencies(HKEY hServiceKey,
114 LPCWSTR lpDependencies,
115 DWORD dwDependenciesLength);
116
117 DWORD ScmMarkServiceForDelete(PSERVICE pService);
118 BOOL ScmIsDeleteFlagSet(HKEY hServiceKey);
119
120 DWORD ScmReadString(HKEY hServiceKey,
121 LPCWSTR lpValueName,
122 LPWSTR *lpValue);
123
124 DWORD
125 ScmReadDependencies(HKEY hServiceKey,
126 LPWSTR *lpDependencies,
127 DWORD *lpdwDependenciesLength);
128
129
130 /* controlset.c */
131
132 BOOL ScmGetControlSetValues(VOID);
133
134
135 /* database.c */
136
137 DWORD ScmCreateServiceDatabase(VOID);
138 VOID ScmShutdownServiceDatabase(VOID);
139 VOID ScmGetBootAndSystemDriverState(VOID);
140 VOID ScmAutoStartServices(VOID);
141 VOID ScmAutoShutdownServices(VOID);
142 DWORD ScmStartService(PSERVICE Service,
143 DWORD argc,
144 LPWSTR *argv);
145
146 PSERVICE ScmGetServiceEntryByName(LPCWSTR lpServiceName);
147 PSERVICE ScmGetServiceEntryByDisplayName(LPCWSTR lpDisplayName);
148 PSERVICE ScmGetServiceEntryByResumeCount(DWORD dwResumeCount);
149 DWORD ScmCreateNewServiceRecord(LPCWSTR lpServiceName,
150 PSERVICE *lpServiceRecord);
151 VOID ScmDeleteServiceRecord(PSERVICE lpService);
152 DWORD ScmMarkServiceForDelete(PSERVICE pService);
153
154 DWORD ScmControlService(PSERVICE Service,
155 DWORD dwControl);
156
157 BOOL ScmLockDatabaseExclusive(VOID);
158 BOOL ScmLockDatabaseShared(VOID);
159 VOID ScmUnlockDatabase(VOID);
160
161 VOID ScmInitNamedPipeCriticalSection(VOID);
162 VOID ScmDeleteNamedPipeCriticalSection(VOID);
163
164
165 /* driver.c */
166
167 DWORD ScmLoadDriver(PSERVICE lpService);
168 DWORD ScmUnloadDriver(PSERVICE lpService);
169 DWORD ScmControlDriver(PSERVICE lpService,
170 DWORD dwControl,
171 LPSERVICE_STATUS lpServiceStatus);
172
173
174 /* groupdb.c */
175
176 DWORD ScmCreateGroupList(VOID);
177 DWORD ScmSetServiceGroup(PSERVICE lpService,
178 LPCWSTR lpGroupName);
179
180
181 /* lock.c */
182
183 DWORD ScmAcquireServiceStartLock(IN BOOL IsServiceController,
184 OUT LPSC_RPC_LOCK lpLock);
185 DWORD ScmReleaseServiceStartLock(IN OUT LPSC_RPC_LOCK lpLock);
186 VOID ScmQueryServiceLockStatusW(OUT LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus);
187 VOID ScmQueryServiceLockStatusA(OUT LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus);
188
189
190 /* rpcserver.c */
191
192 VOID ScmStartRpcServer(VOID);
193
194
195 /* services.c */
196
197 VOID PrintString(LPCSTR fmt, ...);
198 VOID ScmLogEvent(DWORD dwEventId,
199 WORD wType,
200 WORD wStrings,
201 LPCWSTR *lpStrings);
202 VOID ScmWaitForLsa(VOID);
203
204 #endif /* _SERVICES_H */