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