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