1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 *
25 * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
26 */
27
28 #ifndef _MLSVC_SVCCTL_NDL_
29 #define _MLSVC_SVCCTL_NDL_
30
31 /*
32 * NT Service Control Services (SVCCTL) RPC interface definition.
33 * This interface provides remote access to add, remove, start and
34 * stop services.
35 */
36
37 #include <libmlrpc/ndrtypes.ndl>
38
39 /* Windows NT */
40 #define SVCCTL_OPNUM_Close 0x00
41 #define SVCCTL_OPNUM_ControlService 0x01
42 #define SVCCTL_OPNUM_DeleteService 0x02
43 #define SVCCTL_OPNUM_LockServiceDatabase 0x03
44 #define SVCCTL_OPNUM_QueryServiceSecurity 0x04
45 #define SVCCTL_OPNUM_SetServiceSecurity 0x05
46 #define SVCCTL_OPNUM_QueryServiceStatus 0x06
47 #define SVCCTL_OPNUM_SetServiceStatus 0x07
48 #define SVCCTL_OPNUM_UnlockServiceDatabase 0x08
49 #define SVCCTL_OPNUM_NotifyBootConfigStatus 0x09
50 #define SVCCTL_OPNUM_SetServiceBits 0x0a
51 #define SVCCTL_OPNUM_ChangeServiceConfig 0x0b
52 #define SVCCTL_OPNUM_CreateService 0x0c
53 #define SVCCTL_OPNUM_EnumDependentServices 0x0d
54 #define SVCCTL_OPNUM_EnumServicesStatus 0x0E
55 #define SVCCTL_OPNUM_OpenManager 0x0F
56 #define SVCCTL_OPNUM_OpenService 0x10
57 #define SVCCTL_OPNUM_QueryServiceConfig 0x11
58 #define SVCCTL_OPNUM_QueryServiceLockStatus 0x12
59 #define SVCCTL_OPNUM_StartService 0x13
60 #define SVCCTL_OPNUM_GetServiceDisplayNameW 0x14
61 #define SVCCTL_OPNUM_GetServiceKeyNameW 0x15
62 #define SVCCTL_OPNUM_SetServiceBitsA 0x16
63 #define SVCCTL_OPNUM_ChangeServiceConfigA 0x17
64 #define SVCCTL_OPNUM_CreateServiceA 0x18
65 #define SVCCTL_OPNUM_EnumDependentServicesA 0x19
66 #define SVCCTL_OPNUM_EnumServicesStatusA 0x1a
67 #define SVCCTL_OPNUM_OpenSCManagerA 0x1b
68 #define SVCCTL_OPNUM_OpenServiceA 0x1c
69 #define SVCCTL_OPNUM_QueryServiceConfigA 0x1d
70 #define SVCCTL_OPNUM_QueryServiceLockStatusA 0x1e
71 #define SVCCTL_OPNUM_StartServiceA 0x1f
72 #define SVCCTL_OPNUM_GetServiceDisplayNameA 0x20
73 #define SVCCTL_OPNUM_GetServiceKeyNameA 0x21
74 #define SVCCTL_OPNUM_GetCurrentGroupStateW 0x22
75 #define SVCCTL_OPNUM_EnumServiceGroupW 0x23
76 #define SVCCTL_OPNUM_ChangeServiceConfig2A 0x24
77 #define SVCCTL_OPNUM_ChangeServiceConfig2W 0x25
78 #define SVCCTL_OPNUM_QueryServiceConfig2A 0x26
79
80 /* Windows 2000 */
81 #define SVCCTL_OPNUM_QueryServiceConfig2W 0x27
82 #define SVCCTL_OPNUM_QueryServiceStatusEx 0x28
83 #define SVCCTL_OPNUM_EnumServicesStatusExA 0x29
84 #define SVCCTL_OPNUM_EnumServicesStatusExW 0x2a
85
86 /* Windows XP and Windows Server 2003 */
87 #define SVCCTL_OPNUM_SendTSMessage 0x2b
88
89 /* Windows Vista */
90 #define SVCCTL_OPNUM_CreateServiceWOW64A 0x2c
91 #define SVCCTL_OPNUM_CreateServiceWOW64W 0x2d
92 #define SVCCTL_OPNUM_QueryServiceTagInfo 0x2e
93 #define SVCCTL_OPNUM_NotifyServiceStatusChange 0x2f
94 #define SVCCTL_OPNUM_GetNotifyResult 0x30
95 #define SVCCTL_OPNUM_CloseNotifyHandle 0x31
96 #define SVCCTL_OPNUM_ControlServiceExA 0x32
97 #define SVCCTL_OPNUM_ControlServiceExW 0x33
98 #define SVCCTL_OPNUM_SendPnPMessage 0x34
99 #define SVCCTL_OPNUM_ValidatePnPService 0x35
100 #define SVCCTL_OPNUM_OpenServiceStatusHandle 0x36
101
102 CONTEXT_HANDLE(svcctl_handle) svcctl_handle_t;
103
104 /*
105 * String definition for the ASCII interface.
106 */
107 struct svcctl_value {
108 DWORD vc_first_is; /* 0 */
109 DWORD vc_length_is;
110 SIZE_IS(vc_length_is)
111 BYTE value[ANY_SIZE_ARRAY];
112 };
113
114 /*
115 * The svc_status (SERVICE_STATUS) structure contains information about a
116 * service. The ControlService, EnumDependentServices, EnumServicesStatus,
117 * and QueryServiceStatus functions use this structure to return information
118 * about a service. A service uses this structure in the SetServiceStatus
119 * function to report its current status to the service control manager.
120 *
121 * service_type
122 * The type of service. This member can be one of the following values.
123 *
124 * SERVICE_FILE_SYSTEM_DRIVER
125 * SERVICE_KERNEL_DRIVER
126 * SERVICE_WIN32_OWN_PROCESS
127 * SERVICE_WIN32_SHARE_PROCESS
128 *
129 * If the service type is either SERVICE_WIN32_OWN_PROCESS or
130 * SERVICE_WIN32_SHARE_PROCESS, and the service is running in
131 * the context of the LocalSystem account, the following type
132 * may also be specified to indicate that the service can
133 * interact with the desktop.
134 *
135 * SERVICE_INTERACTIVE_PROCESS
136 *
137 * cur_state
138 * The current state of the service. This member can be one of the
139 * following values.
140 *
141 * SERVICE_CONTINUE_PENDING
142 * SERVICE_PAUSE_PENDING
143 * SERVICE_PAUSED
144 * SERVICE_RUNNING
145 * SERVICE_START_PENDING
146 * SERVICE_STOP_PENDING
147 * SERVICE_STOPPED
148 *
149 * ctrl_accepted
150 * The control codes that the service will accept and process in its
151 * handler function (see Handler and HandlerEx). A user interface
152 * process can control a service by specifying a control command in
153 * the ControlService function. By default, all services accept the
154 * SERVICE_CONTROL_INTERROGATE value. The following are the control
155 * codes.
156 *
157 * SERVICE_ACCEPT_STOP
158 * SERVICE_ACCEPT_PAUSE_CONTINUE
159 * SERVICE_ACCEPT_SHUTDOWN
160 * SERVICE_ACCEPT_PARAMCHANGE
161 * SERVICE_ACCEPT_NETBINDCHANGE
162 *
163 * w32_exitcode
164 * An error code that the service uses to report an error that occurs when
165 * it is starting or stopping. To return an error code specific to the
166 * service, the service must set this value to ERROR_SERVICE_SPECIFIC_ERROR
167 * to indicate that the dwServiceSpecificExitCode member contains the error
168 * code. The service should set this value to NO_ERROR when it is running
169 * and on normal termination.
170 *
171 * svc_specified_exitcode
172 * A service-specific error code that the service returns when an error
173 * occurs while the service is starting or stopping. This value is ignored
174 * unless the w32_exitcode member is set to ERROR_SERVICE_SPECIFIC_ERROR.
175 *
176 * check_point
177 * A value that the service increments periodically to report its progress
178 * during a lengthy start, stop, pause, or continue operation. For example,
179 * the service should increment this value as it completes each step of its
180 * initialization when it is starting up. The user interface program that
181 * invoked the operation on the service uses this value to track the progress
182 * of the service during a lengthy operation. This value is not valid and
183 * should be zero when the service does not have a start, stop, pause, or
184 * continue operation pending.
185 *
186 * wait_hint
187 * An estimate of the amount of time, in milliseconds, that the service
188 * expects a pending start, stop, pause, or continue operation to take
189 * before the service makes its next call to the SetServiceStatus
190 * function with either an incremented check_point value or a change in
191 * dwCurrentState. If the amount of time specified by wait_hint passes,
192 * and check_point has not been incremented, or cur_state has not changed,
193 * the service control manager or service control program can assume that
194 * an error has occurred and the service should be stopped.
195 */
196 struct svc_status {
197 DWORD service_type;
198 DWORD cur_state;
199 DWORD ctrl_accepted;
200 DWORD w32_exitcode;
201 DWORD svc_specified_exitcode;
202 DWORD check_point;
203 DWORD wait_hint;
204 };
205 typedef struct svc_status svc_status_t;
206
207 struct svc_enum_status {
208 DWORD svc_name; /* offset within response buffer */
209 DWORD display_name; /* offset within response buffer */
210 svc_status_t svc_status;
211 };
212 typedef struct svc_enum_status svc_enum_status_t;
213
214 struct svc_config {
215 DWORD service_type;
216 DWORD start_type;
217 DWORD error_control;
218 LPTSTR binary_pathname;
219 LPTSTR loadorder_group;
220 DWORD tag_id;
221 LPTSTR dependencies;
222 LPTSTR service_startname;
223 LPTSTR display_name;
224 };
225 typedef struct svc_config svc_config_t;
226
227 struct svc_failure_actions {
228 DWORD reset_period;
229 DWORD rebootmsg_offset;
230 DWORD command_offset;
231 DWORD actions;
232 DWORD actions_offset;
233 };
234 typedef struct svc_failure_actions svc_failure_actions_t;
235
236 struct svc_description {
237 DWORD desc; /* offset of description string */
238 };
239 typedef struct svc_description svc_description_t;
240
241 /* Boolean flag to control delayed start of service. Set 1=true, 0=false */
242 struct svc_delayed_auto_start {
243 DWORD dstart;
244 };
245 typedef struct svc_delayed_auto_start svc_delayed_auto_start_t;
246
247 /* Boolean flag to control configured failure action. Set 1=true, 0=false */
248 struct svc_config_failure_action {
249 DWORD cfa;
250 };
251 typedef struct svc_config_failure_action svc_config_failure_action_t;
252
253 /*
254 ***********************************************************************
255 * Close
256 ***********************************************************************
257 */
258 OPERATION(SVCCTL_OPNUM_Close)
259 struct svcctl_Close {
260 IN svcctl_handle_t handle;
261 OUT svcctl_handle_t result_handle;
262 OUT DWORD status;
263 };
264
265 /*
266 ***********************************************************************
267 * ControlService
268 ***********************************************************************
269 */
270 OPERATION(SVCCTL_OPNUM_ControlService)
271 struct svcctl_ControlService {
272 IN svcctl_handle_t service_handle;
273 IN DWORD control;
274 OUT svc_status_t service_status;
275 OUT DWORD status;
276 };
277
278 /*
279 ***********************************************************************
280 * DeleteService
281 ***********************************************************************
282 */
283 OPERATION(SVCCTL_OPNUM_DeleteService)
284 struct svcctl_DeleteService {
285 IN svcctl_handle_t service_handle;
286 OUT DWORD status;
287 };
288
289 /*
290 ***********************************************************************
291 * QueryServiceSecurity
292 ***********************************************************************
293 */
294 OPERATION(SVCCTL_OPNUM_QueryServiceSecurity)
295 struct svcctl_QueryServiceSecurity {
296 IN svcctl_handle_t service_handle;
297 IN DWORD security_info;
298 IN DWORD buf_size;
299 SIZE_IS(buf_size)
300 OUT REFERENCE LPBYTE buffer;
301 OUT DWORD bytes_needed;
302 OUT DWORD status;
303 };
304
305 /*
306 ***********************************************************************
307 * SetServiceSecurity
308 ***********************************************************************
309 */
310 OPERATION(SVCCTL_OPNUM_SetServiceSecurity)
311 struct svcctl_SetServiceSecurity {
312 IN svcctl_handle_t service_handle;
313 IN DWORD security_info;
314 SIZE_IS(buf_size)
315 IN REFERENCE LPBYTE buffer;
316 IN DWORD buf_size;
317 OUT DWORD status;
318 };
319
320 /*
321 ***********************************************************************
322 * OpenManager
323 ***********************************************************************
324 */
325 OPERATION(SVCCTL_OPNUM_OpenManager)
326 struct svcctl_OpenManager {
327 IN LPTSTR machine_name;
328 IN LPTSTR database_name;
329 IN DWORD desired_access;
330 OUT svcctl_handle_t handle;
331 OUT DWORD status;
332 };
333
334
335 /*
336 ***********************************************************************
337 * OpenService
338 ***********************************************************************
339 */
340 OPERATION(SVCCTL_OPNUM_OpenService)
341 struct svcctl_OpenService {
342 IN svcctl_handle_t manager_handle;
343 IN REFERENCE LPTSTR service_name;
344 IN DWORD desired_access;
345 OUT svcctl_handle_t service_handle;
346 OUT DWORD status;
347 };
348
349
350 /*
351 ***********************************************************************
352 * QueryServiceStatus
353 ***********************************************************************
354 */
355 OPERATION(SVCCTL_OPNUM_QueryServiceStatus)
356 struct svcctl_QueryServiceStatus {
357 IN svcctl_handle_t service_handle;
358 OUT svc_status_t service_status;
359 OUT DWORD status;
360 };
361
362 /*
363 ***********************************************************************
364 * EnumDependentServices
365 ***********************************************************************
366 */
367 OPERATION(SVCCTL_OPNUM_EnumDependentServices)
368 struct svcctl_EnumDependentServices {
369 IN svcctl_handle_t service_handle;
370 IN DWORD svc_state;
371 IN DWORD buf_size;
372 SIZE_IS(buf_size)
373 OUT REFERENCE LPBYTE services;
374 OUT DWORD bytes_needed;
375 OUT DWORD svc_num;
376 OUT DWORD status;
377 };
378
379 /*
380 ***********************************************************************
381 * EnumServicesStatus
382 ***********************************************************************
383 */
384 OPERATION(SVCCTL_OPNUM_EnumServicesStatus)
385 struct svcctl_EnumServicesStatus {
386 IN svcctl_handle_t manager_handle;
387 IN DWORD svc_type;
388 IN DWORD svc_state;
389 IN DWORD buf_size;
390 SIZE_IS(buf_size)
391 OUT REFERENCE LPBYTE services;
392 OUT DWORD bytes_needed;
393 OUT DWORD svc_num;
394 INOUT DWORD *resume_handle;
395 OUT DWORD status;
396 };
397
398 /*
399 ***********************************************************************
400 * QueryServiceConfig
401 ***********************************************************************
402 */
403 OPERATION(SVCCTL_OPNUM_QueryServiceConfig)
404 struct svcctl_QueryServiceConfig {
405 IN svcctl_handle_t service_handle;
406 IN DWORD buf_size;
407 OUT svc_config_t service_cfg;
408 OUT DWORD cfg_bytes;
409 OUT DWORD status;
410 };
411
412 /*
413 ***********************************************************************
414 * StartService
415 *
416 * argc: The number of strings in argv. If argv is NULL,
417 * argc may be 0.
418 * argv: A pointer to a buffer containing an array of
419 * null-terminated Unicode strings.
420 *
421 * For service management support, this should probably be:
422 * IN DWORD argc;
423 * SIZE_IS(buf_size)
424 * IN REFERENCE LPBYTE argv;
425 ***********************************************************************
426 */
427 OPERATION(SVCCTL_OPNUM_StartService)
428 struct svcctl_StartService {
429 IN svcctl_handle_t service_handle;
430 IN DWORD argc;
431 IN DWORD argv;
432 OUT DWORD status;
433 };
434
435 /*
436 ***********************************************************************
437 * GetServiceDisplayNameW
438 ***********************************************************************
439 */
440 OPERATION(SVCCTL_OPNUM_GetServiceDisplayNameW)
441 struct svcctl_GetServiceDisplayNameW {
442 IN svcctl_handle_t manager_handle;
443 IN REFERENCE LPTSTR service_name;
444 OUT REFERENCE LPTSTR display_name;
445 INOUT DWORD buf_size;
446 OUT DWORD status;
447 };
448
449 /*
450 ***********************************************************************
451 * GetServiceKeyNameW
452 ***********************************************************************
453 */
454 OPERATION(SVCCTL_OPNUM_GetServiceKeyNameW)
455 struct svcctl_GetServiceKeyNameW {
456 IN svcctl_handle_t manager_handle;
457 IN REFERENCE LPTSTR service_name;
458 OUT REFERENCE LPTSTR key_name;
459 INOUT DWORD buf_size;
460 OUT DWORD status;
461 };
462
463 /*
464 ***********************************************************************
465 * OpenSCManagerA
466 ***********************************************************************
467 */
468 OPERATION(SVCCTL_OPNUM_OpenSCManagerA)
469 struct svcctl_OpenSCManagerA {
470 IN struct svcctl_value *machine_name;
471 IN struct svcctl_value *database_name;
472 IN DWORD desired_access;
473 OUT svcctl_handle_t handle;
474 OUT DWORD status;
475 };
476
477 /*
478 ***********************************************************************
479 * OpenServiceA
480 ***********************************************************************
481 */
482 OPERATION(SVCCTL_OPNUM_OpenServiceA)
483 struct svcctl_OpenServiceA {
484 IN svcctl_handle_t manager_handle;
485 IN REFERENCE struct svcctl_value *service_name;
486 IN DWORD desired_access;
487 OUT svcctl_handle_t service_handle;
488 OUT DWORD status;
489 };
490
491 /*
492 ***********************************************************************
493 * EnumServicesStatusA
494 ***********************************************************************
495 */
496 OPERATION(SVCCTL_OPNUM_EnumServicesStatusA)
497 struct svcctl_EnumServicesStatusA {
498 IN svcctl_handle_t manager_handle;
499 IN DWORD svc_type;
500 IN DWORD svc_state;
501 IN DWORD buf_size;
502 SIZE_IS(buf_size)
503 OUT REFERENCE LPBYTE services;
504 OUT DWORD bytes_needed;
505 OUT DWORD svc_num;
506 INOUT DWORD *resume_handle;
507 OUT DWORD status;
508 };
509
510 /*
511 ***********************************************************************
512 * QueryServiceConfig2W
513 ***********************************************************************
514 */
515 OPERATION(SVCCTL_OPNUM_QueryServiceConfig2W)
516 struct svcctl_QueryServiceConfig2W {
517 IN svcctl_handle_t service_handle;
518 IN DWORD info_level;
519 IN DWORD buf_size;
520 SIZE_IS(buf_size)
521 OUT REFERENCE LPBYTE buffer;
522 OUT DWORD bytes_needed;
523 OUT DWORD status;
524 };
525
526 /*
527 ***********************************************************************
528 * QueryServiceStatusEx
529 ***********************************************************************
530 */
531 struct svc_status_ex {
532 DWORD service_type;
533 DWORD cur_state;
534 DWORD ctrl_accepted;
535 DWORD w32_exitcode;
536 DWORD svc_specified_exitcode;
537 DWORD check_point;
538 DWORD wait_hint;
539 DWORD process_id;
540 DWORD service_flags;
541 };
542 typedef struct svc_status_ex svc_status_ex_t;
543
544 OPERATION(SVCCTL_OPNUM_QueryServiceStatusEx)
545 struct svcctl_QueryServiceStatusEx {
546 IN svcctl_handle_t service_handle;
547 IN DWORD info_level;
548 IN DWORD buf_size;
549 SIZE_IS(buf_size)
550 OUT REFERENCE LPBYTE buffer;
551 OUT DWORD bytes_needed;
552 OUT DWORD status;
553 };
554
555 /*
556 ***********************************************************************
557 * The SVCCTL interface definition.
558 ***********************************************************************
559 */
560 INTERFACE(0)
561 union svcctl_interface {
562 CASE(SVCCTL_OPNUM_Close)
563 struct svcctl_Close SvcClose;
564 CASE(SVCCTL_OPNUM_ControlService)
565 struct svcctl_ControlService SvcControlService;
566 CASE(SVCCTL_OPNUM_DeleteService)
567 struct svcctl_DeleteService SvcDeleteService;
568 CASE(SVCCTL_OPNUM_QueryServiceSecurity)
569 struct svcctl_QueryServiceSecurity SvcQueryServiceSecurity;
570 CASE(SVCCTL_OPNUM_SetServiceSecurity)
571 struct svcctl_SetServiceSecurity SvcSetServiceSecurity;
572 CASE(SVCCTL_OPNUM_OpenManager)
573 struct svcctl_OpenManager SvcOpenManager;
574 CASE(SVCCTL_OPNUM_OpenService)
575 struct svcctl_OpenService SvcOpenService;
576 CASE(SVCCTL_OPNUM_QueryServiceStatus)
577 struct svcctl_QueryServiceStatus SvcQueryServiceStatus;
578 CASE(SVCCTL_OPNUM_EnumDependentServices)
579 struct svcctl_EnumDependentServices Svc_EnumDependentServices;
580 CASE(SVCCTL_OPNUM_EnumServicesStatus)
581 struct svcctl_EnumServicesStatus SvcEnumServicesStatus;
582 CASE(SVCCTL_OPNUM_QueryServiceConfig)
583 struct svcctl_QueryServiceConfig SvcQueryServiceConfig;
584 CASE(SVCCTL_OPNUM_StartService)
585 struct svcctl_StartService SvcStartService;
586 CASE(SVCCTL_OPNUM_GetServiceDisplayNameW)
587 struct svcctl_GetServiceDisplayNameW SvcGetServiceDisplayNameW;
588 CASE(SVCCTL_OPNUM_GetServiceKeyNameW)
589 struct svcctl_GetServiceKeyNameW SvcGetServiceKeyNameW;
590 CASE(SVCCTL_OPNUM_OpenSCManagerA)
591 struct svcctl_OpenSCManagerA SvcOpenSCManagerA;
592 CASE(SVCCTL_OPNUM_OpenServiceA)
593 struct svcctl_OpenServiceA SvcOpenServiceA;
594 CASE(SVCCTL_OPNUM_EnumServicesStatusA)
595 struct svcctl_EnumServicesStatusA SvcEnumServicesStatusA;
596 CASE(SVCCTL_OPNUM_QueryServiceConfig2W)
597 struct svcctl_QueryServiceConfig2W SvcQueryServiceConfig2W;
598 CASE(SVCCTL_OPNUM_QueryServiceStatusEx)
599 struct svcctl_QueryServiceStatusEx SvcQueryServiceStatusEx;
600 };
601
602 typedef union svcctl_interface svcctl_interface_t;
603 EXTERNTYPEINFO(svcctl_interface)
604
605
606 #endif /* _MLSVC_SVCCTL_NDL_ */