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