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_ */