xref: /illumos-gate/usr/src/uts/common/smbsrv/ndl/svcctl.ndl (revision 48633f182599946aebd63dccdc852ad722b57d0e)
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 2008 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_EnumServiceStatusA		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_EnumServiceStatusExA	0x29
82#define	SVCCTL_OPNUM_EnumServiceStatusExW	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
100CONTEXT_HANDLE(svcctl_handle) svcctl_handle_t;
101
102/*
103 * The svc_status (SERVICE_STATUS) structure contains information about a
104 * service. The ControlService, EnumDependentServices, EnumServicesStatus,
105 * and QueryServiceStatus functions use this structure to return information
106 * about a service. A service uses this structure in the SetServiceStatus
107 * function to report its current status to the service control manager.
108 *
109 * service_type
110 *	The type of service. This member can be one of the following values.
111 *
112 *      SERVICE_FILE_SYSTEM_DRIVER
113 *      SERVICE_KERNEL_DRIVER
114 *      SERVICE_WIN32_OWN_PROCESS
115 *      SERVICE_WIN32_SHARE_PROCESS
116 *
117 * If the service type is either SERVICE_WIN32_OWN_PROCESS or
118 * SERVICE_WIN32_SHARE_PROCESS, and the service is running in
119 * the context of the LocalSystem account, the following type
120 * may also be specified to indicate that the service can
121 * interact with the desktop.
122 *
123 *      SERVICE_INTERACTIVE_PROCESS
124 *
125 * cur_state
126 *	The current state of the service. This member can be one of the
127 *	following values.
128 *
129 *      SERVICE_CONTINUE_PENDING
130 *      SERVICE_PAUSE_PENDING
131 *      SERVICE_PAUSED
132 *      SERVICE_RUNNING
133 *      SERVICE_START_PENDING
134 *      SERVICE_STOP_PENDING
135 *      SERVICE_STOPPED
136 *
137 * ctrl_accepted
138 *	The control codes that the service will accept and process in its
139 *	handler function (see Handler and HandlerEx). A user interface
140 *	process can control a service by specifying a control command in
141 *	the ControlService function. By default, all services accept the
142 *	SERVICE_CONTROL_INTERROGATE value. The following are the control
143 *	codes.
144 *
145 *      SERVICE_ACCEPT_STOP
146 *      SERVICE_ACCEPT_PAUSE_CONTINUE
147 *      SERVICE_ACCEPT_SHUTDOWN
148 *      SERVICE_ACCEPT_PARAMCHANGE
149 *      SERVICE_ACCEPT_NETBINDCHANGE
150 *
151 * w32_exitcode
152 *  An error code that the service uses to report an error that occurs when
153 *  it is starting or stopping. To return an error code specific to the
154 *  service, the service must set this value to ERROR_SERVICE_SPECIFIC_ERROR
155 *  to indicate that the dwServiceSpecificExitCode member contains the error
156 *  code. The service should set this value to NO_ERROR when it is running
157 *  and on normal termination.
158 *
159 * svc_specified_exitcode
160 *  A service-specific error code that the service returns when an error
161 *  occurs while the service is starting or stopping. This value is ignored
162 *  unless the w32_exitcode member is set to ERROR_SERVICE_SPECIFIC_ERROR.
163 *
164 * check_point
165 *  A value that the service increments periodically to report its progress
166 *  during a lengthy start, stop, pause, or continue operation. For example,
167 *  the service should increment this value as it completes each step of its
168 *  initialization when it is starting up. The user interface program that
169 *  invoked the operation on the service uses this value to track the progress
170 *  of the service during a lengthy operation. This value is not valid and
171 *  should be zero when the service does not have a start, stop, pause, or
172 *  continue operation pending.
173 *
174 * wait_hint
175 *  An estimate of the amount of time, in milliseconds, that the service
176 *  expects a pending start, stop, pause, or continue operation to take
177 *  before the service makes its next call to the SetServiceStatus
178 *  function with either an incremented check_point value or a change in
179 *  dwCurrentState. If the amount of time specified by wait_hint passes,
180 *  and check_point has not been incremented, or cur_state has not changed,
181 *  the service control manager or service control program can assume that
182 *  an error has occurred and the service should be stopped.
183 */
184struct svc_status {
185	DWORD service_type;
186	DWORD cur_state;
187	DWORD ctrl_accepted;
188	DWORD w32_exitcode;
189	DWORD svc_specified_exitcode;
190	DWORD check_point;
191	DWORD wait_hint;
192};
193typedef struct svc_status svc_status_t;
194
195struct svc_enum_status {
196	DWORD svc_name;		/* offset within response buffer */
197	DWORD display_name;	/* offset within response buffer */
198	svc_status_t svc_status;
199};
200typedef struct svc_enum_status svc_enum_status_t;
201
202struct svc_config {
203	DWORD  service_type;
204	DWORD  start_type;
205	DWORD  error_control;
206	LPTSTR binary_pathname;
207	LPTSTR loadorder_group;
208	DWORD  tag_id;
209	LPTSTR dependencies;
210	LPTSTR service_startname;
211	LPTSTR display_name;
212};
213typedef struct svc_config svc_config_t;
214
215struct svc_failure_actions {
216	DWORD reset_period;
217	DWORD rebootmsg_offset;
218	DWORD command_offset;
219	DWORD actions;
220	DWORD actions_offset;
221};
222typedef struct svc_failure_actions svc_failure_actions_t;
223
224struct svc_description {
225	DWORD desc;		/* offset of description string */
226};
227typedef struct svc_description svc_description_t;
228
229/*
230 ***********************************************************************
231 * Close
232 ***********************************************************************
233 */
234OPERATION(SVCCTL_OPNUM_Close)
235struct svcctl_Close {
236	IN		svcctl_handle_t handle;
237	OUT		svcctl_handle_t result_handle;
238	OUT		DWORD status;
239};
240
241
242/*
243 ***********************************************************************
244 * OpenManager
245 ***********************************************************************
246 */
247OPERATION(SVCCTL_OPNUM_OpenManager)
248struct svcctl_OpenManager {
249	IN		LPTSTR machine_name;
250	IN		LPTSTR database_name;
251	IN		DWORD desired_access;
252	OUT		svcctl_handle_t handle;
253	OUT		DWORD status;
254};
255
256
257/*
258 ***********************************************************************
259 * OpenService
260 ***********************************************************************
261 */
262OPERATION(SVCCTL_OPNUM_OpenService)
263struct svcctl_OpenService {
264	IN		svcctl_handle_t manager_handle;
265	IN REFERENCE	LPTSTR service_name;
266	IN		DWORD desired_access;
267	OUT		svcctl_handle_t service_handle;
268	OUT		DWORD status;
269};
270
271
272/*
273 ***********************************************************************
274 * QueryServiceStatus
275 ***********************************************************************
276 */
277OPERATION(SVCCTL_OPNUM_QueryServiceStatus)
278struct svcctl_QueryServiceStatus {
279	IN		svcctl_handle_t service_handle;
280	OUT		svc_status_t service_status;
281	OUT		DWORD status;
282};
283
284/*
285 ***********************************************************************
286 * EnumServicesStatus
287 ***********************************************************************
288 */
289OPERATION(SVCCTL_OPNUM_EnumServicesStatus)
290struct svcctl_EnumServicesStatus {
291	IN		svcctl_handle_t manager_handle;
292	IN		DWORD svc_type;
293	IN		DWORD svc_state;
294	IN		DWORD buf_size;
295    SIZE_IS(buf_size)
296	OUT REFERENCE	LPBYTE services;
297	OUT		DWORD bytes_needed;
298	OUT		DWORD svc_num;
299	INOUT		DWORD *resume_handle;
300	OUT		DWORD status;
301};
302
303/*
304 ***********************************************************************
305 * QueryServiceConfig
306 ***********************************************************************
307 */
308OPERATION(SVCCTL_OPNUM_QueryServiceConfig)
309struct svcctl_QueryServiceConfig {
310	IN		svcctl_handle_t service_handle;
311	IN		DWORD buf_size;
312	OUT		svc_config_t service_cfg;
313	OUT		DWORD cfg_bytes;
314	OUT		DWORD status;
315};
316
317/*
318 ***********************************************************************
319 * GetServiceDisplayNameW
320 ***********************************************************************
321 */
322OPERATION(SVCCTL_OPNUM_GetServiceDisplayNameW)
323struct svcctl_GetServiceDisplayNameW {
324	IN		svcctl_handle_t manager_handle;
325	IN REFERENCE	LPTSTR service_name;
326	OUT REFERENCE	LPTSTR display_name;
327	INOUT		DWORD buf_size;
328	OUT		DWORD status;
329};
330
331/*
332 ***********************************************************************
333 * GetServiceKeyNameW
334 ***********************************************************************
335 */
336OPERATION(SVCCTL_OPNUM_GetServiceKeyNameW)
337struct svcctl_GetServiceKeyNameW {
338	IN		svcctl_handle_t manager_handle;
339	IN REFERENCE	LPTSTR service_name;
340	OUT REFERENCE	LPTSTR key_name;
341	INOUT		DWORD buf_size;
342	OUT		DWORD status;
343};
344
345/*
346 ***********************************************************************
347 * QueryServiceConfig2W
348 ***********************************************************************
349 */
350OPERATION(SVCCTL_OPNUM_QueryServiceConfig2W)
351struct svcctl_QueryServiceConfig2W {
352	IN		svcctl_handle_t service_handle;
353	IN		DWORD info_level;
354	IN		DWORD buf_size;
355    SIZE_IS(buf_size)
356	OUT REFERENCE	LPBYTE buffer;
357	OUT		DWORD bytes_needed;
358	OUT		DWORD status;
359};
360
361/*
362 ***********************************************************************
363 * The SVCCTL interface definition.
364 ***********************************************************************
365 */
366INTERFACE(0)
367union svcctl_interface {
368	CASE(SVCCTL_OPNUM_Close)
369		struct svcctl_Close			SvcClose;
370	CASE(SVCCTL_OPNUM_OpenManager)
371		struct svcctl_OpenManager		SvcOpenManager;
372	CASE(SVCCTL_OPNUM_OpenService)
373		struct svcctl_OpenService		SvcOpenService;
374	CASE(SVCCTL_OPNUM_QueryServiceStatus)
375		struct svcctl_QueryServiceStatus	SvcQueryServiceStatus;
376	CASE(SVCCTL_OPNUM_EnumServicesStatus)
377		struct svcctl_EnumServicesStatus	SvcEnumServicesStatus;
378	CASE(SVCCTL_OPNUM_QueryServiceConfig)
379		struct svcctl_QueryServiceConfig	SvcQueryServiceConfig;
380	CASE(SVCCTL_OPNUM_GetServiceDisplayNameW)
381		struct svcctl_GetServiceDisplayNameW SvcGetServiceDisplayNameW;
382	CASE(SVCCTL_OPNUM_GetServiceKeyNameW)
383		struct svcctl_GetServiceKeyNameW	SvcGetServiceKeyNameW;
384	CASE(SVCCTL_OPNUM_QueryServiceConfig2W)
385		struct svcctl_QueryServiceConfig2W	SvcQueryServiceConfig2W;
386};
387
388typedef union svcctl_interface	svcctl_interface_t;
389EXTERNTYPEINFO(svcctl_interface)
390
391
392#endif /* _MLSVC_SVCCTL_NDL_ */
393