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