2 * Service Control Manager (SCM) interface definition
8 #define BYTE unsigned char
9 #define DWORD unsigned long
10 #define BOOL unsigned long
11 #define SC_HANDLE unsigned int
12 #define SC_LOCK unsigned int
13 #define SERVICE_STATUS_HANDLE unsigned long
14 #define SC_STATUS_TYPE unsigned long
15 #define SC_ENUM_TYPE unsigned long
18 #define LPWSTR wchar_t*
19 #define LPCWSTR wchar_t*
20 #define LPBYTE unsigned char*
21 #define LPDWORD unsigned long*
24 uuid(367abb81-9844-35f1-ad32-98f038001003),
26 pointer_default(unique),
32 typedef struct _SERVICE_STATUS
36 DWORD dwControlsAccepted;
37 DWORD dwWin32ExitCode;
38 DWORD dwServiceSpecificExitCode;
41 } SERVICE_STATUS, *LPSERVICE_STATUS;
45 DWORD ScmrCloseServiceHandle([in] handle_t BindingHandle,
46 [in] SC_HANDLE hSCObject);
49 DWORD ScmrControlService([in] handle_t BindingHandle,
50 [in] SC_HANDLE hService,
52 [out] SERVICE_STATUS *lpServiceStatus);
53 /* [out] LPSERVICE_STATUS lpServiceStatus); */
56 DWORD ScmrDeleteService([in] handle_t BindingHandle,
57 [in] SC_HANDLE hService);
60 DWORD ScmrLockServiceDatabase([in] handle_t BindingHandle,
61 [in] SC_HANDLE hSCManager,
62 [out] SC_LOCK *hLock);
65 DWORD ScmrQueryServiceObjectSecurity([in] handle_t BindingHandle,
66 [in] SC_HANDLE hService,
67 [in] DWORD dwSecurityInformation,
68 [out, size_is(dwSecuityDescriptorSize)] unsigned char *lpSecurityDescriptor,
69 [in] DWORD dwSecuityDescriptorSize,
70 [out] LPDWORD pcbBytesNeeded);
73 DWORD ScmrSetServiceObjectSecurity([in] handle_t BindingHandle,
74 [in] SC_HANDLE hService,
75 [in] DWORD dwSecurityInformation,
76 [in, size_is(dwSecuityDescriptorSize)] unsigned char *lpSecurityDescriptor,
77 [in] DWORD dwSecuityDescriptorSize);
80 DWORD ScmrQueryServiceStatus([in] handle_t BindingHandle,
81 [in] SC_HANDLE hSCManager,
82 [out] SERVICE_STATUS *lpServiceStatus);
83 /* [out] LPSERVICE_STATUS lpServiceStatus); */
86 DWORD ScmrSetServiceStatus([in] handle_t BindingHandle,
87 [in] SERVICE_STATUS_HANDLE hServiceStatus); /* FIXME */
90 DWORD ScmrUnlockServiceDatabase([in] handle_t BindingHandle,
94 DWORD ScmrNotifyBootConfigStatus([in] handle_t BindingHandle,
95 [in] BOOL BootAcceptable);
98 DWORD ScmrSetServiceBitsW([in] handle_t BindingHandle,
99 [in] SERVICE_STATUS_HANDLE hServiceStatus,
100 [in] DWORD dwServiceBits,
101 [in] BOOL bSetBitsOn,
102 [in] BOOL bUpdateImmediately,
103 [in, string, unique] LPWSTR lpString);
106 DWORD ScmrChangeServiceConfigW([in] handle_t BindingHandle,
107 [in] SC_HANDLE hSCManager,
108 [in] DWORD dwServiceType,
109 [in] DWORD dwStartType,
110 [in] DWORD dwErrorControl,
111 [in, string, unique] LPCWSTR lpBinaryPathName,
112 [in, string, unique] LPCWSTR lpLoadOrderGroup,
113 [in, out, unique] LPDWORD lpdwTagId,
114 [in, size_is(dwDependenciesLength), unique] LPCWSTR lpDependencies,
115 [in] DWORD dwDependenciesLength,
116 [in, string, unique] LPCWSTR lpServiceStartName,
117 [in, size_is(dwPasswordLength), unique] LPCWSTR lpPassword,
118 [in] DWORD dwPasswordLength,
119 [in, string, unique] LPCWSTR lpDisplayName);
122 DWORD ScmrCreateServiceW([in] handle_t BindingHandle,
123 [in] SC_HANDLE hSCManager,
124 [in, string, ref] LPCWSTR lpServiceName,
125 [in, string, unique] LPCWSTR lpDisplayName,
126 [in] DWORD dwDesiredAccess,
127 [in] DWORD dwServiceType,
128 [in] DWORD dwStartType,
129 [in] DWORD dwErrorControl,
130 [in, string, ref] LPCWSTR lpBinaryPathName,
131 [in, string, unique] LPCWSTR lpLoadOrderGroup,
132 [in, out, unique] LPDWORD lpdwTagId,
133 [in, size_is(dwDependenciesLength), unique] LPCWSTR lpDependencies,
134 [in] DWORD dwDependenciesLength,
135 [in, string, unique] LPCWSTR lpServiceStartName,
136 [in, size_is(dwPasswordLength), unique] LPCWSTR lpPassword,
137 [in] DWORD dwPasswordLength,
138 [out] SC_HANDLE *hService);
141 DWORD ScmrEnumDependentServicesW([in] handle_t BindingHandle,
142 [in] SC_HANDLE hService,
143 [in] DWORD dwServiceState,
144 [out, unique, size_is(cbBufSize)] LPBYTE lpServices,
145 [in] DWORD cbBufSize,
146 [out] LPDWORD pcbBytesNeeded,
147 [out] LPDWORD lpServicesReturned);
150 DWORD ScmrEnumServicesStatusW([in] handle_t BindingHandle,
151 [in] SC_HANDLE hSCManager,
152 [in] DWORD dwServiceType,
153 [in] DWORD dwServiceState,
154 [out, unique, size_is(dwBufSize)] LPBYTE lpServices,
155 [in] DWORD dwBufSize,
156 [out] LPDWORD pcbBytesNeeded,
157 [out] LPDWORD lpServicesReturned,
158 [in, out, unique] LPDWORD lpResumeHandle);
161 DWORD ScmrOpenSCManagerW([in] handle_t BindingHandle,
162 [in, string, unique] LPCWSTR lpMachineName,
163 [in, string, unique] LPCWSTR lpDatabaseName,
164 [in] DWORD dwDesiredAccess,
165 [out] SC_HANDLE *hScm);
168 DWORD ScmrOpenServiceW([in] handle_t BindingHandle,
169 [in] SC_HANDLE hSCManager,
170 [in, string] LPCWSTR lpServiceName,
171 [in] DWORD dwDesiredAccess,
172 [out] SC_HANDLE *hScm);
175 DWORD ScmrQueryServiceConfigW([in] handle_t BindingHandle,
176 [in] SC_HANDLE hService,
177 [out, unique, size_is(cbBufSize)] LPBYTE lpServiceConfig,
178 [in] DWORD cbBufSize,
179 [out] LPDWORD pcbBytesNeeded);
182 DWORD ScmrQueryServiceLockStatusW([in] handle_t BindingHandle,
183 [in] SC_HANDLE hSCManager,
184 [out, unique, size_is(cbBufSize)] LPBYTE lpLockStatus,
185 [in] DWORD cbBufSize,
186 [out] LPDWORD pcbBytesNeeded);
189 DWORD ScmrStartServiceW([in] handle_t BindingHandle,
190 [in] SC_HANDLE hService,
191 [in] DWORD dwNumServiceArgs,
192 [in, size_is(cbBufSize)] LPBYTE lpServiceArgBuffer,
193 [in] DWORD cbBufSize);
195 /* FIXME: This is the correct interface but WIDL doesn't support it yet! */
196 // DWORD ScmrStartServiceW([in] handle_t BindingHandle,
197 // [in] SC_HANDLE hService,
198 // [in] DWORD dwNumServiceArgs,
199 // [in, string, size_is(dwNumServiceArgs, ), unique] LPWSTR *lpServiceArgVectors);
202 DWORD ScmrGetServiceDisplayNameW([in] handle_t BindingHandle,
203 [in] SC_HANDLE hSCManager,
204 [in, string, ref] LPCWSTR lpServiceName,
205 [out, size_is(*lpcchBuffer), unique] LPWSTR lpDisplayName,
206 [in, out, ref] LPDWORD lpcchBuffer);
209 DWORD ScmrGetServiceKeyNameW([in] handle_t BindingHandle,
210 [in] SC_HANDLE hSCManager,
211 [in, string, ref] LPCWSTR lpDisplayName,
212 [out, size_is(*lpcchBuffer), unique] LPWSTR lpServiceName,
213 [in, out, ref] LPDWORD lpcchBuffer);
216 DWORD ScmrSetServiceBitsA([in] handle_t BindingHandle,
217 [in] SERVICE_STATUS_HANDLE hServiceStatus,
218 [in] DWORD dwServiceBits,
219 [in] BOOL bSetBitsOn,
220 [in] BOOL bUpdateImmediately,
221 [in, string, unique] LPSTR lpString);
224 DWORD ScmrChangeServiceConfigA([in] handle_t BindingHandle,
225 [in] SC_HANDLE hSCManager,
226 [in] DWORD dwServiceType,
227 [in] DWORD dwStartType,
228 [in] DWORD dwErrorControl,
229 [in, string, unique] LPCSTR lpBinaryPathName,
230 [in, string, unique] LPCSTR lpLoadOrderGroup,
231 [in, out, unique] LPDWORD lpdwTagId,
232 [in, size_is(dwDependenciesLength), unique] LPCSTR lpDependencies,
233 [in] DWORD dwDependenciesLength,
234 [in, string, unique] LPCSTR lpServiceStartName,
235 [in, size_is(dwPasswordLength), unique] LPCSTR lpPassword,
236 [in] DWORD dwPasswordLength,
237 [in, string, unique] LPCSTR lpDisplayName);
240 DWORD ScmrCreateServiceA([in] handle_t BindingHandle,
241 [in] SC_HANDLE hSCManager,
242 [in, string, ref] LPCSTR lpServiceName,
243 [in, string, unique] LPCSTR lpDisplayName,
244 [in] DWORD dwDesiredAccess,
245 [in] DWORD dwServiceType,
246 [in] DWORD dwStartType,
247 [in] DWORD dwErrorControl,
248 [in, string, ref] LPCSTR lpBinaryPathName,
249 [in, string, unique] LPCSTR lpLoadOrderGroup,
250 [in, out, unique] LPDWORD lpdwTagId,
251 [in, size_is(dwDependenciesLength), unique] LPCSTR lpDependencies,
252 [in] DWORD dwDependenciesLength,
253 [in, string, unique] LPCSTR lpServiceStartName,
254 [in, size_is(dwPasswordLength), unique] LPCSTR lpPassword,
255 [in] DWORD dwPasswordLength,
256 [out] SC_HANDLE *hService);
259 DWORD ScmrEnumDependentServicesA([in] handle_t BindingHandle,
260 [in] SC_HANDLE hService,
261 [in] DWORD dwServiceState,
262 [out, unique, size_is(cbBufSize)] LPBYTE lpServices,
263 [in] DWORD cbBufSize,
264 [out] LPDWORD pcbBytesNeeded,
265 [out] LPDWORD lpServicesReturned);
268 DWORD ScmrEnumServicesStatusA([in] handle_t BindingHandle,
269 [in] SC_HANDLE hSCManager,
270 [in] DWORD dwServiceType,
271 [in] DWORD dwServiceState,
272 [out, unique, size_is(dwBufSize)] LPBYTE lpServices,
273 [in] DWORD dwBufSize,
274 [out] LPDWORD pcbBytesNeeded,
275 [out] LPDWORD lpServicesReturned,
276 [in, out, unique] LPDWORD lpResumeHandle);
279 DWORD ScmrOpenSCManagerA([in] handle_t BindingHandle,
280 [in, string, unique] LPCSTR lpMachineName,
281 [in, string, unique] LPCSTR lpDatabaseName,
282 [in] DWORD dwDesiredAccess,
283 [out] SC_HANDLE *hScm);
286 SC_HANDLE ScmrOpenServiceA([in] handle_t BindingHandle,
287 [in] SC_HANDLE hSCManager,
288 [in, string] LPCSTR lpServiceName,
289 [in] DWORD dwDesiredAccess,
290 [out] SC_HANDLE *hScm);
293 DWORD ScmrQueryServiceConfigA([in] handle_t BindingHandle,
294 [in] SC_HANDLE hService,
295 [out, unique, size_is(cbBufSize)] LPBYTE lpServiceConfig,
296 [in] DWORD cbBufSize,
297 [out] LPDWORD pcbBytesNeeded);
300 DWORD ScmrQueryServiceLockStatusA([in] handle_t BindingHandle,
301 [in] SC_HANDLE hSCManager,
302 [out, unique, size_is(cbBufSize)] LPBYTE lpLockStatus,
303 [in] DWORD cbBufSize,
304 [out] LPDWORD pcbBytesNeeded);
307 DWORD ScmrStartServiceA([in] handle_t BindingHandle,
308 [in] SC_HANDLE hService,
309 [in] DWORD dwNumServiceArgs,
310 [in, size_is(cbBufSize)] LPBYTE lpServiceArgBuffer,
311 [in] DWORD cbBufSize);
313 /* FIXME: This is the correct interface but WIDL doesn't support it yet! */
314 // DWORD ScmrStartServiceA([in] handle_t BindingHandle,
315 // [in] SC_HANDLE hService,
316 // [in] DWORD dwNumServiceArgs,
317 // [in, unique, string, size_is(dwNumServiceArgs, )] LPSTR *lpServiceArgVectors);
320 DWORD ScmrGetServiceDisplayNameA([in] handle_t BindingHandle,
321 [in] SC_HANDLE hSCManager,
322 [in, string, ref] LPCSTR lpServiceName,
323 [out, unique, size_is(*lpcchBuffer)] LPSTR lpDisplayName,
324 [in, out, ref] LPDWORD lpcchBuffer);
327 DWORD ScmrGetServiceKeyNameA([in] handle_t BindingHandle,
328 [in] SC_HANDLE hSCManager,
329 [in, string, ref] LPCSTR lpDisplayName,
330 [out, unique, size_is(*lpcchBuffer)] LPSTR lpServiceName,
331 [in, out, ref] LPDWORD lpcchBuffer);
334 DWORD ScmrGetCurrentGroupStateW([in] handle_t BindingHandle); /* FIXME */
337 DWORD ScmrEnumServiceGroupW([in] handle_t BindingHandle); /* FIXME */
340 DWORD ScmrChangeServiceConfig2A([in] handle_t BindingHandle,
341 [in] SC_HANDLE hService,
342 [in] DWORD dwInfoLevel,
343 [in, size_is(dwInfoSize)] LPBYTE lpInfo,
344 [in] DWORD dwInfoSize);
347 DWORD ScmrChangeServiceConfig2W([in] handle_t BindingHandle,
348 [in] SC_HANDLE hService,
349 [in] DWORD dwInfoLevel,
350 [in, size_is(dwInfoSize)] LPBYTE lpInfo,
351 [in] DWORD dwInfoSize);
354 DWORD ScmrQueryServiceConfig2A([in] handle_t BindingHandle,
355 [in] SC_HANDLE hService,
356 [in] DWORD dwInfoLevel,
357 [out, unique, size_is(cbBufSize)] LPBYTE lpBuffer,
358 [in] DWORD cbBufSize,
359 [out] LPDWORD pcbBytesNeeded);
362 DWORD ScmrQueryServiceConfig2W([in] handle_t BindingHandle,
363 [in] SC_HANDLE hService,
364 [in] DWORD dwInfoLevel,
365 [out, unique, size_is(cbBufSize)] LPBYTE lpBuffer,
366 [in] DWORD cbBufSize,
367 [out] LPDWORD pcbBytesNeeded);
370 DWORD ScmrQueryServiceStatusEx([in] handle_t BindingHandle,
371 [in] SC_HANDLE hService,
372 [in] SC_STATUS_TYPE InfoLevel,
373 [out, unique, size_is(cbBufSize)] LPBYTE lpBuffer,
374 [in] DWORD cbBufSize,
375 [out] LPDWORD pcbBytesNeeded);
378 DWORD ScmrEnumServicesStatusExA([in] handle_t BindingHandle,
379 [in] SC_HANDLE hService,
380 [in] SC_ENUM_TYPE InfoLevel,
381 [in] DWORD dwServiceType,
382 [in] DWORD dwServiceState,
383 [out, unique, size_is(cbBufSize)] LPBYTE lpServices,
384 [in] DWORD cbBufSize,
385 [out] LPDWORD pcbBytesNeeded,
386 [out] LPDWORD lpServicesReturned,
387 [in, out, unique] LPDWORD lpResumeHandle,
388 [in, string, unique] LPCSTR pszGroupName);
391 DWORD ScmrEnumServicesStatusExW([in] handle_t BindingHandle,
392 [in] SC_HANDLE hService,
393 [in] SC_ENUM_TYPE InfoLevel,
394 [in] DWORD dwServiceType,
395 [in] DWORD dwServiceState,
396 [out, unique, size_is(cbBufSize)] LPBYTE lpServices,
397 [in] DWORD cbBufSize,
398 [out] LPDWORD pcbBytesNeeded,
399 [out] LPDWORD lpServicesReturned,
400 [in, out, unique] LPDWORD lpResumeHandle,
401 [in, string, unique] LPCWSTR pszGroupName);
404 /* ScmrSendTSMessage */