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