svcctl: use offered/needed for buffer sizes as in spoolss.
[ira/wip.git] / librpc / idl / svcctl.idl
1 #include "idl_types.h"
2
3 /*
4   svcctl interface definitions
5 */
6
7 import "misc.idl", "security.idl";
8 [ uuid("367abb81-9844-35f1-ad32-98f038001003"),
9   version(2.0),
10   pointer_default(unique),
11   endpoint("ncacn_np:[\\pipe\\svcctl]", "ncalrpc:"),
12   helper("../librpc/ndr/ndr_svcctl.h"),
13   helpstring("Service Control")
14 ] interface svcctl
15 {
16         typedef struct {
17                 uint32 is_locked;
18                 [string,charset(UTF16)] uint16 *lock_owner;
19                 uint32 lock_duration;
20         } SERVICE_LOCK_STATUS;
21
22         typedef [v1_enum] enum {
23                 SVCCTL_STATE_UNKNOWN            = 0x00000000,   /* only used internally to smbd */
24                 SVCCTL_STOPPED                  = 0x00000001,
25                 SVCCTL_START_PENDING            = 0x00000002,
26                 SVCCTL_STOP_PENDING             = 0x00000003,
27                 SVCCTL_RUNNING                  = 0x00000004,
28                 SVCCTL_CONTINUE_PENDING         = 0x00000005,
29                 SVCCTL_PAUSE_PENDING            = 0x00000006,
30                 SVCCTL_PAUSED                   = 0x00000007
31         } svcctl_ServiceStatus;
32
33         const int SVCCTL_ACCEPT_NONE                    = 0x00000000;
34
35         typedef [bitmap32bit] bitmap {
36                 SVCCTL_ACCEPT_STOP                      = 0x00000001,
37                 SVCCTL_ACCEPT_PAUSE_CONTINUE            = 0x00000002,
38                 SVCCTL_ACCEPT_SHUTDOWN                  = 0x00000004,
39                 SVCCTL_ACCEPT_PARAMCHANGE               = 0x00000008,
40                 SVCCTL_ACCEPT_NETBINDCHANGE             = 0x00000010,
41                 SVCCTL_ACCEPT_HARDWAREPROFILECHANGE     = 0x00000020,
42                 SVCCTL_ACCEPT_POWEREVENT                = 0x00000040
43         } svcctl_ControlsAccepted;
44
45         typedef struct {
46                 uint32 type;
47                 svcctl_ServiceStatus state;
48                 svcctl_ControlsAccepted controls_accepted;
49                 WERROR win32_exit_code;
50                 uint32 service_exit_code;
51                 uint32 check_point;
52                 uint32 wait_hint;
53         } SERVICE_STATUS;
54
55         typedef [public] struct {
56                 SERVICE_STATUS status;
57                 uint32 process_id;
58                 uint32 service_flags;
59         } SERVICE_STATUS_PROCESS;
60
61         typedef [public,gensize] struct {
62                 [relative] nstring *service_name;
63                 [relative] nstring *display_name;
64                 SERVICE_STATUS status;
65         } ENUM_SERVICE_STATUSW;
66
67         typedef [public,gensize] struct {
68                 [relative] astring *service_name;
69                 [relative] astring *display_name;
70                 SERVICE_STATUS status;
71         } ENUM_SERVICE_STATUSA;
72
73         const int SERVICE_TYPE_KERNEL_DRIVER       = 0x01;
74         const int SERVICE_TYPE_FS_DRIVER           = 0x02;
75         const int SERVICE_TYPE_ADAPTER             = 0x04;
76         const int SERVICE_TYPE_RECOGNIZER_DRIVER   = 0x08;
77         const int SERVICE_TYPE_DRIVER=SERVICE_TYPE_KERNEL_DRIVER|SERVICE_TYPE_FS_DRIVER|SERVICE_TYPE_RECOGNIZER_DRIVER;
78         const int SERVICE_TYPE_WIN32_OWN_PROCESS   = 0x10;
79         const int SERVICE_TYPE_WIN32_SHARE_PROCESS = 0x20;
80         const int SERVICE_TYPE_WIN32=SERVICE_TYPE_WIN32_OWN_PROCESS|SERVICE_TYPE_WIN32_SHARE_PROCESS;
81         const int SERVICE_TYPE_INTERACTIVE_PROCESS = 0x100;
82
83         typedef [public,bitmap32bit] bitmap {
84                 SV_TYPE_WORKSTATION       = 0x00000001,
85                 SV_TYPE_SERVER            = 0x00000002,
86                 SV_TYPE_SQLSERVER         = 0x00000004,
87                 SV_TYPE_DOMAIN_CTRL       = 0x00000008,
88                 SV_TYPE_DOMAIN_BAKCTRL    = 0x00000010,
89                 SV_TYPE_TIME_SOURCE       = 0x00000020,
90                 SV_TYPE_AFP               = 0x00000040,
91                 SV_TYPE_NOVELL            = 0x00000080,
92
93                 SV_TYPE_DOMAIN_MEMBER     = 0x00000100,
94                 SV_TYPE_PRINTQ_SERVER     = 0x00000200,
95                 SV_TYPE_DIALIN_SERVER     = 0x00000400,
96                 SV_TYPE_SERVER_UNIX       = 0x00000800,
97                 SV_TYPE_NT                = 0x00001000,
98                 SV_TYPE_WFW               = 0x00002000,
99                 SV_TYPE_SERVER_MFPN       = 0x00004000,
100                 SV_TYPE_SERVER_NT         = 0x00008000,
101                 SV_TYPE_POTENTIAL_BROWSER = 0x00010000,
102                 SV_TYPE_BACKUP_BROWSER    = 0x00020000,
103                 SV_TYPE_MASTER_BROWSER    = 0x00040000,
104                 SV_TYPE_DOMAIN_MASTER     = 0x00080000,
105                 SV_TYPE_SERVER_OSF        = 0x00100000,
106                 SV_TYPE_SERVER_VMS        = 0x00200000,
107                 SV_TYPE_WIN95_PLUS        = 0x00400000,
108                 SV_TYPE_DFS_SERVER        = 0x00800000,
109                 SV_TYPE_ALTERNATE_XPORT   = 0x20000000,
110                 SV_TYPE_LOCAL_LIST_ONLY   = 0x40000000,
111                 SV_TYPE_DOMAIN_ENUM       = 0x80000000
112         } svcctl_ServerType;
113
114         const uint32 SV_TYPE_ALL        = 0xFFFFFFFF;
115
116         /*****************/
117         /* Function 0x00 */
118         WERROR svcctl_CloseServiceHandle(
119                 [in,out,ref] policy_handle *handle
120         );
121
122         /*****************/
123         /* Function 0x01 */
124
125         /* Service Controls */
126
127         typedef [v1_enum] enum {
128                 SVCCTL_CONTROL_STOP             = 0x00000001,
129                 SVCCTL_CONTROL_PAUSE            = 0x00000002,
130                 SVCCTL_CONTROL_CONTINUE         = 0x00000003,
131                 SVCCTL_CONTROL_INTERROGATE      = 0x00000004,
132                 SVCCTL_CONTROL_SHUTDOWN         = 0x00000005
133         } SERVICE_CONTROL;
134
135         WERROR svcctl_ControlService(
136                 [in,ref] policy_handle *handle,
137                 [in] SERVICE_CONTROL control,
138                 [out,ref] SERVICE_STATUS *service_status
139         );
140
141         /*****************/
142         /* Function 0x02 */
143         WERROR svcctl_DeleteService(
144                 [in,ref] policy_handle *handle
145         );
146
147         /*****************/
148         /* Function 0x03 */
149
150         WERROR svcctl_LockServiceDatabase(
151                 [in,ref] policy_handle *handle,
152                 [out,ref] policy_handle *lock
153         );
154
155         /*****************/
156         /* Function 0x04 */
157         WERROR svcctl_QueryServiceObjectSecurity(
158                 [in] policy_handle *handle,
159                 [in] uint32 security_flags,
160                 [out,ref,size_is(buffer_size)] uint8 *buffer,
161                 [in,range(0,0x40000)] uint32 buffer_size,
162                 [out,ref,range(0,0x40000)] uint32 *needed
163         );
164
165         /*****************/
166         /* Function 0x05 */
167         WERROR svcctl_SetServiceObjectSecurity(
168                 [in] policy_handle *handle,
169                 [in] uint32 security_flags,
170                 [in,ref,size_is(buffer_size)] uint8 *buffer,
171                 [in] uint32 buffer_size
172         );
173
174         /*****************/
175         /* Function 0x06 */
176         WERROR svcctl_QueryServiceStatus(
177                 [in,ref] policy_handle *handle,
178                 [out,ref] SERVICE_STATUS *service_status
179         );
180
181         /*****************/
182         /* Function 0x07 */
183         [todo] WERROR svcctl_SetServiceStatus(
184         );
185
186         /*****************/
187         /* Function 0x08 */
188         WERROR svcctl_UnlockServiceDatabase(
189                 [in,out,ref] policy_handle *lock
190         );
191
192         /*****************/
193         /* Function 0x09 */
194         [todo] WERROR svcctl_NotifyBootConfigStatus(
195         );
196
197         /*****************/
198         /* Function 0x0a */
199         WERROR svcctl_SCSetServiceBitsW(
200                 [in,ref] policy_handle *handle,
201                 [in] uint32 bits,
202                 [in] boolean32 bitson,
203                 [in] boolean32 immediate
204         );
205
206         /*****************/
207         /* Function 0x0b */
208
209         typedef [v1_enum] enum {
210                 SVCCTL_SVC_ERROR_IGNORE         = 0x00000000,
211                 SVCCTL_SVC_ERROR_NORMAL         = 0x00000001,
212                 SVCCTL_SVC_ERROR_CRITICAL       = 0x00000002,
213                 SVCCTL_SVC_ERROR_SEVERE         = 0x00000003
214         } svcctl_ErrorControl;
215
216         typedef [v1_enum] enum {
217                 SVCCTL_BOOT_START               = 0x00000000,
218                 SVCCTL_SYSTEM_START             = 0x00000001,
219                 SVCCTL_AUTO_START               = 0x00000002,
220                 SVCCTL_DEMAND_START             = 0x00000003,
221                 SVCCTL_DISABLED                 = 0x00000004
222         } svcctl_StartType;
223
224         WERROR svcctl_ChangeServiceConfigW(
225                 [in,ref] policy_handle *handle,
226                 [in] uint32 type,
227                 [in] svcctl_StartType start_type,
228                 [in] svcctl_ErrorControl error_control,
229                 [in,unique] [string,charset(UTF16)] uint16 *binary_path,
230                 [in,unique] [string,charset(UTF16)] uint16 *load_order_group,
231                 [out,ref] uint32 *tag_id,
232                 [in,unique] [string,charset(UTF16)] uint16 *dependencies,
233                 [in,unique] [string,charset(UTF16)] uint16 *service_start_name,
234                 [in,unique] [string,charset(UTF16)] uint16 *password,
235                 [in,unique] [string,charset(UTF16)] uint16 *display_name
236         );
237
238         /*****************/
239         /* Function 0x0c */
240         WERROR svcctl_CreateServiceW(
241                 [in,ref] policy_handle *scmanager_handle,
242                 [in] [string,charset(UTF16)] uint16 ServiceName[],
243                 [in,unique] [string,charset(UTF16)] uint16 *DisplayName,
244                 [in] uint32 desired_access,
245                 [in] uint32 type,
246                 [in] svcctl_StartType start_type,
247                 [in] svcctl_ErrorControl error_control,
248                 [in] [string,charset(UTF16)] uint16 binary_path[],
249                 [in,unique] [string,charset(UTF16)] uint16 *LoadOrderGroupKey,
250                 [in,out,unique] uint32 *TagId,
251                 [in,unique,size_is(dependencies_size)] uint8 *dependencies,
252                 [in] uint32 dependencies_size,
253                 [in,unique] [string,charset(UTF16)] uint16 *service_start_name,
254                 [in,unique,size_is(password_size)] uint8 *password,
255                 [in] uint32 password_size,
256                 [out,ref] policy_handle *handle
257         );
258
259         /*****************/
260         /* Function 0x0d */
261         WERROR svcctl_EnumDependentServicesW(
262                 [in,ref] policy_handle *service,
263                 [in] uint32 state,
264                 [out,ref,size_is(offered)] uint8 *service_status,
265                 [in,range(0,0x40000)] uint32 offered,
266                 [out,ref,range(0,0x40000)] uint32 *needed,
267                 [out,ref,range(0,0x40000)] uint32 *services_returned
268         );
269
270         /*****************/
271         /* Function 0x0e */
272
273         typedef [v1_enum] enum {
274                 SERVICE_STATE_ACTIVE    = 0x00000001,
275                 SERVICE_STATE_INACTIVE  = 0x00000002,
276                 SERVICE_STATE_ALL       = ( SERVICE_STATE_ACTIVE | SERVICE_STATE_INACTIVE )
277         } svcctl_ServiceState;
278
279         WERROR svcctl_EnumServicesStatusW(
280                 [in,ref] policy_handle *handle,
281                 [in] uint32 type,
282                 [in] svcctl_ServiceState state,
283                 [out,ref,size_is(offered)] uint8 *service,
284                 [in] [range(0,0x40000)] uint32 offered,
285                 [out,ref] [range(0,0x40000)] uint32 *needed,
286                 [out,ref] [range(0,0x40000)] uint32 *services_returned,
287                 [in,out,unique] uint32 *resume_handle
288         );
289
290         /*****************/
291         /* Function 0x0f */
292
293         /* Service Control Manager Bits */
294
295         typedef [bitmap32bit] bitmap {
296                 SC_RIGHT_MGR_CONNECT            = 0x0001,
297                 SC_RIGHT_MGR_CREATE_SERVICE     = 0x0002,
298                 SC_RIGHT_MGR_ENUMERATE_SERVICE  = 0x0004,
299                 SC_RIGHT_MGR_LOCK               = 0x0008,
300                 SC_RIGHT_MGR_QUERY_LOCK_STATUS  = 0x0010,
301                 SC_RIGHT_MGR_MODIFY_BOOT_CONFIG = 0x0020
302         } svcctl_MgrAccessMask;
303
304         const int SC_MANAGER_READ_ACCESS =
305                 (SEC_STD_READ_CONTROL                   |
306                  SC_RIGHT_MGR_CONNECT                   |
307                  SC_RIGHT_MGR_ENUMERATE_SERVICE         |
308                  SC_RIGHT_MGR_QUERY_LOCK_STATUS);
309
310         const int SC_MANAGER_EXECUTE_ACCESS = SC_MANAGER_READ_ACCESS;
311
312         const int SC_MANAGER_WRITE_ACCESS =
313                 (SEC_STD_REQUIRED                       |
314                  SC_MANAGER_READ_ACCESS                 |
315                  SC_RIGHT_MGR_CREATE_SERVICE            |
316                  SC_RIGHT_MGR_LOCK                      |
317                  SC_RIGHT_MGR_MODIFY_BOOT_CONFIG);
318
319         const int SC_MANAGER_ALL_ACCESS = SC_MANAGER_WRITE_ACCESS;
320
321         WERROR svcctl_OpenSCManagerW(
322                 [in,unique] [string,charset(UTF16)] uint16 *MachineName,
323                 [in,unique] [string,charset(UTF16)] uint16 *DatabaseName,
324                 [in] svcctl_MgrAccessMask access_mask,
325                 [out,ref] policy_handle *handle
326         );
327
328         /*****************/
329         /* Function 0x10 */
330
331         /* Service Object Bits */
332
333         typedef [bitmap32bit] bitmap {
334                 SC_RIGHT_SVC_QUERY_CONFIG               = 0x0001,
335                 SC_RIGHT_SVC_CHANGE_CONFIG              = 0x0002,
336                 SC_RIGHT_SVC_QUERY_STATUS               = 0x0004,
337                 SC_RIGHT_SVC_ENUMERATE_DEPENDENTS       = 0x0008,
338                 SC_RIGHT_SVC_START                      = 0x0010,
339                 SC_RIGHT_SVC_STOP                       = 0x0020,
340                 SC_RIGHT_SVC_PAUSE_CONTINUE             = 0x0040,
341                 SC_RIGHT_SVC_INTERROGATE                = 0x0080,
342                 SC_RIGHT_SVC_USER_DEFINED_CONTROL       = 0x0100
343         } svcctl_ServiceAccessMask;
344
345         const int SERVICE_READ_ACCESS =
346                 (SEC_STD_READ_CONTROL                   |
347                  SC_RIGHT_SVC_ENUMERATE_DEPENDENTS      |
348                  SC_RIGHT_SVC_INTERROGATE               |
349                  SC_RIGHT_SVC_QUERY_CONFIG              |
350                  SC_RIGHT_SVC_QUERY_STATUS              |
351                  SC_RIGHT_SVC_USER_DEFINED_CONTROL);
352
353         const int SERVICE_EXECUTE_ACCESS =
354                 (SERVICE_READ_ACCESS                    |
355                  SC_RIGHT_SVC_START                     |
356                  SC_RIGHT_SVC_STOP                      |
357                  SC_RIGHT_SVC_PAUSE_CONTINUE);
358
359         const int SERVICE_WRITE_ACCESS =
360                 (SEC_STD_REQUIRED                       |
361                  SERVICE_READ_ACCESS                    |
362                  SERVICE_EXECUTE_ACCESS                 |
363                  SC_RIGHT_SVC_CHANGE_CONFIG);
364
365         const int SERVICE_ALL_ACCESS = SERVICE_WRITE_ACCESS;
366
367         WERROR svcctl_OpenServiceW(
368                 [in,ref] policy_handle *scmanager_handle,
369                 [in] [string,charset(UTF16)] uint16 ServiceName[],
370                 [in] svcctl_ServiceAccessMask access_mask,
371                 [out,ref] policy_handle *handle
372         );
373
374         /*****************/
375         /* Function 0x11 */
376
377         typedef [public,gensize] struct {
378                 uint32 service_type;
379                 svcctl_StartType start_type;
380                 svcctl_ErrorControl error_control;
381                 [string,charset(UTF16)] [range(0,8192)] uint16 *executablepath;
382                 [string,charset(UTF16)] [range(0,8192)] uint16 *loadordergroup;
383                 uint32 tag_id;
384                 [string,charset(UTF16)] [range(0,8192)] uint16 *dependencies;
385                 [string,charset(UTF16)] [range(0,8192)] uint16 *startname;
386                 [string,charset(UTF16)] [range(0,8192)] uint16 *displayname;
387         } QUERY_SERVICE_CONFIG;
388
389         WERROR svcctl_QueryServiceConfigW(
390                 [in,ref] policy_handle *handle,
391                 [out] QUERY_SERVICE_CONFIG *query,
392                 [in] [range(0,8192)] uint32 offered,
393                 [out,ref] [range(0,8192)] uint32 *needed
394         );
395
396         /*****************/
397         /* Function 0x12 */
398         WERROR svcctl_QueryServiceLockStatusW(
399                 [in,ref] policy_handle *handle,
400                 [in] uint32 offered,
401                 [out,ref] SERVICE_LOCK_STATUS *lock_status,
402                 [out,ref] uint32 *needed
403         );
404
405         /*****************/
406         /* Function 0x13 */
407         WERROR svcctl_StartServiceW(
408                 [in,ref] policy_handle *handle,
409                 [in] uint32 NumArgs,
410                 [in,unique/*FIXME:,length_is(NumArgs)*/] [string,charset(UTF16)] uint16 *Arguments
411         );
412
413         /*****************/
414         /* Function 0x14 */
415         WERROR svcctl_GetServiceDisplayNameW(
416                 [in,ref] policy_handle *handle,
417                 [in,unique] [string,charset(UTF16)] uint16 *service_name,
418                 [out,ref] [string,charset(UTF16)] uint16 **display_name,
419                 [in,out,unique] uint32 *display_name_length
420         );
421
422         /*****************/
423         /* Function 0x15 */
424         WERROR svcctl_GetServiceKeyNameW(
425                 [in,ref] policy_handle *handle,
426                 [in,unique] [string,charset(UTF16)] uint16 *service_name,
427                 [out,ref] [string,charset(UTF16)] uint16 **key_name,
428                 [in,out,unique] uint32 *display_name_length
429         );
430
431         /*****************/
432         /* Function 0x16 */
433         WERROR svcctl_SCSetServiceBitsA(
434                 [in,ref] policy_handle *handle,
435                 [in] uint32 bits,
436                 [in] boolean32 bitson,
437                 [in] boolean32 immediate
438         );
439
440         /*****************/
441         /* Function 0x17 */
442         WERROR svcctl_ChangeServiceConfigA(
443                 [in,ref] policy_handle *handle,
444                 [in] uint32 type,
445                 [in] svcctl_StartType start_type,
446                 [in] svcctl_ErrorControl error_control,
447                 [in,unique] [string,charset(UTF16)] uint16 *binary_path,
448                 [in,unique] [string,charset(UTF16)] uint16 *load_order_group,
449                 [out,ref] uint32 *tag_id,
450                 [in,unique] [string,charset(UTF16)] uint16 *dependencies,
451                 [in,unique] [string,charset(UTF16)] uint16 *service_start_name,
452                 [in,unique] [string,charset(UTF16)] uint16 *password,
453                 [in,unique] [string,charset(UTF16)] uint16 *display_name
454         );
455
456         /*****************/
457         /* Function 0x18 */
458         WERROR svcctl_CreateServiceA(
459                 [in,ref] policy_handle *handle,
460                 [in,unique] [string,charset(UTF16)] uint16 *ServiceName,
461                 [in,unique] [string,charset(UTF16)] uint16 *DisplayName,
462                 [in] uint32 desired_access,
463                 [in] uint32 type,
464                 [in] svcctl_StartType start_type,
465                 [in] svcctl_ErrorControl error_control,
466                 [in,unique] [string,charset(UTF16)] uint16 *binary_path,
467                 [in,unique] [string,charset(UTF16)] uint16 *LoadOrderGroupKey,
468                 [out,unique] uint32 *TagId,
469                 [in,unique] [string,charset(UTF16)] uint16 *dependencies,
470                 [in,unique] [string,charset(UTF16)] uint16 *service_start_name,
471                 [in,unique] [string,charset(UTF16)] uint16 *password
472         );
473
474         /*****************/
475         /* Function 0x19 */
476         WERROR svcctl_EnumDependentServicesA(
477                 [in,ref] policy_handle *service,
478                 [in] uint32 state,
479                 [out,unique] ENUM_SERVICE_STATUSA *service_status,
480                 [in] uint32 offered,
481                 [out,ref] uint32 *needed,
482                 [out,ref] uint32 *services_returned
483         );
484
485         /*****************/
486         /* Function 0x1a */
487         WERROR svcctl_EnumServicesStatusA(
488                 [in,ref] policy_handle *handle,
489                 [in] uint32 type,
490                 [in] svcctl_ServiceState state,
491                 [in] uint32 offered,
492                 [out,size_is(offered)] uint8 service[*],
493                 [out,ref] uint32 *needed,
494                 [out,ref] uint32 *services_returned,
495                 [in,out,unique] uint32 *resume_handle
496         );
497
498         /*****************/
499         /* Function 0x1b */
500         WERROR svcctl_OpenSCManagerA(
501                 [in,unique] [string,charset(UTF16)] uint16 *MachineName,
502                 [in,unique] [string,charset(UTF16)] uint16 *DatabaseName,
503                 [in] uint32 access_mask,
504                 [out,ref] policy_handle *handle
505         );
506
507         /*****************/
508         /* Function 0x1c */
509         WERROR svcctl_OpenServiceA(
510                 [in,ref] policy_handle *scmanager_handle,
511                 [in,unique] [string,charset(UTF16)] uint16 *ServiceName,
512                 [in] uint32 access_mask
513         );
514
515         /*****************/
516         /* Function 0x1d */
517         WERROR svcctl_QueryServiceConfigA(
518                 [in,ref] policy_handle *handle,
519                 [out] uint8 query[offered], /*QUERYU_SERVICE_CONFIG */
520                 [in] uint32 offered,
521                 [out,ref] uint32 *needed
522         );
523
524         /*****************/
525         /* Function 0x1e */
526         WERROR svcctl_QueryServiceLockStatusA(
527                 [in,ref] policy_handle *handle,
528                 [in] uint32 offered,
529                 [out,ref] SERVICE_LOCK_STATUS *lock_status,
530                 [out,ref] uint32 *needed
531         );
532
533         /*****************/
534         /* Function 0x1f */
535         WERROR svcctl_StartServiceA(
536                 [in,ref] policy_handle *handle,
537                 [in] uint32 NumArgs,
538                 [in,unique/*FIXME:,length_is(NumArgs)*/] [string,charset(UTF16)] uint16 *Arguments
539         );
540
541         /*****************/
542         /* Function 0x20 */
543         WERROR svcctl_GetServiceDisplayNameA(
544                 [in,ref] policy_handle *handle,
545                 [in,unique] [string,charset(UTF16)] uint16 *service_name,
546                 [out,ref] [string,charset(UTF16)] uint16 **display_name,
547                 [in,out,unique] uint32 *display_name_length
548         );
549
550         /*****************/
551         /* Function 0x21 */
552         WERROR svcctl_GetServiceKeyNameA(
553                 [in,ref] policy_handle *handle,
554                 [in,unique] [string,charset(UTF16)] uint16 *service_name,
555                 [out,ref] [string,charset(UTF16)] uint16 **key_name,
556                 [in,out,unique] uint32 *display_name_length
557         );
558
559         /*****************/
560         /* Function 0x22 */
561         [todo] WERROR svcctl_GetCurrentGroupeStateW(
562         );
563
564         /*****************/
565         /* Function 0x23 */
566         [todo] WERROR svcctl_EnumServiceGroupW(
567         );
568
569         /*****************/
570         /* Function 0x24 */
571         WERROR svcctl_ChangeServiceConfig2A(
572                 [in,ref] policy_handle *handle,
573                 [in] uint32 info_level,
574                 [in,unique] uint8 *info
575         );
576
577         /*****************/
578         /* Function 0x25 */
579         WERROR svcctl_ChangeServiceConfig2W(
580                 [in,ref] policy_handle *handle,
581                 [in] uint32 info_level,
582                 [in,unique] uint8 *info
583         );
584
585         /*****************/
586         /* Function 0x26 */
587
588         typedef [v1_enum] enum {
589                 SERVICE_CONFIG_DESCRIPTION      = 0x00000001,
590                 SERVICE_CONFIG_FAILURE_ACTIONS  = 0x00000002
591         } svcctl_ConfigLevel;
592
593         typedef [gensize,public] struct {
594                 [relative] nstring *description;
595         } SERVICE_DESCRIPTION;
596
597         typedef [v1_enum] enum {
598                 SC_ACTION_NONE          = 0,
599                 SC_ACTION_RESTART       = 1,
600                 SC_ACTION_REBOOT        = 2,
601                 SC_ACTION_RUN_COMMAND   = 3
602         } SC_ACTION_TYPE;
603
604         typedef struct {
605                 SC_ACTION_TYPE type;
606                 uint32 delay;
607         } SC_ACTION;
608
609         typedef [public,gensize] struct {
610                 uint32 reset_period;
611                 [relative] nstring *rebootmsg;
612                 [relative] nstring *command;
613                 [range(0,1024)] uint32 num_actions;
614                 [relative] [size_is(num_actions)] SC_ACTION *actions;
615         } SERVICE_FAILURE_ACTIONS;
616
617         WERROR svcctl_QueryServiceConfig2A(
618                 [in,ref] policy_handle *handle,
619                 [in] svcctl_ConfigLevel info_level,
620                 [out] uint8 buffer[offered],
621                 [in] uint32 offered,
622                 [out,ref] uint32 *needed
623         );
624
625         /*****************/
626         /* Function 0x27 */
627         WERROR svcctl_QueryServiceConfig2W(
628                 [in,ref] policy_handle *handle,
629                 [in] svcctl_ConfigLevel info_level,
630                 [out,ref,size_is(offered)] uint8 *buffer,
631                 [in] [range(0,8192)] uint32 offered,
632                 [out,ref] [range(0,8192)] uint32 *needed
633         );
634
635         /*****************/
636         /* Function 0x28 */
637
638         typedef [v1_enum] enum {
639                 SVC_STATUS_PROCESS_INFO         = 0x00000000
640         } svcctl_StatusLevel;
641
642         WERROR svcctl_QueryServiceStatusEx(
643                 [in,ref] policy_handle *handle,
644                 [in] svcctl_StatusLevel info_level,
645                 [out,ref,size_is(offered)] uint8 *buffer,
646                 [in] [range(0,8192)] uint32 offered,
647                 [out,ref] [range(0,8192)] uint32 *needed
648         );
649
650         /*****************/
651         /* Function 0x29 */
652         WERROR EnumServicesStatusExA(
653                 [in,ref] policy_handle *scmanager,
654                 [in] uint32 info_level,
655                 [in] uint32 type,
656                 [in] svcctl_ServiceState state,
657                 [out] uint8 services[offered],
658                 [in] uint32 offered,
659                 [out,ref] uint32 *needed,
660                 [out,ref] uint32 *service_returned,
661                 [in,out,unique] uint32 *resume_handle,
662                 [out,ref] [string,charset(UTF16)] uint16 **group_name
663         );
664
665         /*****************/
666         /* Function 0x2a */
667         WERROR EnumServicesStatusExW(
668                 [in,ref] policy_handle *scmanager,
669                 [in] uint32 info_level,
670                 [in] uint32 type,
671                 [in] svcctl_ServiceState state,
672                 [out,ref,size_is(offered)] uint8 *services,
673                 [in] [range(0,0x40000)] uint32 offered,
674                 [out,ref] [range(0,0x40000)] uint32 *needed,
675                 [out,ref] [range(0,0x40000)] uint32 *service_returned,
676                 [in,out,unique] [range(0,0x40000)] uint32 *resume_handle,
677                 [in,unique] [string,charset(UTF16)] uint16 *group_name
678         );
679
680         /*****************/
681         /* Function 0x2b */
682         [todo] WERROR svcctl_SCSendTSMessage(
683         );
684 }