winapi_ui_automation/um/
winsvc.rs

1// Licensed under the Apache License, Version 2.0
2// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4// All files in the project carrying such notice may not be copied, modified, or distributed
5// except according to those terms.
6//! Header file for the Service Control Manager
7use shared::minwindef::{BOOL, DWORD, LPBYTE, LPDWORD, LPVOID};
8use um::winnt::{
9    HANDLE, LPCSTR, LPCWSTR, LPSTR, LPWSTR, PSECURITY_DESCRIPTOR, PVOID,
10    SECURITY_INFORMATION, STANDARD_RIGHTS_REQUIRED
11};
12pub const SERVICE_NO_CHANGE: DWORD = 0xffffffff;
13pub const SERVICE_ACTIVE: DWORD = 0x00000001;
14pub const SERVICE_INACTIVE: DWORD = 0x00000002;
15pub const SERVICE_STATE_ALL: DWORD = SERVICE_ACTIVE | SERVICE_INACTIVE;
16pub const SERVICE_CONTROL_STOP: DWORD = 0x00000001;
17pub const SERVICE_CONTROL_PAUSE: DWORD = 0x00000002;
18pub const SERVICE_CONTROL_CONTINUE: DWORD = 0x00000003;
19pub const SERVICE_CONTROL_INTERROGATE: DWORD = 0x00000004;
20pub const SERVICE_CONTROL_SHUTDOWN: DWORD = 0x00000005;
21pub const SERVICE_CONTROL_PARAMCHANGE: DWORD = 0x00000006;
22pub const SERVICE_CONTROL_NETBINDADD: DWORD = 0x00000007;
23pub const SERVICE_CONTROL_NETBINDREMOVE: DWORD = 0x00000008;
24pub const SERVICE_CONTROL_NETBINDENABLE: DWORD = 0x00000009;
25pub const SERVICE_CONTROL_NETBINDDISABLE: DWORD = 0x0000000A;
26pub const SERVICE_CONTROL_DEVICEEVENT: DWORD = 0x0000000B;
27pub const SERVICE_CONTROL_HARDWAREPROFILECHANGE: DWORD = 0x0000000C;
28pub const SERVICE_CONTROL_POWEREVENT: DWORD = 0x0000000D;
29pub const SERVICE_CONTROL_SESSIONCHANGE: DWORD = 0x0000000E;
30pub const SERVICE_CONTROL_PRESHUTDOWN: DWORD = 0x0000000F;
31pub const SERVICE_CONTROL_TIMECHANGE: DWORD = 0x00000010;
32pub const SERVICE_CONTROL_TRIGGEREVENT: DWORD = 0x00000020;
33pub const SERVICE_STOPPED: DWORD = 0x00000001;
34pub const SERVICE_START_PENDING: DWORD = 0x00000002;
35pub const SERVICE_STOP_PENDING: DWORD = 0x00000003;
36pub const SERVICE_RUNNING: DWORD = 0x00000004;
37pub const SERVICE_CONTINUE_PENDING: DWORD = 0x00000005;
38pub const SERVICE_PAUSE_PENDING: DWORD = 0x00000006;
39pub const SERVICE_PAUSED: DWORD = 0x00000007;
40pub const SERVICE_ACCEPT_STOP: DWORD = 0x00000001;
41pub const SERVICE_ACCEPT_PAUSE_CONTINUE: DWORD = 0x00000002;
42pub const SERVICE_ACCEPT_SHUTDOWN: DWORD = 0x00000004;
43pub const SERVICE_ACCEPT_PARAMCHANGE: DWORD = 0x00000008;
44pub const SERVICE_ACCEPT_NETBINDCHANGE: DWORD = 0x00000010;
45pub const SERVICE_ACCEPT_HARDWAREPROFILECHANGE: DWORD = 0x00000020;
46pub const SERVICE_ACCEPT_POWEREVENT: DWORD = 0x00000040;
47pub const SERVICE_ACCEPT_SESSIONCHANGE: DWORD = 0x00000080;
48pub const SERVICE_ACCEPT_PRESHUTDOWN: DWORD = 0x00000100;
49pub const SERVICE_ACCEPT_TIMECHANGE: DWORD = 0x00000200;
50pub const SERVICE_ACCEPT_TRIGGEREVENT: DWORD = 0x00000400;
51// SERVICE_ACCEPT_USER_LOGOFF
52pub const SC_MANAGER_CONNECT: DWORD = 0x0001;
53pub const SC_MANAGER_CREATE_SERVICE: DWORD = 0x0002;
54pub const SC_MANAGER_ENUMERATE_SERVICE: DWORD = 0x0004;
55pub const SC_MANAGER_LOCK: DWORD = 0x0008;
56pub const SC_MANAGER_QUERY_LOCK_STATUS: DWORD = 0x0010;
57pub const SC_MANAGER_MODIFY_BOOT_CONFIG: DWORD = 0x0020;
58pub const SC_MANAGER_ALL_ACCESS: DWORD = STANDARD_RIGHTS_REQUIRED | SC_MANAGER_CONNECT
59    | SC_MANAGER_CREATE_SERVICE | SC_MANAGER_ENUMERATE_SERVICE | SC_MANAGER_LOCK
60    | SC_MANAGER_QUERY_LOCK_STATUS | SC_MANAGER_MODIFY_BOOT_CONFIG;
61pub const SERVICE_QUERY_CONFIG: DWORD = 0x0001;
62pub const SERVICE_CHANGE_CONFIG: DWORD = 0x0002;
63pub const SERVICE_QUERY_STATUS: DWORD = 0x0004;
64pub const SERVICE_ENUMERATE_DEPENDENTS: DWORD = 0x0008;
65pub const SERVICE_START: DWORD = 0x0010;
66pub const SERVICE_STOP: DWORD = 0x0020;
67pub const SERVICE_PAUSE_CONTINUE: DWORD = 0x0040;
68pub const SERVICE_INTERROGATE: DWORD = 0x0080;
69pub const SERVICE_USER_DEFINED_CONTROL: DWORD = 0x0100;
70pub const SERVICE_ALL_ACCESS: DWORD = STANDARD_RIGHTS_REQUIRED | SERVICE_QUERY_CONFIG
71    | SERVICE_CHANGE_CONFIG | SERVICE_QUERY_STATUS | SERVICE_ENUMERATE_DEPENDENTS | SERVICE_START
72    | SERVICE_STOP | SERVICE_PAUSE_CONTINUE | SERVICE_INTERROGATE | SERVICE_USER_DEFINED_CONTROL;
73pub const SERVICE_RUNS_IN_SYSTEM_PROCESS: DWORD = 0x00000001;
74pub const SERVICE_CONFIG_DESCRIPTION: DWORD = 1;
75pub const SERVICE_CONFIG_FAILURE_ACTIONS: DWORD = 2;
76pub const SERVICE_CONFIG_DELAYED_AUTO_START_INFO: DWORD = 3;
77pub const SERVICE_CONFIG_FAILURE_ACTIONS_FLAG: DWORD = 4;
78pub const SERVICE_CONFIG_SERVICE_SID_INFO: DWORD = 5;
79pub const SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO: DWORD = 6;
80pub const SERVICE_CONFIG_PRESHUTDOWN_INFO: DWORD = 7;
81pub const SERVICE_CONFIG_TRIGGER_INFO: DWORD = 8;
82pub const SERVICE_CONFIG_PREFERRED_NODE: DWORD = 9;
83pub const SERVICE_CONFIG_LAUNCH_PROTECTED: DWORD = 12;
84pub const SERVICE_NOTIFY_STATUS_CHANGE_1: DWORD = 1;
85pub const SERVICE_NOTIFY_STATUS_CHANGE_2: DWORD = 2;
86pub const SERVICE_NOTIFY_STATUS_CHANGE: DWORD = SERVICE_NOTIFY_STATUS_CHANGE_2;
87pub const SERVICE_NOTIFY_STOPPED: DWORD = 0x00000001;
88pub const SERVICE_NOTIFY_START_PENDING: DWORD = 0x00000002;
89pub const SERVICE_NOTIFY_STOP_PENDING: DWORD = 0x00000004;
90pub const SERVICE_NOTIFY_RUNNING: DWORD = 0x00000008;
91pub const SERVICE_NOTIFY_CONTINUE_PENDING: DWORD = 0x00000010;
92pub const SERVICE_NOTIFY_PAUSE_PENDING: DWORD = 0x00000020;
93pub const SERVICE_NOTIFY_PAUSED: DWORD = 0x00000040;
94pub const SERVICE_NOTIFY_CREATED: DWORD = 0x00000080;
95pub const SERVICE_NOTIFY_DELETED: DWORD = 0x00000100;
96pub const SERVICE_NOTIFY_DELETE_PENDING: DWORD = 0x00000200;
97pub const SERVICE_STOP_REASON_FLAG_MIN: DWORD = 0x00000000;
98pub const SERVICE_STOP_REASON_FLAG_UNPLANNED: DWORD = 0x10000000;
99pub const SERVICE_STOP_REASON_FLAG_CUSTOM: DWORD = 0x20000000;
100pub const SERVICE_STOP_REASON_FLAG_PLANNED: DWORD = 0x40000000;
101pub const SERVICE_STOP_REASON_FLAG_MAX: DWORD = 0x80000000;
102pub const SERVICE_STOP_REASON_MAJOR_MIN: DWORD = 0x00000000;
103pub const SERVICE_STOP_REASON_MAJOR_OTHER: DWORD = 0x00010000;
104pub const SERVICE_STOP_REASON_MAJOR_HARDWARE: DWORD = 0x00020000;
105pub const SERVICE_STOP_REASON_MAJOR_OPERATINGSYSTEM: DWORD = 0x00030000;
106pub const SERVICE_STOP_REASON_MAJOR_SOFTWARE: DWORD = 0x00040000;
107pub const SERVICE_STOP_REASON_MAJOR_APPLICATION: DWORD = 0x00050000;
108pub const SERVICE_STOP_REASON_MAJOR_NONE: DWORD = 0x00060000;
109pub const SERVICE_STOP_REASON_MAJOR_MAX: DWORD = 0x00070000;
110pub const SERVICE_STOP_REASON_MAJOR_MIN_CUSTOM: DWORD = 0x00400000;
111pub const SERVICE_STOP_REASON_MAJOR_MAX_CUSTOM: DWORD = 0x00ff0000;
112pub const SERVICE_STOP_REASON_MINOR_MIN: DWORD = 0x00000000;
113pub const SERVICE_STOP_REASON_MINOR_OTHER: DWORD = 0x00000001;
114pub const SERVICE_STOP_REASON_MINOR_MAINTENANCE: DWORD = 0x00000002;
115pub const SERVICE_STOP_REASON_MINOR_INSTALLATION: DWORD = 0x00000003;
116pub const SERVICE_STOP_REASON_MINOR_UPGRADE: DWORD = 0x00000004;
117pub const SERVICE_STOP_REASON_MINOR_RECONFIG: DWORD = 0x00000005;
118pub const SERVICE_STOP_REASON_MINOR_HUNG: DWORD = 0x00000006;
119pub const SERVICE_STOP_REASON_MINOR_UNSTABLE: DWORD = 0x00000007;
120pub const SERVICE_STOP_REASON_MINOR_DISK: DWORD = 0x00000008;
121pub const SERVICE_STOP_REASON_MINOR_NETWORKCARD: DWORD = 0x00000009;
122pub const SERVICE_STOP_REASON_MINOR_ENVIRONMENT: DWORD = 0x0000000a;
123pub const SERVICE_STOP_REASON_MINOR_HARDWARE_DRIVER: DWORD = 0x0000000b;
124pub const SERVICE_STOP_REASON_MINOR_OTHERDRIVER: DWORD = 0x0000000c;
125pub const SERVICE_STOP_REASON_MINOR_SERVICEPACK: DWORD = 0x0000000d;
126pub const SERVICE_STOP_REASON_MINOR_SOFTWARE_UPDATE: DWORD = 0x0000000e;
127pub const SERVICE_STOP_REASON_MINOR_SECURITYFIX: DWORD = 0x0000000f;
128pub const SERVICE_STOP_REASON_MINOR_SECURITY: DWORD = 0x00000010;
129pub const SERVICE_STOP_REASON_MINOR_NETWORK_CONNECTIVITY: DWORD = 0x00000011;
130pub const SERVICE_STOP_REASON_MINOR_WMI: DWORD = 0x00000012;
131pub const SERVICE_STOP_REASON_MINOR_SERVICEPACK_UNINSTALL: DWORD = 0x00000013;
132pub const SERVICE_STOP_REASON_MINOR_SOFTWARE_UPDATE_UNINSTALL: DWORD = 0x00000014;
133pub const SERVICE_STOP_REASON_MINOR_SECURITYFIX_UNINSTALL: DWORD = 0x00000015;
134pub const SERVICE_STOP_REASON_MINOR_MMC: DWORD = 0x00000016;
135pub const SERVICE_STOP_REASON_MINOR_NONE: DWORD = 0x00000017;
136pub const SERVICE_STOP_REASON_MINOR_MAX: DWORD = 0x00000018;
137pub const SERVICE_STOP_REASON_MINOR_MIN_CUSTOM: DWORD = 0x00000100;
138pub const SERVICE_STOP_REASON_MINOR_MAX_CUSTOM: DWORD = 0x0000FFFF;
139pub const SERVICE_CONTROL_STATUS_REASON_INFO: DWORD = 1;
140pub const SERVICE_SID_TYPE_NONE: DWORD = 0x00000000;
141pub const SERVICE_SID_TYPE_UNRESTRICTED: DWORD = 0x00000001;
142pub const SERVICE_SID_TYPE_RESTRICTED: DWORD = 0x00000002 | SERVICE_SID_TYPE_UNRESTRICTED;
143pub const SERVICE_TRIGGER_TYPE_DEVICE_INTERFACE_ARRIVAL: DWORD = 1;
144pub const SERVICE_TRIGGER_TYPE_IP_ADDRESS_AVAILABILITY: DWORD = 2;
145pub const SERVICE_TRIGGER_TYPE_DOMAIN_JOIN: DWORD = 3;
146pub const SERVICE_TRIGGER_TYPE_FIREWALL_PORT_EVENT: DWORD = 4;
147pub const SERVICE_TRIGGER_TYPE_GROUP_POLICY: DWORD = 5;
148pub const SERVICE_TRIGGER_TYPE_NETWORK_ENDPOINT: DWORD = 6;
149pub const SERVICE_TRIGGER_TYPE_CUSTOM_SYSTEM_STATE_CHANGE: DWORD = 7;
150pub const SERVICE_TRIGGER_TYPE_CUSTOM: DWORD = 20;
151pub const SERVICE_TRIGGER_DATA_TYPE_BINARY: DWORD = 1;
152pub const SERVICE_TRIGGER_DATA_TYPE_STRING: DWORD = 2;
153pub const SERVICE_TRIGGER_DATA_TYPE_LEVEL: DWORD = 3;
154pub const SERVICE_TRIGGER_DATA_TYPE_KEYWORD_ANY: DWORD = 4;
155pub const SERVICE_TRIGGER_DATA_TYPE_KEYWORD_ALL: DWORD = 5;
156pub const SERVICE_START_REASON_DEMAND: DWORD = 0x00000001;
157pub const SERVICE_START_REASON_AUTO: DWORD = 0x00000002;
158pub const SERVICE_START_REASON_TRIGGER: DWORD = 0x00000004;
159pub const SERVICE_START_REASON_RESTART_ON_FAILURE: DWORD = 0x00000008;
160pub const SERVICE_START_REASON_DELAYEDAUTO: DWORD = 0x00000010;
161pub const SERVICE_DYNAMIC_INFORMATION_LEVEL_START_REASON: DWORD = 1;
162pub const SERVICE_LAUNCH_PROTECTED_NONE: DWORD = 0;
163pub const SERVICE_LAUNCH_PROTECTED_WINDOWS: DWORD = 1;
164pub const SERVICE_LAUNCH_PROTECTED_WINDOWS_LIGHT: DWORD = 2;
165pub const SERVICE_LAUNCH_PROTECTED_ANTIMALWARE_LIGHT: DWORD = 3;
166DEFINE_GUID!{NETWORK_MANAGER_FIRST_IP_ADDRESS_ARRIVAL_GUID,
167    0x4f27f2de, 0x14e2, 0x430b, 0xa5, 0x49, 0x7c, 0xd4, 0x8c, 0xbc, 0x82, 0x45}
168DEFINE_GUID!{NETWORK_MANAGER_LAST_IP_ADDRESS_REMOVAL_GUID,
169    0xcc4ba62a, 0x162e, 0x4648, 0x84, 0x7a, 0xb6, 0xbd, 0xf9, 0x93, 0xe3, 0x35}
170DEFINE_GUID!{DOMAIN_JOIN_GUID,
171    0x1ce20aba, 0x9851, 0x4421, 0x94, 0x30, 0x1d, 0xde, 0xb7, 0x66, 0xe8, 0x09}
172DEFINE_GUID!{DOMAIN_LEAVE_GUID,
173    0xddaf516e, 0x58c2, 0x4866, 0x95, 0x74, 0xc3, 0xb6, 0x15, 0xd4, 0x2e, 0xa1}
174DEFINE_GUID!{FIREWALL_PORT_OPEN_GUID,
175    0xb7569e07, 0x8421, 0x4ee0, 0xad, 0x10, 0x86, 0x91, 0x5a, 0xfd, 0xad, 0x09}
176DEFINE_GUID!{FIREWALL_PORT_CLOSE_GUID,
177    0xa144ed38, 0x8e12, 0x4de4, 0x9d, 0x96, 0xe6, 0x47, 0x40, 0xb1, 0xa5, 0x24}
178DEFINE_GUID!{MACHINE_POLICY_PRESENT_GUID,
179    0x659fcae6, 0x5bdb, 0x4da9, 0xb1, 0xff, 0xca, 0x2a, 0x17, 0x8d, 0x46, 0xe0}
180DEFINE_GUID!{USER_POLICY_PRESENT_GUID,
181    0x54fb46c8, 0xf089, 0x464c, 0xb1, 0xfd, 0x59, 0xd1, 0xb6, 0x2c, 0x3b, 0x50}
182DEFINE_GUID!{RPC_INTERFACE_EVENT_GUID,
183    0xbc90d167, 0x9470, 0x4139, 0xa9, 0xba, 0xbe, 0x0b, 0xbb, 0xf5, 0xb7, 0x4d}
184DEFINE_GUID!{NAMED_PIPE_EVENT_GUID,
185    0x1f81d131, 0x3fac, 0x4537, 0x9e, 0x0c, 0x7e, 0x7b, 0x0c, 0x2f, 0x4b, 0x55}
186DEFINE_GUID!{CUSTOM_SYSTEM_STATE_CHANGE_EVENT_GUID,
187    0x2d7a2816, 0x0c5e, 0x45fc, 0x9c, 0xe7, 0x57, 0x0e, 0x5e, 0xcd, 0xe9, 0xc9}
188ENUM!{enum SC_ACTION_TYPE {
189    SC_ACTION_NONE = 0,
190    SC_ACTION_RESTART = 1,
191    SC_ACTION_REBOOT = 2,
192    SC_ACTION_RUN_COMMAND = 3,
193}}
194STRUCT!{struct SC_ACTION {
195    Type: SC_ACTION_TYPE,
196    Delay: DWORD,
197}}
198pub type LPSC_ACTION = *mut SC_ACTION;
199STRUCT!{struct SERVICE_FAILURE_ACTIONSW {
200    dwResetPeriod: DWORD,
201    lpRebootMsg: LPWSTR,
202    lpCommand: LPWSTR,
203    cActions: DWORD,
204    lpsaActions: LPSC_ACTION,
205}}
206pub type LPSERVICE_FAILURE_ACTIONSW = *mut SERVICE_FAILURE_ACTIONSW;
207STRUCT!{struct SERVICE_DELAYED_AUTO_START_INFO {
208    fDelayedAutostart: BOOL,
209}}
210STRUCT!{struct SERVICE_FAILURE_ACTIONS_FLAG {
211    fFailureActionsOnNonCrashFailures: BOOL,
212}}
213DECLARE_HANDLE!{SC_HANDLE, SC_HANDLE__}
214pub type LPSC_HANDLE = *mut SC_HANDLE;
215DECLARE_HANDLE!{SERVICE_STATUS_HANDLE, SERVICE_STATUS_HANDLE__}
216ENUM!{enum SC_STATUS_TYPE {
217    SC_STATUS_PROCESS_INFO = 0,
218}}
219ENUM!{enum SC_ENUM_TYPE {
220    SC_ENUM_PROCESS_INFO = 0,
221}}
222STRUCT!{struct SERVICE_STATUS {
223    dwServiceType: DWORD,
224    dwCurrentState: DWORD,
225    dwControlsAccepted: DWORD,
226    dwWin32ExitCode: DWORD,
227    dwServiceSpecificExitCode: DWORD,
228    dwCheckPoint: DWORD,
229    dwWaitHint: DWORD,
230}}
231pub type LPSERVICE_STATUS = *mut SERVICE_STATUS;
232STRUCT!{struct SERVICE_STATUS_PROCESS {
233    dwServiceType: DWORD,
234    dwCurrentState: DWORD,
235    dwControlsAccepted: DWORD,
236    dwWin32ExitCode: DWORD,
237    dwServiceSpecificExitCode: DWORD,
238    dwCheckPoint: DWORD,
239    dwWaitHint: DWORD,
240    dwProcessId: DWORD,
241    dwServiceFlags: DWORD,
242}}
243pub type LPSERVICE_STATUS_PROCESS = *mut SERVICE_STATUS_PROCESS;
244STRUCT!{struct ENUM_SERVICE_STATUSA {
245    lpServiceName: LPSTR,
246    lpDisplayName: LPSTR,
247    ServiceStatus: SERVICE_STATUS,
248}}
249pub type LPENUM_SERVICE_STATUSA = *mut ENUM_SERVICE_STATUSA;
250STRUCT!{struct ENUM_SERVICE_STATUSW {
251    lpServiceName: LPWSTR,
252    lpDisplayName: LPWSTR,
253    ServiceStatus: SERVICE_STATUS,
254}}
255pub type LPENUM_SERVICE_STATUSW = *mut ENUM_SERVICE_STATUSW;
256STRUCT!{struct ENUM_SERVICE_STATUS_PROCESSA {
257    lpServiceName: LPSTR,
258    lpDisplayName: LPSTR,
259    ServiceStatusProcess: SERVICE_STATUS_PROCESS,
260}}
261pub type LPENUM_SERVICE_STATUS_PROCESSA = *mut ENUM_SERVICE_STATUS_PROCESSA;
262STRUCT!{struct ENUM_SERVICE_STATUS_PROCESSW {
263    lpServiceName: LPWSTR,
264    lpDisplayName: LPWSTR,
265    ServiceStatusProcess: SERVICE_STATUS_PROCESS,
266}}
267pub type LPENUM_SERVICE_STATUS_PROCESSW = *mut ENUM_SERVICE_STATUS_PROCESSW;
268pub type SC_LOCK = LPVOID;
269STRUCT!{struct QUERY_SERVICE_LOCK_STATUSA {
270    fIsLocked: DWORD,
271    lpLockOwner: LPSTR,
272    dwLockDuration: DWORD,
273}}
274pub type LPQUERY_SERVICE_LOCK_STATUSA = *mut QUERY_SERVICE_LOCK_STATUSA;
275STRUCT!{struct QUERY_SERVICE_LOCK_STATUSW {
276    fIsLocked: DWORD,
277    lpLockOwner: LPWSTR,
278    dwLockDuration: DWORD,
279}}
280pub type LPQUERY_SERVICE_LOCK_STATUSW = *mut QUERY_SERVICE_LOCK_STATUSW;
281STRUCT!{struct QUERY_SERVICE_CONFIGA {
282    dwServiceType: DWORD,
283    dwStartType: DWORD,
284    dwErrorControl: DWORD,
285    lpBinaryPathName: LPSTR,
286    lpLoadOrderGroup: LPSTR,
287    dwTagId: DWORD,
288    lpDependencies: LPSTR,
289    lpServiceStartName: LPSTR,
290    lpDisplayName: LPSTR,
291}}
292pub type LPQUERY_SERVICE_CONFIGA = *mut QUERY_SERVICE_CONFIGA;
293STRUCT!{struct QUERY_SERVICE_CONFIGW {
294    dwServiceType: DWORD,
295    dwStartType: DWORD,
296    dwErrorControl: DWORD,
297    lpBinaryPathName: LPWSTR,
298    lpLoadOrderGroup: LPWSTR,
299    dwTagId: DWORD,
300    lpDependencies: LPWSTR,
301    lpServiceStartName: LPWSTR,
302    lpDisplayName: LPWSTR,
303}}
304pub type LPQUERY_SERVICE_CONFIGW = *mut QUERY_SERVICE_CONFIGW;
305STRUCT!{struct SERVICE_DESCRIPTIONA {
306    lpDescription: LPSTR,
307}}
308pub type LPSERVICE_DESCRIPTIONA = *mut SERVICE_DESCRIPTIONA;
309STRUCT!{struct SERVICE_DESCRIPTIONW {
310    lpDescription: LPWSTR,
311}}
312pub type LPSERVICE_DESCRIPTIONW = *mut SERVICE_DESCRIPTIONW;
313FN!{stdcall LPSERVICE_MAIN_FUNCTIONW(
314    dwNumServicesArgs: DWORD,
315    lpServiceArgVectors: *mut LPWSTR,
316) -> ()}
317FN!{stdcall LPSERVICE_MAIN_FUNCTIONA(
318    dwNumServicesArgs: DWORD,
319    lpServiceArgVectors: *mut LPSTR,
320) -> ()}
321STRUCT!{struct SERVICE_TABLE_ENTRYA {
322    lpServiceName: LPCSTR,
323    lpServiceProc: LPSERVICE_MAIN_FUNCTIONA,
324}}
325pub type LPSERVICE_TABLE_ENTRYA = *mut SERVICE_TABLE_ENTRYA;
326STRUCT!{struct SERVICE_TABLE_ENTRYW {
327    lpServiceName: LPCWSTR,
328    lpServiceProc: LPSERVICE_MAIN_FUNCTIONW,
329}}
330pub type LPSERVICE_TABLE_ENTRYW = *mut SERVICE_TABLE_ENTRYW;
331FN!{stdcall LPHANDLER_FUNCTION(
332    dwControl: DWORD,
333) -> ()}
334FN!{stdcall LPHANDLER_FUNCTION_EX(
335    dwControl: DWORD,
336    dwEventType: DWORD,
337    lpEventData: LPVOID,
338    lpContext: LPVOID,
339) -> DWORD}
340FN!{stdcall PFN_SC_NOTIFY_CALLBACK(
341    pParameter: PVOID,
342) -> ()}
343STRUCT!{struct SERVICE_NOTIFY_1 {
344    dwVersion: DWORD,
345    pfnNotifyCallback: PFN_SC_NOTIFY_CALLBACK,
346    pContext: PVOID,
347    dwNotificationStatus: DWORD,
348    ServiceStatus: SERVICE_STATUS_PROCESS,
349}}
350pub type PSERVICE_NOTIFY_1 = *mut SERVICE_NOTIFY_1;
351STRUCT!{struct SERVICE_NOTIFY_2A {
352    dwVersion: DWORD,
353    pfnNotifyCallback: PFN_SC_NOTIFY_CALLBACK,
354    pContext: PVOID,
355    dwNotificationStatus: DWORD,
356    ServiceStatus: SERVICE_STATUS_PROCESS,
357    dwNotificationTriggered: DWORD,
358    pszServiceNames: LPSTR,
359}}
360pub type PSERVICE_NOTIFY_2A = *mut SERVICE_NOTIFY_2A;
361STRUCT!{struct SERVICE_NOTIFY_2W {
362    dwVersion: DWORD,
363    pfnNotifyCallback: PFN_SC_NOTIFY_CALLBACK,
364    pContext: PVOID,
365    dwNotificationStatus: DWORD,
366    ServiceStatus: SERVICE_STATUS_PROCESS,
367    dwNotificationTriggered: DWORD,
368    pszServiceNames: LPWSTR,
369}}
370pub type PSERVICE_NOTIFY_2W = *mut SERVICE_NOTIFY_2W;
371pub type SERVICE_NOTIFYA = SERVICE_NOTIFY_2A;
372pub type PSERVICE_NOTIFYA = PSERVICE_NOTIFY_2A;
373pub type SERVICE_NOTIFYW = SERVICE_NOTIFY_2W;
374pub type PSERVICE_NOTIFYW = PSERVICE_NOTIFY_2W;
375extern "system" {
376    pub fn ChangeServiceConfigA(
377        hService: SC_HANDLE,
378        dwServiceType: DWORD,
379        dsStartType: DWORD,
380        dwErrorControl: DWORD,
381        lpBinaryPathName: LPCSTR,
382        lpLoadOrderGroup: LPCSTR,
383        lpdwTagId: LPDWORD,
384        lpDependencies: LPCSTR,
385        lpServiceStartName: LPCSTR,
386        lpPassword: LPCSTR,
387        lpDisplayName: LPCSTR,
388    ) -> BOOL;
389    pub fn ChangeServiceConfigW(
390        hService: SC_HANDLE,
391        dwServiceType: DWORD,
392        dsStartType: DWORD,
393        dwErrorControl: DWORD,
394        lpBinaryPathName: LPCWSTR,
395        lpLoadOrderGroup: LPCWSTR,
396        lpdwTagId: LPDWORD,
397        lpDependencies: LPCWSTR,
398        lpServiceStartName: LPCWSTR,
399        lpPassword: LPCWSTR,
400        lpDisplayName: LPCWSTR,
401    ) -> BOOL;
402    pub fn ChangeServiceConfig2A(
403        hService: SC_HANDLE,
404        dwInfoLevel: DWORD,
405        lpInfo: LPVOID,
406    ) -> BOOL;
407    pub fn ChangeServiceConfig2W(
408        hService: SC_HANDLE,
409        dwInfoLevel: DWORD,
410        lpInfo: LPVOID,
411    ) -> BOOL;
412    pub fn CloseServiceHandle(
413        hSCObject: SC_HANDLE,
414    ) -> BOOL;
415    pub fn ControlService(
416        hService: SC_HANDLE,
417        dwControl: DWORD,
418        lpServiceStatus: LPSERVICE_STATUS,
419    ) -> BOOL;
420    pub fn CreateServiceA(
421        hSCManager: SC_HANDLE,
422        lpServiceName: LPCSTR,
423        lpDisplayName: LPCSTR,
424        dwDesiredAccess: DWORD,
425        dwServiceType: DWORD,
426        dwStartType: DWORD,
427        dwErrorControl: DWORD,
428        lpBinaryPathName: LPCSTR,
429        lpLoadOrderGroup: LPCSTR,
430        lpdwTagId: LPDWORD,
431        lpDependencies: LPCSTR,
432        lpServiceStartName: LPCSTR,
433        lpPassword: LPCSTR,
434    ) -> SC_HANDLE;
435    pub fn CreateServiceW(
436        hSCManager: SC_HANDLE,
437        lpServiceName: LPCWSTR,
438        lpDisplayName: LPCWSTR,
439        dwDesiredAccess: DWORD,
440        dwServiceType: DWORD,
441        dwStartType: DWORD,
442        dwErrorControl: DWORD,
443        lpBinaryPathName: LPCWSTR,
444        lpLoadOrderGroup: LPCWSTR,
445        lpdwTagId: LPDWORD,
446        lpDependencies: LPCWSTR,
447        lpServiceStartName: LPCWSTR,
448        lpPassword: LPCWSTR,
449    ) -> SC_HANDLE;
450    pub fn DeleteService(
451        hService: SC_HANDLE,
452    ) -> BOOL;
453    pub fn EnumDependentServicesA(
454        hService: SC_HANDLE,
455        dwServiceState: DWORD,
456        lpServices: LPENUM_SERVICE_STATUSA,
457        cbBufSize: DWORD,
458        pcbBytesNeeded: LPDWORD,
459        lpServicesReturned: LPDWORD,
460    ) -> BOOL;
461    pub fn EnumDependentServicesW(
462        hService: SC_HANDLE,
463        dwServiceState: DWORD,
464        lpServices: LPENUM_SERVICE_STATUSW,
465        cbBufSize: DWORD,
466        pcbBytesNeeded: LPDWORD,
467        lpServicesReturned: LPDWORD,
468    ) -> BOOL;
469    pub fn EnumServicesStatusA(
470        hSCManager: SC_HANDLE,
471        dwServiceType: DWORD,
472        dwServiceState: DWORD,
473        lpServices: LPENUM_SERVICE_STATUSA,
474        cbBufSize: DWORD,
475        pcbBytesNeeded: LPDWORD,
476        lpServicesReturned: LPDWORD,
477        lpResumeHandle: LPDWORD,
478    ) -> BOOL;
479    pub fn EnumServicesStatusW(
480        hSCManager: SC_HANDLE,
481        dwServiceType: DWORD,
482        dwServiceState: DWORD,
483        lpServices: LPENUM_SERVICE_STATUSW,
484        cbBufSize: DWORD,
485        pcbBytesNeeded: LPDWORD,
486        lpServicesReturned: LPDWORD,
487        lpResumeHandle: LPDWORD,
488    ) -> BOOL;
489    pub fn EnumServicesStatusExA(
490        hSCManager: SC_HANDLE,
491        InfoLevel: SC_ENUM_TYPE,
492        dwServiceType: DWORD,
493        dwServiceState: DWORD,
494        lpServices: LPBYTE,
495        cbBufSize: DWORD,
496        pcbBytesNeeded: LPDWORD,
497        lpServicesReturned: LPDWORD,
498        lpResumeHandle: LPDWORD,
499        pszGroupName: LPCSTR,
500    ) -> BOOL;
501    pub fn EnumServicesStatusExW(
502        hSCManager: SC_HANDLE,
503        InfoLevel: SC_ENUM_TYPE,
504        dwServiceType: DWORD,
505        dwServiceState: DWORD,
506        lpServices: LPBYTE,
507        cbBufSize: DWORD,
508        pcbBytesNeeded: LPDWORD,
509        lpServicesReturned: LPDWORD,
510        lpResumeHandle: LPDWORD,
511        pszGroupName: LPCWSTR,
512    ) -> BOOL;
513    pub fn GetServiceKeyNameA(
514        hSCManager: SC_HANDLE,
515        lpDisplayName: LPCSTR,
516        lpServiceName: LPSTR,
517        lpcchBuffer: LPDWORD,
518    ) -> BOOL;
519    pub fn GetServiceKeyNameW(
520        hSCManager: SC_HANDLE,
521        lpDisplayName: LPCWSTR,
522        lpServiceName: LPWSTR,
523        lpcchBuffer: LPDWORD,
524    ) -> BOOL;
525    pub fn GetServiceDisplayNameA(
526        hSCManager: SC_HANDLE,
527        lpServiceName: LPCSTR,
528        lpDisplayName: LPSTR,
529        lpcchBuffer: LPDWORD,
530    ) -> BOOL;
531    pub fn GetServiceDisplayNameW(
532        hSCManager: SC_HANDLE,
533        lpServiceName: LPCWSTR,
534        lpDisplayName: LPWSTR,
535        lpcchBuffer: LPDWORD,
536    ) -> BOOL;
537    pub fn LockServiceDatabase(
538        hSCManager: SC_HANDLE,
539    ) -> SC_LOCK;
540    pub fn NotifyBootConfigStatus(
541        BootAcceptable: BOOL,
542    ) -> BOOL;
543    pub fn OpenSCManagerA(
544        lpMachineName: LPCSTR,
545        lpDatabaseName: LPCSTR,
546        dwDesiredAccess: DWORD,
547    ) -> SC_HANDLE;
548    pub fn OpenSCManagerW(
549        lpMachineName: LPCWSTR,
550        lpDatabaseName: LPCWSTR,
551        dwDesiredAccess: DWORD,
552    ) -> SC_HANDLE;
553    pub fn OpenServiceA(
554        hSCManager: SC_HANDLE,
555        lpServiceName: LPCSTR,
556        dwDesiredAccess: DWORD,
557    ) -> SC_HANDLE;
558    pub fn OpenServiceW(
559        hSCManager: SC_HANDLE,
560        lpServiceName: LPCWSTR,
561        dwDesiredAccess: DWORD,
562    ) -> SC_HANDLE;
563    pub fn QueryServiceConfigA(
564        hService: SC_HANDLE,
565        lpServiceConfig: LPQUERY_SERVICE_CONFIGA,
566        cbBufSize: DWORD,
567        pcbBytesNeeded: LPDWORD,
568    ) -> BOOL;
569    pub fn QueryServiceConfigW(
570        hService: SC_HANDLE,
571        lpServiceConfig: LPQUERY_SERVICE_CONFIGW,
572        cbBufSize: DWORD,
573        pcbBytesNeeded: LPDWORD,
574    ) -> BOOL;
575    pub fn QueryServiceConfig2A(
576        hService: SC_HANDLE,
577        dwInfoLevel: DWORD,
578        lpBuffer: LPBYTE,
579        cbBufSize: DWORD,
580        pcbBytesNeeded: LPDWORD,
581    ) -> BOOL;
582    pub fn QueryServiceConfig2W(
583        hService: SC_HANDLE,
584        dwInfoLevel: DWORD,
585        lpBuffer: LPBYTE,
586        cbBufSize: DWORD,
587        pcbBytesNeeded: LPDWORD,
588    ) -> BOOL;
589    pub fn QueryServiceLockStatusA(
590        hSCManager: SC_HANDLE,
591        lpLockStatus: LPQUERY_SERVICE_LOCK_STATUSA,
592        cbBufSize: DWORD,
593        pcbBytesNeeded: LPDWORD,
594    ) -> BOOL;
595    pub fn QueryServiceLockStatusW(
596        hSCManager: SC_HANDLE,
597        lpLockStatus: LPQUERY_SERVICE_LOCK_STATUSW,
598        cbBufSize: DWORD,
599        pcbBytesNeeded: LPDWORD,
600    ) -> BOOL;
601    pub fn QueryServiceObjectSecurity(
602        hService: SC_HANDLE,
603        dwSecurityInformation: SECURITY_INFORMATION,
604        lpSecurityDescriptor: PSECURITY_DESCRIPTOR,
605        cbBufSize: DWORD,
606        pcbBytesNeeded: LPDWORD,
607    ) -> BOOL;
608    pub fn QueryServiceStatus(
609        hService: SC_HANDLE,
610        lpServiceStatus: LPSERVICE_STATUS,
611    ) -> BOOL;
612    pub fn QueryServiceStatusEx(
613        hService: SC_HANDLE,
614        InfoLevel: SC_STATUS_TYPE,
615        lpBuffer: LPBYTE,
616        cbBufSize: DWORD,
617        pcbBytesNeeded: LPDWORD,
618    ) -> BOOL;
619    pub fn RegisterServiceCtrlHandlerA(
620        lpServiceName: LPCSTR,
621        lpHandlerProc: LPHANDLER_FUNCTION,
622    ) -> SERVICE_STATUS_HANDLE;
623    pub fn RegisterServiceCtrlHandlerW(
624        lpServiceName: LPCWSTR,
625        lpHandlerProc: LPHANDLER_FUNCTION,
626    ) -> SERVICE_STATUS_HANDLE;
627    pub fn RegisterServiceCtrlHandlerExA(
628        lpServiceName: LPCSTR,
629        lpHandlerProc: LPHANDLER_FUNCTION_EX,
630        lpContext: LPVOID,
631    ) -> SERVICE_STATUS_HANDLE;
632    pub fn RegisterServiceCtrlHandlerExW(
633        lpServiceName: LPCWSTR,
634        lpHandlerProc: LPHANDLER_FUNCTION_EX,
635        lpContext: LPVOID,
636    ) -> SERVICE_STATUS_HANDLE;
637    pub fn SetServiceObjectSecurity(
638        hService: SC_HANDLE,
639        dwSecurityInformation: SECURITY_INFORMATION,
640        lpSecurityDescriptor: PSECURITY_DESCRIPTOR,
641    ) -> BOOL;
642    pub fn SetServiceStatus(
643        hServiceStatus: SERVICE_STATUS_HANDLE,
644        lpServiceStatus: LPSERVICE_STATUS,
645    ) -> BOOL;
646    pub fn StartServiceCtrlDispatcherA(
647        lpServiceStartTable: *const SERVICE_TABLE_ENTRYA,
648    ) -> BOOL;
649    pub fn StartServiceCtrlDispatcherW(
650        lpServiceStartTable: *const SERVICE_TABLE_ENTRYW,
651    ) -> BOOL;
652    pub fn StartServiceA(
653        hService: SC_HANDLE,
654        dwNumServiceArgs: DWORD,
655        lpServiceArgVectors: *mut LPCSTR,
656    ) -> BOOL;
657    pub fn StartServiceW(
658        hService: SC_HANDLE,
659        dwNumServiceArgs: DWORD,
660        lpServiceArgVectors: *mut LPCWSTR,
661    ) -> BOOL;
662    pub fn UnlockServiceDatabase(
663        ScLock: SC_LOCK,
664    ) -> BOOL;
665    pub fn NotifyServiceStatusChangeA(
666        hService: SC_HANDLE,
667        dwNotifyMask: DWORD,
668        pNotifyBuffer: PSERVICE_NOTIFYA,
669    ) -> DWORD;
670    pub fn NotifyServiceStatusChangeW(
671        hService: SC_HANDLE,
672        dwNotifyMask: DWORD,
673        pNotifyBuffer: PSERVICE_NOTIFYW,
674    ) -> DWORD;
675    pub fn ControlServiceExA(
676        hService: SC_HANDLE,
677        dwControl: DWORD,
678        dwInfoLevel: DWORD,
679        pControlParams: PVOID,
680    ) -> BOOL;
681    pub fn ControlServiceExW(
682        hService: SC_HANDLE,
683        dwControl: DWORD,
684        dwInfoLevel: DWORD,
685        pControlParams: PVOID,
686    ) -> BOOL;
687    pub fn QueryServiceDynamicInformation(
688        hServiceStatus: SERVICE_STATUS_HANDLE,
689        dwInfoLevel: DWORD,
690        ppDynamicInfo: *mut PVOID,
691    ) -> BOOL;
692    pub fn WaitServiceState (
693        hService: SC_HANDLE,
694        dwNotify: DWORD,
695        dwTimeout: DWORD,
696        hCancelEvent: HANDLE,
697    ) -> DWORD;
698}