blob: 65ec65499195531477378ea159d7e7252a15fcce [file] [log] [blame]
Alexandre Julliard0799c1a2002-03-09 23:29:33 +00001/*
2 * Copyright (C) the Wine project
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 */
18
Patrik Stridvall4a739731999-07-04 11:01:21 +000019#ifndef __WINE_WINSVC_H
20#define __WINE_WINSVC_H
21
22#ifdef __cplusplus
23extern "C" {
24#endif /* defined(__cplusplus) */
25
Alexander Yaworskyd46a95c2004-09-20 21:44:17 +000026/* Service database names */
27#define SERVICES_ACTIVE_DATABASEA "ServicesActive"
28#define SERVICES_FAILED_DATABASEA "ServicesFailed"
29
30#if defined(__GNUC__)
31# define SERVICES_ACTIVE_DATABASEW (const WCHAR []){ 'S','e','r','v','i','c','e','s','A','c','t','i','v','e',0 }
32# define SERVICES_FAILED_DATABASEW (const WCHAR []){ 'S','e','r','v','i','c','e','s','F','a','i','l','e','d',0 }
33#elif defined(_MSC_VER)
34# define SERVICES_ACTIVE_DATABASEW L"ServicesActive"
35# define SERVICES_FAILED_DATABASEW L"ServicesFailed"
36#endif
37
38#define SERVICES_ACTIVE_DATABASE WINELIB_NAME_AW( SERVICES_ACTIVE_DATABASE )
39#define SERVICES_FAILED_DATABASE WINELIB_NAME_AW( SERVICES_FAILED_DATABASE )
40
Peter Hunnisett565b0082000-09-19 02:43:00 +000041/* Controls */
42#define SERVICE_CONTROL_STOP 0x00000001
43#define SERVICE_CONTROL_PAUSE 0x00000002
44#define SERVICE_CONTROL_CONTINUE 0x00000003
45#define SERVICE_CONTROL_INTERROGATE 0x00000004
46#define SERVICE_CONTROL_SHUTDOWN 0x00000005
47#define SERVICE_CONTROL_PARAMCHANGE 0x00000006
48#define SERVICE_CONTROL_NETBINDADD 0x00000007
49#define SERVICE_CONTROL_NETBINDREMOVE 0x00000008
50#define SERVICE_CONTROL_NETBINDENABLE 0x00000009
51#define SERVICE_CONTROL_NETBINDDISABLE 0x0000000A
52#define SERVICE_CONTROL_DEVICEEVENT 0x0000000B
53#define SERVICE_CONTROL_HARDWAREPROFILECHANGE 0x0000000C
54#define SERVICE_CONTROL_POWEREVENT 0x0000000D
Mike McCormack64d7cb12005-01-18 11:40:38 +000055#define SERVICE_CONTROL_SESSIONCHANGE 0x0000000E
Peter Hunnisett565b0082000-09-19 02:43:00 +000056
57/* Service State */
58#define SERVICE_STOPPED 0x00000001
59#define SERVICE_START_PENDING 0x00000002
60#define SERVICE_STOP_PENDING 0x00000003
61#define SERVICE_RUNNING 0x00000004
62#define SERVICE_CONTINUE_PENDING 0x00000005
63#define SERVICE_PAUSE_PENDING 0x00000006
64#define SERVICE_PAUSED 0x00000007
65
66/* Controls Accepted */
67#define SERVICE_ACCEPT_STOP 0x00000001
68#define SERVICE_ACCEPT_PAUSE_CONTINUE 0x00000002
69#define SERVICE_ACCEPT_SHUTDOWN 0x00000004
70#define SERVICE_ACCEPT_PARAMCHANGE 0x00000008
71#define SERVICE_ACCEPT_NETBINDCHANGE 0x00000010
72#define SERVICE_ACCEPT_HARDWAREPROFILECHANGE 0x00000020
73#define SERVICE_ACCEPT_POWEREVENT 0x00000040
Mike McCormack64d7cb12005-01-18 11:40:38 +000074#define SERVICE_ACCEPT_SESSIONCHANGE 0x00000080
Peter Hunnisett565b0082000-09-19 02:43:00 +000075
76/* Service Control Manager Object access types */
77#define SC_MANAGER_CONNECT 0x0001
78#define SC_MANAGER_CREATE_SERVICE 0x0002
79#define SC_MANAGER_ENUMERATE_SERVICE 0x0004
80#define SC_MANAGER_LOCK 0x0008
81#define SC_MANAGER_QUERY_LOCK_STATUS 0x0010
82#define SC_MANAGER_MODIFY_BOOT_CONFIG 0x0020
83#define SC_MANAGER_ALL_ACCESS ( STANDARD_RIGHTS_REQUIRED | \
84 SC_MANAGER_CONNECT | \
85 SC_MANAGER_CREATE_SERVICE | \
86 SC_MANAGER_ENUMERATE_SERVICE | \
87 SC_MANAGER_LOCK | \
88 SC_MANAGER_QUERY_LOCK_STATUS | \
89 SC_MANAGER_MODIFY_BOOT_CONFIG )
90
91#define SERVICE_QUERY_CONFIG 0x0001
92#define SERVICE_CHANGE_CONFIG 0x0002
93#define SERVICE_QUERY_STATUS 0x0004
94#define SERVICE_ENUMERATE_DEPENDENTS 0x0008
95#define SERVICE_START 0x0010
96#define SERVICE_STOP 0x0020
97#define SERVICE_PAUSE_CONTINUE 0x0040
98#define SERVICE_INTERROGATE 0x0080
99#define SERVICE_USER_DEFINED_CONTROL 0x0100
100
101#define SERVICE_ALL_ACCESS ( STANDARD_RIGHTS_REQUIRED | \
102 SERVICE_QUERY_CONFIG | \
103 SERVICE_CHANGE_CONFIG | \
104 SERVICE_QUERY_STATUS | \
105 SERVICE_ENUMERATE_DEPENDENTS | \
106 SERVICE_START | \
107 SERVICE_STOP | \
108 SERVICE_PAUSE_CONTINUE | \
109 SERVICE_INTERROGATE | \
110 SERVICE_USER_DEFINED_CONTROL )
111
Mike McCormack453436d2004-10-21 19:56:17 +0000112#define SERVICE_NO_CHANGE 0xffffffff
Peter Hunnisett565b0082000-09-19 02:43:00 +0000113
114
Patrik Stridvall4a739731999-07-04 11:01:21 +0000115/* Handle types */
116
Kevin Koltzaubfa30772005-08-23 09:32:39 +0000117DECLARE_HANDLE(SC_HANDLE);
118typedef SC_HANDLE *LPSC_HANDLE;
119DECLARE_HANDLE(SERVICE_STATUS_HANDLE);
Mike McCormack939179d2005-01-14 16:50:57 +0000120typedef LPVOID SC_LOCK;
Patrik Stridvall4a739731999-07-04 11:01:21 +0000121
122/* Service status structure */
123
124typedef struct _SERVICE_STATUS {
125 DWORD dwServiceType;
126 DWORD dwCurrentState;
127 DWORD dwControlsAccepted;
128 DWORD dwWin32ExitCode;
129 DWORD dwServiceSpecificExitCode;
130 DWORD dwCheckPoint;
131 DWORD dwWaitHint;
132} SERVICE_STATUS, *LPSERVICE_STATUS;
133
Steve Lustbaderf1e1fd02002-11-25 20:50:53 +0000134typedef enum _SC_STATUS_TYPE {
135 SC_STATUS_PROCESS_INFO = 0
136} SC_STATUS_TYPE;
137
Patrik Stridvall4a739731999-07-04 11:01:21 +0000138/* Service main function prototype */
139
Patrik Stridvallf94462f2002-01-31 23:22:07 +0000140typedef VOID (CALLBACK *LPSERVICE_MAIN_FUNCTIONA)(DWORD,LPSTR*);
141typedef VOID (CALLBACK *LPSERVICE_MAIN_FUNCTIONW)(DWORD,LPWSTR*);
Patrik Stridvall4a739731999-07-04 11:01:21 +0000142DECL_WINELIB_TYPE_AW(LPSERVICE_MAIN_FUNCTION)
143
144/* Service start table */
145
146typedef struct _SERVICE_TABLE_ENTRYA {
147 LPSTR lpServiceName;
148 LPSERVICE_MAIN_FUNCTIONA lpServiceProc;
149} SERVICE_TABLE_ENTRYA, *LPSERVICE_TABLE_ENTRYA;
150
151typedef struct _SERVICE_TABLE_ENTRYW {
152 LPWSTR lpServiceName;
153 LPSERVICE_MAIN_FUNCTIONW lpServiceProc;
154} SERVICE_TABLE_ENTRYW, *LPSERVICE_TABLE_ENTRYW;
155
156DECL_WINELIB_TYPE_AW(SERVICE_TABLE_ENTRY)
157DECL_WINELIB_TYPE_AW(LPSERVICE_TABLE_ENTRY)
158
159/* Service status enumeration structure */
160
161typedef struct _ENUM_SERVICE_STATUSA {
162 LPSTR lpServiceName;
163 LPSTR lpDisplayName;
164 SERVICE_STATUS ServiceStatus;
165} ENUM_SERVICE_STATUSA, *LPENUM_SERVICE_STATUSA;
166
167typedef struct _ENUM_SERVICE_STATUSW {
168 LPWSTR lpServiceName;
169 LPWSTR lpDisplayName;
170 SERVICE_STATUS ServiceStatus;
171} ENUM_SERVICE_STATUSW, *LPENUM_SERVICE_STATUSW;
172
Robert Shearmanfc6febc2006-01-31 18:04:01 +0100173typedef enum _SC_ENUM_TYPE {
174 SC_ENUM_PROCESS_INFO = 0
175} SC_ENUM_TYPE;
176
Patrik Stridvall4a739731999-07-04 11:01:21 +0000177DECL_WINELIB_TYPE_AW(ENUM_SERVICE_STATUS)
178DECL_WINELIB_TYPE_AW(LPENUM_SERVICE_STATUS)
179
Mike McCormack9b513ad2003-12-02 03:48:53 +0000180typedef struct _QUERY_SERVICE_CONFIGA {
181 DWORD dwServiceType;
182 DWORD dwStartType;
183 DWORD dwErrorControl;
184 LPSTR lpBinaryPathName;
185 LPSTR lpLoadOrderGroup;
186 DWORD dwTagId;
187 LPSTR lpDependencies;
188 LPSTR lpServiceStartName;
189 LPSTR lpDisplayName;
190} QUERY_SERVICE_CONFIGA, *LPQUERY_SERVICE_CONFIGA;
191
192typedef struct _QUERY_SERVICE_CONFIGW {
193 DWORD dwServiceType;
194 DWORD dwStartType;
195 DWORD dwErrorControl;
196 LPWSTR lpBinaryPathName;
197 LPWSTR lpLoadOrderGroup;
198 DWORD dwTagId;
199 LPWSTR lpDependencies;
200 LPWSTR lpServiceStartName;
201 LPWSTR lpDisplayName;
202} QUERY_SERVICE_CONFIGW, *LPQUERY_SERVICE_CONFIGW;
203
Aric Stewart3dc71b62003-12-13 03:25:37 +0000204/* defines and structures for ChangeServiceConfig2 */
205#define SERVICE_CONFIG_DESCRIPTION 1
206#define SERVICE_CONFIG_FAILURE_ACTIONS 2
207
208typedef struct _SERVICE_DESCRIPTIONA {
209 LPSTR lpDescription;
210} SERVICE_DESCRIPTIONA,*LPSERVICE_DESCRIPTIONA;
211
212typedef struct _SERVICE_DESCRIPTIONW {
213 LPWSTR lpDescription;
214} SERVICE_DESCRIPTIONW,*LPSERVICE_DESCRIPTIONW;
215
216DECL_WINELIB_TYPE_AW(SERVICE_DESCRIPTION)
217DECL_WINELIB_TYPE_AW(LPSERVICE_DESCRIPTION)
218
219typedef enum _SC_ACTION_TYPE {
220 SC_ACTION_NONE = 0,
221 SC_ACTION_RESTART = 1,
222 SC_ACTION_REBOOT = 2,
223 SC_ACTION_RUN_COMMAND = 3
224} SC_ACTION_TYPE;
225
226typedef struct _SC_ACTION {
227 SC_ACTION_TYPE Type;
228 DWORD Delay;
229} SC_ACTION,*LPSC_ACTION;
230
231typedef struct _SERVICE_FAILURE_ACTIONSA {
232 DWORD dwResetPeriod;
233 LPSTR lpRebootMsg;
234 LPSTR lpCommand;
235 DWORD cActions;
236 SC_ACTION * lpsaActions;
237} SERVICE_FAILURE_ACTIONSA,*LPSERVICE_FAILURE_ACTIONSA;
238
239typedef struct _SERVICE_FAILURE_ACTIONSW {
240 DWORD dwResetPeriod;
241 LPWSTR lpRebootMsg;
242 LPWSTR lpCommand;
243 DWORD cActions;
244 SC_ACTION * lpsaActions;
245} SERVICE_FAILURE_ACTIONSW,*LPSERVICE_FAILURE_ACTIONSW;
246
247DECL_WINELIB_TYPE_AW(SERVICE_FAILURE_ACTIONS)
248DECL_WINELIB_TYPE_AW(LPSERVICE_FAILURE_ACTIONS)
249
Hans Leidekker0cc20312005-01-03 17:12:51 +0000250typedef struct _QUERY_SERVICE_LOCK_STATUSA
251{
252 DWORD fIsLocked;
253 LPSTR lpLockOwner;
254 DWORD dwLockDuration;
255} QUERY_SERVICE_LOCK_STATUSA, *LPQUERY_SERVICE_LOCK_STATUSA;
256
257typedef struct _QUERY_SERVICE_LOCK_STATUSW
258{
259 DWORD fIsLocked;
260 LPWSTR lpLockOwner;
261 DWORD dwLockDuration;
262} QUERY_SERVICE_LOCK_STATUSW, *LPQUERY_SERVICE_LOCK_STATUSW;
263
264DECL_WINELIB_TYPE_AW(QUERY_SERVICE_LOCK_STATUS)
265
Patrik Stridvall4a739731999-07-04 11:01:21 +0000266/* Service control handler function prototype */
267
Patrik Stridvallf94462f2002-01-31 23:22:07 +0000268typedef VOID (WINAPI *LPHANDLER_FUNCTION)(DWORD);
Mike McCormack453436d2004-10-21 19:56:17 +0000269typedef DWORD (WINAPI *LPHANDLER_FUNCTION_EX)(DWORD,DWORD,LPVOID,LPVOID);
Patrik Stridvall4a739731999-07-04 11:01:21 +0000270
271/* API function prototypes */
272
Aric Stewart3dc71b62003-12-13 03:25:37 +0000273BOOL WINAPI ChangeServiceConfigA(SC_HANDLE,DWORD,DWORD,DWORD,LPCSTR,LPCSTR,LPDWORD,LPCSTR,LPCSTR,LPCSTR,LPCSTR);
274BOOL WINAPI ChangeServiceConfigW(SC_HANDLE,DWORD,DWORD,DWORD,LPCWSTR,LPCWSTR,LPDWORD,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR);
275#define ChangeServiceConfig WINELIB_NAME_AW(ChangeServiceConfig)
276BOOL WINAPI ChangeServiceConfig2A(SC_HANDLE,DWORD,LPVOID);
277BOOL WINAPI ChangeServiceConfig2W(SC_HANDLE,DWORD,LPVOID);
278#define ChangeServiceConfig2 WINELIB_NAME_AW(ChangeServiceConfig2)
Patrik Stridvall4a739731999-07-04 11:01:21 +0000279BOOL WINAPI CloseServiceHandle(SC_HANDLE);
280BOOL WINAPI ControlService(SC_HANDLE,DWORD,LPSERVICE_STATUS);
Peter Hunnisett565b0082000-09-19 02:43:00 +0000281SC_HANDLE WINAPI CreateServiceA(SC_HANDLE,LPCSTR,LPCSTR,DWORD,DWORD,DWORD,DWORD,LPCSTR,
Patrik Stridvall4a739731999-07-04 11:01:21 +0000282 LPCSTR,LPDWORD,LPCSTR,LPCSTR,LPCSTR);
Peter Hunnisett565b0082000-09-19 02:43:00 +0000283SC_HANDLE WINAPI CreateServiceW(SC_HANDLE,LPCWSTR,LPCWSTR,DWORD,DWORD,DWORD,DWORD,LPCWSTR,
Patrik Stridvall4a739731999-07-04 11:01:21 +0000284 LPCWSTR,LPDWORD,LPCWSTR,LPCWSTR,LPCWSTR);
285#define CreateService WINELIB_NAME_AW(CreateService)
286BOOL WINAPI DeleteService(SC_HANDLE);
Hans Leidekker49f7f6c2004-12-21 16:16:10 +0000287BOOL WINAPI EnumDependentServicesA(SC_HANDLE,DWORD,LPENUM_SERVICE_STATUSA,DWORD,LPDWORD,LPDWORD);
288BOOL WINAPI EnumDependentServicesW(SC_HANDLE,DWORD,LPENUM_SERVICE_STATUSW,DWORD,LPDWORD,LPDWORD);
289#define EnumDependentServices WINELIB_NAME_AW(EnumDependentServices)
Patrik Stridvall4a739731999-07-04 11:01:21 +0000290BOOL WINAPI EnumServicesStatusA(SC_HANDLE,DWORD,DWORD,LPENUM_SERVICE_STATUSA,
291 DWORD,LPDWORD,LPDWORD,LPDWORD);
292BOOL WINAPI EnumServicesStatusW(SC_HANDLE,DWORD,DWORD,LPENUM_SERVICE_STATUSW,
293 DWORD,LPDWORD,LPDWORD,LPDWORD);
294#define EnumServicesStatus WINELIB_NAME_AW(EnumServicesStatus)
Mike McCormack939179d2005-01-14 16:50:57 +0000295BOOL WINAPI GetServiceDisplayNameA(SC_HANDLE,LPCSTR,LPSTR,LPDWORD);
296BOOL WINAPI GetServiceDisplayNameW(SC_HANDLE,LPCWSTR,LPWSTR,LPDWORD);
297#define GetServiceDisplayName WINELIB_NAME_AW(GetServiceDisplayName)
Hans Leidekker0cc20312005-01-03 17:12:51 +0000298BOOL WINAPI GetServiceKeyNameA(SC_HANDLE,LPCSTR,LPSTR,LPDWORD);
299BOOL WINAPI GetServiceKeyNameW(SC_HANDLE,LPCWSTR,LPWSTR,LPDWORD);
300#define GetServiceKeyName WINELIB_NAME_AW(GetServiceKeyName)
Mike McCormack939179d2005-01-14 16:50:57 +0000301SC_LOCK WINAPI LockServiceDatabase(SC_HANDLE);
Vincent BĂ©ronf41abbd2005-11-21 12:06:00 +0000302BOOL WINAPI NotifyBootConfigStatus(BOOL);
Patrik Stridvall4a739731999-07-04 11:01:21 +0000303SC_HANDLE WINAPI OpenSCManagerA(LPCSTR,LPCSTR,DWORD);
304SC_HANDLE WINAPI OpenSCManagerW(LPCWSTR,LPCWSTR,DWORD);
305#define OpenSCManager WINELIB_NAME_AW(OpenSCManager)
306SC_HANDLE WINAPI OpenServiceA(SC_HANDLE,LPCSTR,DWORD);
307SC_HANDLE WINAPI OpenServiceW(SC_HANDLE,LPCWSTR,DWORD);
308#define OpenService WINELIB_NAME_AW(OpenService)
Patrik Stridvall4a739731999-07-04 11:01:21 +0000309BOOL WINAPI QueryServiceStatus(SC_HANDLE,LPSERVICE_STATUS);
Steve Lustbaderf1e1fd02002-11-25 20:50:53 +0000310BOOL WINAPI QueryServiceStatusEx(SC_HANDLE,SC_STATUS_TYPE,LPBYTE,DWORD,LPDWORD);
Mike McCormack9b513ad2003-12-02 03:48:53 +0000311BOOL WINAPI QueryServiceConfigA(SC_HANDLE,LPQUERY_SERVICE_CONFIGA,DWORD,LPDWORD);
312BOOL WINAPI QueryServiceConfigW(SC_HANDLE,LPQUERY_SERVICE_CONFIGW,DWORD,LPDWORD);
313#define QueryServiceConfig WINELIB_NAME_AW(QueryServiceConfig)
Hans Leidekker0cc20312005-01-03 17:12:51 +0000314BOOL WINAPI QueryServiceLockStatusA(SC_HANDLE,LPQUERY_SERVICE_LOCK_STATUSA,DWORD,LPDWORD);
315BOOL WINAPI QueryServiceLockStatusW(SC_HANDLE,LPQUERY_SERVICE_LOCK_STATUSW,DWORD,LPDWORD);
316#define QueryServiceLockStatus WINELIB_NAME_AW(QueryServiceLockStatus)
Mike McCormack5e62bd02005-06-13 10:04:20 +0000317BOOL WINAPI QueryServiceObjectSecurity(SC_HANDLE,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,DWORD,LPDWORD);
Mike McCormack939179d2005-01-14 16:50:57 +0000318SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerA(LPCSTR,LPHANDLER_FUNCTION);
319SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerW(LPCWSTR,LPHANDLER_FUNCTION);
320#define RegisterServiceCtrlHandler WINELIB_NAME_AW(RegisterServiceCtrlHandler)
321SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerExA(LPCSTR,LPHANDLER_FUNCTION_EX,LPVOID);
322SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerExW(LPCWSTR,LPHANDLER_FUNCTION_EX,LPVOID);
323#define RegisterServiceCtrlHandlerEx WINELIB_NAME_AW(RegisterServiceCtrlHandlerEx)
324BOOL WINAPI SetServiceObjectSecurity(SC_HANDLE,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR);
325BOOL WINAPI SetServiceStatus(SERVICE_STATUS_HANDLE,LPSERVICE_STATUS);
326BOOL WINAPI StartServiceA(SC_HANDLE,DWORD,LPCSTR*);
327BOOL WINAPI StartServiceW(SC_HANDLE,DWORD,LPCWSTR*);
328#define StartService WINELIB_NAME_AW(StartService)
329BOOL WINAPI StartServiceCtrlDispatcherA(LPSERVICE_TABLE_ENTRYA);
330BOOL WINAPI StartServiceCtrlDispatcherW(LPSERVICE_TABLE_ENTRYW);
331#define StartServiceCtrlDispatcher WINELIB_NAME_AW(StartServiceCtrlDispatcher)
332BOOL WINAPI UnlockServiceDatabase(SC_LOCK);
Mike McCormack9b513ad2003-12-02 03:48:53 +0000333
Patrik Stridvall4a739731999-07-04 11:01:21 +0000334#ifdef __cplusplus
335} /* extern "C" */
336#endif /* defined(__cplusplus) */
337
338#endif /* !defined(__WINE_WINSVC_H) */