File Index Symbol Index

/*++ BUILD Version: 0010 // Increment this if a change has global effects Copyright (c) 1995-1998 Microsoft Corporation Module Name: winsvc.h Abstract: Header file for the Service Control Manager Environment: User Mode - Win32 --*/
#ifndef _WINSVC_
#define _WINSVC_
#include <winapifamily.h>
//
// Define API decoration for direct importing of DLL references.
//
#if !defined(WINADVAPI)
#if !defined(_ADVAPI32_)
#define WINADVAPI DECLSPEC_IMPORT
#else
#define WINADVAPI
#endif #endif
#if _MSC_VER >= 1200
#pragma warning(push)
#ifdef __cplusplus
extern
"C"
{
#endif
#pragma region Desktop Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
//
// Constants
//
//
// Service database names
//
#define SERVICES_ACTIVE_DATABASEW L"ServicesActive"
#define SERVICES_FAILED_DATABASEW L"ServicesFailed"
#define SERVICES_ACTIVE_DATABASEA "ServicesActive"
#define SERVICES_FAILED_DATABASEA "ServicesFailed"
//
// Character to designate that a name is a group
//
#define SC_GROUP_IDENTIFIERW L'+'
#define SC_GROUP_IDENTIFIERA '+'
#ifdef UNICODE
#define SERVICES_ACTIVE_DATABASE SERVICES_ACTIVE_DATABASEW
#define SERVICES_FAILED_DATABASE SERVICES_FAILED_DATABASEW
#define SC_GROUP_IDENTIFIER SC_GROUP_IDENTIFIERW
#else // ndef UNICODE
#define SERVICES_ACTIVE_DATABASE SERVICES_ACTIVE_DATABASEA
#define SERVICES_FAILED_DATABASE SERVICES_FAILED_DATABASEA
#define SC_GROUP_IDENTIFIER SC_GROUP_IDENTIFIERA #endif // ndef UNICODE
//
// Value to indicate no change to an optional parameter
//
#define SERVICE_NO_CHANGE 0xffffffff
//
// Service State -- for Enum Requests (Bit Mask)
//
#define SERVICE_ACTIVE 0x00000001
#define SERVICE_INACTIVE 0x00000002
#define SERVICE_STATE_ALL (SERVICE_ACTIVE | \
SERVICE_INACTIVE)
//
// Controls
//
#define SERVICE_CONTROL_STOP 0x00000001
#define SERVICE_CONTROL_PAUSE 0x00000002
#define SERVICE_CONTROL_CONTINUE 0x00000003
#define SERVICE_CONTROL_INTERROGATE 0x00000004
#define SERVICE_CONTROL_SHUTDOWN 0x00000005
#define SERVICE_CONTROL_PARAMCHANGE 0x00000006
#define SERVICE_CONTROL_NETBINDADD 0x00000007
#define SERVICE_CONTROL_NETBINDREMOVE 0x00000008
#define SERVICE_CONTROL_NETBINDENABLE 0x00000009
#define SERVICE_CONTROL_NETBINDDISABLE 0x0000000A
#define SERVICE_CONTROL_DEVICEEVENT 0x0000000B
#define SERVICE_CONTROL_HARDWAREPROFILECHANGE 0x0000000C
#define SERVICE_CONTROL_POWEREVENT 0x0000000D
#define SERVICE_CONTROL_SESSIONCHANGE 0x0000000E
#define SERVICE_CONTROL_PRESHUTDOWN 0x0000000F
#define SERVICE_CONTROL_TIMECHANGE 0x00000010
//#define SERVICE_CONTROL_USER_LOGOFF 0x00000011
#define SERVICE_CONTROL_TRIGGEREVENT 0x00000020
//reserved for internal use 0x00000021
//reserved for internal use 0x00000050
#define SERVICE_CONTROL_LOWRESOURCES 0x00000060
#define SERVICE_CONTROL_SYSTEMLOWRESOURCES 0x00000061
//
// Service State -- for CurrentState
//
#define SERVICE_STOPPED 0x00000001
#define SERVICE_START_PENDING 0x00000002
#define SERVICE_STOP_PENDING 0x00000003
#define SERVICE_RUNNING 0x00000004
#define SERVICE_CONTINUE_PENDING 0x00000005
#define SERVICE_PAUSE_PENDING 0x00000006
#define SERVICE_PAUSED 0x00000007
//
// Controls Accepted (Bit Mask)
//
#define SERVICE_ACCEPT_STOP 0x00000001
#define SERVICE_ACCEPT_PAUSE_CONTINUE 0x00000002
#define SERVICE_ACCEPT_SHUTDOWN 0x00000004
#define SERVICE_ACCEPT_PARAMCHANGE 0x00000008
#define SERVICE_ACCEPT_NETBINDCHANGE 0x00000010
#define SERVICE_ACCEPT_HARDWAREPROFILECHANGE 0x00000020
#define SERVICE_ACCEPT_POWEREVENT 0x00000040
#define SERVICE_ACCEPT_SESSIONCHANGE 0x00000080
#define SERVICE_ACCEPT_PRESHUTDOWN 0x00000100
#define SERVICE_ACCEPT_TIMECHANGE 0x00000200
#define SERVICE_ACCEPT_TRIGGEREVENT 0x00000400
#define SERVICE_ACCEPT_USER_LOGOFF 0x00000800
// reserved for internal use 0x00001000
#define SERVICE_ACCEPT_LOWRESOURCES 0x00002000
#define SERVICE_ACCEPT_SYSTEMLOWRESOURCES 0x00004000
//
// Service Control Manager object specific access types
//
#define SC_MANAGER_CONNECT 0x0001
#define SC_MANAGER_CREATE_SERVICE 0x0002
#define SC_MANAGER_ENUMERATE_SERVICE 0x0004
#define SC_MANAGER_LOCK 0x0008
#define SC_MANAGER_QUERY_LOCK_STATUS 0x0010
#define SC_MANAGER_MODIFY_BOOT_CONFIG 0x0020
#define SC_MANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
SC_MANAGER_CONNECT | \
SC_MANAGER_CREATE_SERVICE | \
SC_MANAGER_ENUMERATE_SERVICE | \
SC_MANAGER_LOCK | \
SC_MANAGER_QUERY_LOCK_STATUS | \
SC_MANAGER_MODIFY_BOOT_CONFIG)
//
// Service object specific access type
//
#define SERVICE_QUERY_CONFIG 0x0001
#define SERVICE_CHANGE_CONFIG 0x0002
#define SERVICE_QUERY_STATUS 0x0004
#define SERVICE_ENUMERATE_DEPENDENTS 0x0008
#define SERVICE_START 0x0010
#define SERVICE_STOP 0x0020
#define SERVICE_PAUSE_CONTINUE 0x0040
#define SERVICE_INTERROGATE 0x0080
#define SERVICE_USER_DEFINED_CONTROL 0x0100
#define SERVICE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
SERVICE_QUERY_CONFIG | \
SERVICE_CHANGE_CONFIG | \
SERVICE_QUERY_STATUS | \
SERVICE_ENUMERATE_DEPENDENTS | \
SERVICE_START | \
SERVICE_STOP | \
SERVICE_PAUSE_CONTINUE | \
SERVICE_INTERROGATE | \
SERVICE_USER_DEFINED_CONTROL)
//
// Service flags for QueryServiceStatusEx
//
#define SERVICE_RUNS_IN_SYSTEM_PROCESS 0x00000001
//
// Info levels for ChangeServiceConfig2 and QueryServiceConfig2
//
#define SERVICE_CONFIG_DESCRIPTION 1
#define SERVICE_CONFIG_FAILURE_ACTIONS 2
#define SERVICE_CONFIG_DELAYED_AUTO_START_INFO 3
#define SERVICE_CONFIG_FAILURE_ACTIONS_FLAG 4
#define SERVICE_CONFIG_SERVICE_SID_INFO 5
#define SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO 6
#define SERVICE_CONFIG_PRESHUTDOWN_INFO 7
#define SERVICE_CONFIG_TRIGGER_INFO 8
#define SERVICE_CONFIG_PREFERRED_NODE 9
// reserved 10
// reserved 11
#define SERVICE_CONFIG_LAUNCH_PROTECTED 12
//
// Info levels for NotifyServiceStatusChange
//
#define SERVICE_NOTIFY_STATUS_CHANGE_1 1
#define SERVICE_NOTIFY_STATUS_CHANGE_2 2
#define SERVICE_NOTIFY_STATUS_CHANGE SERVICE_NOTIFY_STATUS_CHANGE_2
//
// Service notification masks
//
#define SERVICE_NOTIFY_STOPPED 0x00000001
#define SERVICE_NOTIFY_START_PENDING 0x00000002
#define SERVICE_NOTIFY_STOP_PENDING 0x00000004
#define SERVICE_NOTIFY_RUNNING 0x00000008
#define SERVICE_NOTIFY_CONTINUE_PENDING 0x00000010
#define SERVICE_NOTIFY_PAUSE_PENDING 0x00000020
#define SERVICE_NOTIFY_PAUSED 0x00000040
#define SERVICE_NOTIFY_CREATED 0x00000080
#define SERVICE_NOTIFY_DELETED 0x00000100
#define SERVICE_NOTIFY_DELETE_PENDING 0x00000200
//
// The following defines are for service stop reason codes
//
//
// Stop reason flags. Update SERVICE_STOP_REASON_FLAG_MAX when
// new flags are added.
//
#define SERVICE_STOP_REASON_FLAG_MIN 0x00000000
#define SERVICE_STOP_REASON_FLAG_UNPLANNED 0x10000000
#define SERVICE_STOP_REASON_FLAG_CUSTOM 0x20000000
#define SERVICE_STOP_REASON_FLAG_PLANNED 0x40000000
#define SERVICE_STOP_REASON_FLAG_MAX 0x80000000
//
// Microsoft major reasons. Update SERVICE_STOP_REASON_MAJOR_MAX when
// new codes are added.
//
#define SERVICE_STOP_REASON_MAJOR_MIN 0x00000000
#define SERVICE_STOP_REASON_MAJOR_OTHER 0x00010000
#define SERVICE_STOP_REASON_MAJOR_HARDWARE 0x00020000
#define SERVICE_STOP_REASON_MAJOR_OPERATINGSYSTEM 0x00030000
#define SERVICE_STOP_REASON_MAJOR_SOFTWARE 0x00040000
#define SERVICE_STOP_REASON_MAJOR_APPLICATION 0x00050000
#define SERVICE_STOP_REASON_MAJOR_NONE 0x00060000
#define SERVICE_STOP_REASON_MAJOR_MAX 0x00070000
#define SERVICE_STOP_REASON_MAJOR_MIN_CUSTOM 0x00400000
#define SERVICE_STOP_REASON_MAJOR_MAX_CUSTOM 0x00ff0000
//
// Microsoft minor reasons. Update SERVICE_STOP_REASON_MINOR_MAX when
// new codes are added.
//
#define SERVICE_STOP_REASON_MINOR_MIN 0x00000000
#define SERVICE_STOP_REASON_MINOR_OTHER 0x00000001
#define SERVICE_STOP_REASON_MINOR_MAINTENANCE 0x00000002
#define SERVICE_STOP_REASON_MINOR_INSTALLATION 0x00000003
#define SERVICE_STOP_REASON_MINOR_UPGRADE 0x00000004
#define SERVICE_STOP_REASON_MINOR_RECONFIG 0x00000005
#define SERVICE_STOP_REASON_MINOR_HUNG 0x00000006
#define SERVICE_STOP_REASON_MINOR_UNSTABLE 0x00000007
#define SERVICE_STOP_REASON_MINOR_DISK 0x00000008
#define SERVICE_STOP_REASON_MINOR_NETWORKCARD 0x00000009
#define SERVICE_STOP_REASON_MINOR_ENVIRONMENT 0x0000000a
#define SERVICE_STOP_REASON_MINOR_HARDWARE_DRIVER 0x0000000b
#define SERVICE_STOP_REASON_MINOR_OTHERDRIVER 0x0000000c
#define SERVICE_STOP_REASON_MINOR_SERVICEPACK 0x0000000d
#define SERVICE_STOP_REASON_MINOR_SOFTWARE_UPDATE 0x0000000e
#define SERVICE_STOP_REASON_MINOR_SECURITYFIX 0x0000000f
#define SERVICE_STOP_REASON_MINOR_SECURITY 0x00000010
#define SERVICE_STOP_REASON_MINOR_NETWORK_CONNECTIVITY 0x00000011
#define SERVICE_STOP_REASON_MINOR_WMI 0x00000012
#define SERVICE_STOP_REASON_MINOR_SERVICEPACK_UNINSTALL 0x00000013
#define SERVICE_STOP_REASON_MINOR_SOFTWARE_UPDATE_UNINSTALL 0x00000014
#define SERVICE_STOP_REASON_MINOR_SECURITYFIX_UNINSTALL 0x00000015
#define SERVICE_STOP_REASON_MINOR_MMC 0x00000016
#define SERVICE_STOP_REASON_MINOR_NONE 0x00000017
#define SERVICE_STOP_REASON_MINOR_MEMOTYLIMIT 0x00000018
#define SERVICE_STOP_REASON_MINOR_MAX 0x00000019
#define SERVICE_STOP_REASON_MINOR_MIN_CUSTOM 0x00000100
#define SERVICE_STOP_REASON_MINOR_MAX_CUSTOM 0x0000FFFF
//
// Info levels for ControlServiceEx
//
#define SERVICE_CONTROL_STATUS_REASON_INFO 1
//
// Service SID types supported
//
#define SERVICE_SID_TYPE_NONE 0x00000000
#define SERVICE_SID_TYPE_UNRESTRICTED 0x00000001
#define SERVICE_SID_TYPE_RESTRICTED ( 0x00000002 | SERVICE_SID_TYPE_UNRESTRICTED )
//
// Service trigger types
//
#define SERVICE_TRIGGER_TYPE_DEVICE_INTERFACE_ARRIVAL 1
#define SERVICE_TRIGGER_TYPE_IP_ADDRESS_AVAILABILITY 2
#define SERVICE_TRIGGER_TYPE_DOMAIN_JOIN 3
#define SERVICE_TRIGGER_TYPE_FIREWALL_PORT_EVENT 4
#define SERVICE_TRIGGER_TYPE_GROUP_POLICY 5
#define SERVICE_TRIGGER_TYPE_NETWORK_ENDPOINT 6
#define SERVICE_TRIGGER_TYPE_CUSTOM_SYSTEM_STATE_CHANGE 7
#define SERVICE_TRIGGER_TYPE_CUSTOM 20
#define SERVICE_TRIGGER_TYPE_AGGREGATE 30
//
// Service trigger data types
//
#define SERVICE_TRIGGER_DATA_TYPE_BINARY 1
#define SERVICE_TRIGGER_DATA_TYPE_STRING 2
#define SERVICE_TRIGGER_DATA_TYPE_LEVEL 3
#define SERVICE_TRIGGER_DATA_TYPE_KEYWORD_ANY 4
#define SERVICE_TRIGGER_DATA_TYPE_KEYWORD_ALL 5
//
// Service start reason
//
#define SERVICE_START_REASON_DEMAND 0x00000001
#define SERVICE_START_REASON_AUTO 0x00000002
#define SERVICE_START_REASON_TRIGGER 0x00000004
#define SERVICE_START_REASON_RESTART_ON_FAILURE 0x00000008
#define SERVICE_START_REASON_DELAYEDAUTO 0x00000010
//
// Service dynamic information levels
//
#define SERVICE_DYNAMIC_INFORMATION_LEVEL_START_REASON 1
//
// Service LaunchProtected types supported
//
#define SERVICE_LAUNCH_PROTECTED_NONE 0
#define SERVICE_LAUNCH_PROTECTED_WINDOWS 1
#define SERVICE_LAUNCH_PROTECTED_WINDOWS_LIGHT 2
#define SERVICE_LAUNCH_PROTECTED_ANTIMALWARE_LIGHT 3
//
// NETWORK_MANAGER_FIRST_IP_ADDRESS_ARRIVAL_GUID & NETWORK_MANAGER_LAST_IP_ADDRESS_REMOVAL_GUID are used with
// SERVICE_TRIGGER_TYPE_IP_ADDRESS_AVAILABILITY trigger.
//
//
// DOMAIN_JOIN_GUID & DOMAIN_LEAVE_GUID are used with SERVICE_TRIGGER_TYPE_DOMAIN_JOIN trigger.
//
//
// FIREWALL_PORT_OPEN_GUID & FIREWALL_PORT_CLOSE_GUID are used with
// SERVICE_TRIGGER_TYPE_FIREWALL_PORT_EVENT trigger.
//
//
// MACHINE_POLICY_PRESENT_GUID & USER_POLICY_PRESENT_GUID are used with
// SERVICE_TRIGGER_TYPE_GROUP_POLICY trigger.
//
//
// RPC_INTERFACE_EVENT_GUID, NAMED_PIPE_EVENT_GUID & TCP_PORT_EVENT_GUID are
// used with SERVICE_TRIGGER_TYPE_NETWORK_ENDPOINT trigger.
//
// CUSTOM_SYSTEM_STATE_CHANGE_EVENT_GUID is used with SERVICE_TRIGGER_TYPE_CUSTOM_SYSTEM_STATE_CHANGE
//
//
// Service notification trigger identifier
//
typedef
struct
{
DWORD
Data
[
2
]; }
SERVICE_TRIGGER_CUSTOM_STATE_ID
;
typedef
struct
_SERVICE_CUSTOM_SYSTEM_STATE_CHANGE_DATA_ITEM
{
union
{
SERVICE_TRIGGER_CUSTOM_STATE_ID
CustomStateId
;
struct
{
DWORD
DataOffset
;
BYTE
Data
[
1
]; }
s
; }
u
; }
SERVICE_CUSTOM_SYSTEM_STATE_CHANGE_DATA_ITEM
, *
LPSERVICE_CUSTOM_SYSTEM_STATE_CHANGE_DATA_ITEM
;
//
// Service trigger actions
//
#define SERVICE_TRIGGER_ACTION_SERVICE_START 1
#define SERVICE_TRIGGER_ACTION_SERVICE_STOP 2
//
// argv[1] passed into ServiceMain of trigger started services
//
#define SERVICE_TRIGGER_STARTED_ARGUMENT L"TriggerStarted"
//
// Service description string
//
typedef
struct
_SERVICE_DESCRIPTIONA
{
LPSTR
lpDescription
; }
SERVICE_DESCRIPTIONA
, *
LPSERVICE_DESCRIPTIONA
;
//
// Service description string
//
typedef
struct
_SERVICE_DESCRIPTIONW
{
LPWSTR
lpDescription
; }
SERVICE_DESCRIPTIONW
, *
LPSERVICE_DESCRIPTIONW
;
#ifdef UNICODE
typedef
SERVICE_DESCRIPTIONW
SERVICE_DESCRIPTION
;
typedef
LPSERVICE_DESCRIPTIONW
LPSERVICE_DESCRIPTION
;
#else
typedef SERVICE_DESCRIPTIONA SERVICE_DESCRIPTION;
typedef LPSERVICE_DESCRIPTIONA LPSERVICE_DESCRIPTION; #endif // UNICODE
//
// Actions to take on service failure
//
typedef
enum
_SC_ACTION_TYPE
{
SC_ACTION_NONE
=
0
,
SC_ACTION_RESTART
=
1
,
SC_ACTION_REBOOT
=
2
,
SC_ACTION_RUN_COMMAND
=
3
,
SC_ACTION_OWN_RESTART
=
4
}
SC_ACTION_TYPE
;
typedef
struct
_SC_ACTION
{
SC_ACTION_TYPE
Type
;
DWORD
Delay
; }
SC_ACTION
, *
LPSC_ACTION
;
typedef
struct
_SERVICE_FAILURE_ACTIONSA
{
DWORD
dwResetPeriod
;
LPSTR
lpRebootMsg
;
LPSTR
lpCommand
;
#ifdef __midl
[range(0, 1024)]
#endif
DWORD
cActions
;
#ifdef __midl
[size_is(cActions)]
#endif
SC_ACTION
*
lpsaActions
; }
SERVICE_FAILURE_ACTIONSA
, *
LPSERVICE_FAILURE_ACTIONSA
;
typedef
struct
_SERVICE_FAILURE_ACTIONSW
{
DWORD
dwResetPeriod
;
LPWSTR
lpRebootMsg
;
LPWSTR
lpCommand
;
#ifdef __midl
[range(0, 1024)]
#endif
DWORD
cActions
;
#ifdef __midl
[size_is(cActions)]
#endif
SC_ACTION
*
lpsaActions
; }
SERVICE_FAILURE_ACTIONSW
, *
LPSERVICE_FAILURE_ACTIONSW
;
#ifdef UNICODE
typedef
SERVICE_FAILURE_ACTIONSW
SERVICE_FAILURE_ACTIONS
;
typedef
LPSERVICE_FAILURE_ACTIONSW
LPSERVICE_FAILURE_ACTIONS
;
#else
typedef SERVICE_FAILURE_ACTIONSA SERVICE_FAILURE_ACTIONS;
typedef LPSERVICE_FAILURE_ACTIONSA LPSERVICE_FAILURE_ACTIONS; #endif // UNICODE
//
// Service delayed autostart info setting
//
typedef
struct
_SERVICE_DELAYED_AUTO_START_INFO
{
BOOL
fDelayedAutostart
;
// Delayed autostart flag
}
SERVICE_DELAYED_AUTO_START_INFO
, *
LPSERVICE_DELAYED_AUTO_START_INFO
;
//
// Service failure actions flag setting
//
typedef
struct
_SERVICE_FAILURE_ACTIONS_FLAG
{
BOOL
fFailureActionsOnNonCrashFailures
;
// Failure actions flag
}
SERVICE_FAILURE_ACTIONS_FLAG
, *
LPSERVICE_FAILURE_ACTIONS_FLAG
;
//
// Service SID info setting
//
typedef
struct
_SERVICE_SID_INFO
{
DWORD
dwServiceSidType
;
// Service SID type
}
SERVICE_SID_INFO
, *
LPSERVICE_SID_INFO
;
//
// Service required privileges information
//
typedef
struct
_SERVICE_REQUIRED_PRIVILEGES_INFOA
{
LPSTR
pmszRequiredPrivileges
;
// Required privileges multi-sz
}
SERVICE_REQUIRED_PRIVILEGES_INFOA
, *
LPSERVICE_REQUIRED_PRIVILEGES_INFOA
;
//
// Service required privileges information
//
typedef
struct
_SERVICE_REQUIRED_PRIVILEGES_INFOW
{
LPWSTR
pmszRequiredPrivileges
;
// Required privileges multi-sz
}
SERVICE_REQUIRED_PRIVILEGES_INFOW
, *
LPSERVICE_REQUIRED_PRIVILEGES_INFOW
;
#ifdef UNICODE
typedef
SERVICE_REQUIRED_PRIVILEGES_INFOW
SERVICE_REQUIRED_PRIVILEGES_INFO
;
typedef
LPSERVICE_REQUIRED_PRIVILEGES_INFOW
LPSERVICE_REQUIRED_PRIVILEGES_INFO
;
#else
typedef SERVICE_REQUIRED_PRIVILEGES_INFOA SERVICE_REQUIRED_PRIVILEGES_INFO;
typedef LPSERVICE_REQUIRED_PRIVILEGES_INFOA LPSERVICE_REQUIRED_PRIVILEGES_INFO; #endif // UNICODE
//
// Service preshutdown timeout setting
//
typedef
struct
_SERVICE_PRESHUTDOWN_INFO
{
DWORD
dwPreshutdownTimeout
;
// Timeout in msecs
}
SERVICE_PRESHUTDOWN_INFO
, *
LPSERVICE_PRESHUTDOWN_INFO
;
//
// Service trigger data item
//
typedef
struct
_SERVICE_TRIGGER_SPECIFIC_DATA_ITEM
{
DWORD
dwDataType
;
// Data type -- one of SERVICE_TRIGGER_DATA_TYPE_* constants
#ifdef __midl
[range(0, 1024)]
#endif
DWORD
cbData
;
// Size of trigger specific data
#ifdef __midl
[size_is(cbData)]
#endif
PBYTE
pData
;
// Trigger specific data
}
SERVICE_TRIGGER_SPECIFIC_DATA_ITEM
, *
PSERVICE_TRIGGER_SPECIFIC_DATA_ITEM
;
//
// Trigger-specific information
//
typedef
struct
_SERVICE_TRIGGER
{
DWORD
dwTriggerType
;
// One of SERVICE_TRIGGER_TYPE_* constants
DWORD
dwAction
;
// One of SERVICE_TRIGGER_ACTION_* constants
GUID
*
pTriggerSubtype
;
// Provider GUID if the trigger type is SERVICE_TRIGGER_TYPE_CUSTOM
// Device class interface GUID if the trigger type is
// SERVICE_TRIGGER_TYPE_DEVICE_INTERFACE_ARRIVAL
// Aggregate identifier GUID if type is aggregate.
#ifdef __midl
[range(0, 64)]
#endif
DWORD
cDataItems
;
// Number of data items in pDataItems array
#ifdef __midl
[size_is(cDataItems)]
#endif
PSERVICE_TRIGGER_SPECIFIC_DATA_ITEM
pDataItems
;
// Trigger specific data
}
SERVICE_TRIGGER
, *
PSERVICE_TRIGGER
;
//
// Service trigger information
//
typedef
struct
_SERVICE_TRIGGER_INFO
{
#ifdef __midl
[range(0, 64)]
#endif
DWORD
cTriggers
;
// Number of triggers in the pTriggers array
#ifdef __midl
[size_is(cTriggers)]
#endif
PSERVICE_TRIGGER
pTriggers
;
// Array of triggers
PBYTE
pReserved
;
// Reserved, must be NULL
}
SERVICE_TRIGGER_INFO
, *
PSERVICE_TRIGGER_INFO
;
#define SC_AGGREGATE_STORAGE_KEY L"System\\CurrentControlSet\\Control\\ServiceAggregatedEvents"
//
// Preferred node information
//
typedef
struct
_SERVICE_PREFERRED_NODE_INFO
{
USHORT
usPreferredNode
;
// Preferred node
BOOLEAN
fDelete
;
// Delete the preferred node setting
}
SERVICE_PREFERRED_NODE_INFO
, *
LPSERVICE_PREFERRED_NODE_INFO
;
//
// Time change information
//
typedef
struct
_SERVICE_TIMECHANGE_INFO
{
LARGE_INTEGER
liNewTime
;
// New time
LARGE_INTEGER
liOldTime
;
// Old time
}
SERVICE_TIMECHANGE_INFO
, *
PSERVICE_TIMECHANGE_INFO
;
//
// Service launch protected setting
//
typedef
struct
_SERVICE_LAUNCH_PROTECTED_INFO
{
DWORD
dwLaunchProtected
;
// Service launch protected
}
SERVICE_LAUNCH_PROTECTED_INFO
, *
PSERVICE_LAUNCH_PROTECTED_INFO
;
//
// Handle Types
//
typedef
SC_HANDLE
*
LPSC_HANDLE
;
//
// Info levels for QueryServiceStatusEx
//
typedef
enum
_SC_STATUS_TYPE
{
SC_STATUS_PROCESS_INFO
=
0
}
SC_STATUS_TYPE
;
//
// Info levels for EnumServicesStatusEx
//
typedef
enum
_SC_ENUM_TYPE
{
SC_ENUM_PROCESS_INFO
=
0
}
SC_ENUM_TYPE
;
//
// Service Status Structures
//
typedef
struct
_SERVICE_STATUS
{
DWORD
dwServiceType
;
DWORD
dwCurrentState
;
DWORD
dwControlsAccepted
;
DWORD
dwWin32ExitCode
;
DWORD
dwServiceSpecificExitCode
;
DWORD
dwCheckPoint
;
DWORD
dwWaitHint
; }
SERVICE_STATUS
, *
LPSERVICE_STATUS
;
typedef
struct
_SERVICE_STATUS_PROCESS
{
DWORD
dwServiceType
;
DWORD
dwCurrentState
;
DWORD
dwControlsAccepted
;
DWORD
dwWin32ExitCode
;
DWORD
dwServiceSpecificExitCode
;
DWORD
dwCheckPoint
;
DWORD
dwWaitHint
;
DWORD
dwProcessId
;
DWORD
dwServiceFlags
; }
SERVICE_STATUS_PROCESS
, *
LPSERVICE_STATUS_PROCESS
;
//
// Service Status Enumeration Structure
//
typedef
struct
_ENUM_SERVICE_STATUSA
{
LPSTR
lpServiceName
;
LPSTR
lpDisplayName
;
SERVICE_STATUS
ServiceStatus
; }
ENUM_SERVICE_STATUSA
, *
LPENUM_SERVICE_STATUSA
;
typedef
struct
_ENUM_SERVICE_STATUSW
{
LPWSTR
lpServiceName
;
LPWSTR
lpDisplayName
;
SERVICE_STATUS
ServiceStatus
; }
ENUM_SERVICE_STATUSW
, *
LPENUM_SERVICE_STATUSW
;
#ifdef UNICODE
typedef
ENUM_SERVICE_STATUSW
ENUM_SERVICE_STATUS
;
typedef
LPENUM_SERVICE_STATUSW
LPENUM_SERVICE_STATUS
;
#else
typedef ENUM_SERVICE_STATUSA ENUM_SERVICE_STATUS;
typedef LPENUM_SERVICE_STATUSA LPENUM_SERVICE_STATUS; #endif // UNICODE
typedef
struct
_ENUM_SERVICE_STATUS_PROCESSA
{
LPSTR
lpServiceName
;
LPSTR
lpDisplayName
;
SERVICE_STATUS_PROCESS
ServiceStatusProcess
; }
ENUM_SERVICE_STATUS_PROCESSA
, *
LPENUM_SERVICE_STATUS_PROCESSA
;
typedef
struct
_ENUM_SERVICE_STATUS_PROCESSW
{
LPWSTR
lpServiceName
;
LPWSTR
lpDisplayName
;
SERVICE_STATUS_PROCESS
ServiceStatusProcess
; }
ENUM_SERVICE_STATUS_PROCESSW
, *
LPENUM_SERVICE_STATUS_PROCESSW
;
#ifdef UNICODE
typedef
ENUM_SERVICE_STATUS_PROCESSW
ENUM_SERVICE_STATUS_PROCESS
;
typedef
LPENUM_SERVICE_STATUS_PROCESSW
LPENUM_SERVICE_STATUS_PROCESS
;
#else
typedef ENUM_SERVICE_STATUS_PROCESSA ENUM_SERVICE_STATUS_PROCESS;
typedef LPENUM_SERVICE_STATUS_PROCESSA LPENUM_SERVICE_STATUS_PROCESS; #endif // UNICODE
//
// Structures for the Lock API functions
//
typedef
LPVOID
SC_LOCK
;
typedef
struct
_QUERY_SERVICE_LOCK_STATUSA
{
DWORD
fIsLocked
;
LPSTR
lpLockOwner
;
DWORD
dwLockDuration
; }
QUERY_SERVICE_LOCK_STATUSA
, *
LPQUERY_SERVICE_LOCK_STATUSA
;
typedef
struct
_QUERY_SERVICE_LOCK_STATUSW
{
DWORD
fIsLocked
;
LPWSTR
lpLockOwner
;
DWORD
dwLockDuration
; }
QUERY_SERVICE_LOCK_STATUSW
, *
LPQUERY_SERVICE_LOCK_STATUSW
;
#ifdef UNICODE
typedef
QUERY_SERVICE_LOCK_STATUSW
QUERY_SERVICE_LOCK_STATUS
;
typedef
LPQUERY_SERVICE_LOCK_STATUSW
LPQUERY_SERVICE_LOCK_STATUS
;
#else
typedef QUERY_SERVICE_LOCK_STATUSA QUERY_SERVICE_LOCK_STATUS;
typedef LPQUERY_SERVICE_LOCK_STATUSA LPQUERY_SERVICE_LOCK_STATUS; #endif // UNICODE
//
// Query Service Configuration Structure
//
typedef
struct
_QUERY_SERVICE_CONFIGA
{
DWORD
dwServiceType
;
DWORD
dwStartType
;
DWORD
dwErrorControl
;
LPSTR
lpBinaryPathName
;
LPSTR
lpLoadOrderGroup
;
DWORD
dwTagId
;
LPSTR
lpDependencies
;
LPSTR
lpServiceStartName
;
LPSTR
lpDisplayName
; }
QUERY_SERVICE_CONFIGA
, *
LPQUERY_SERVICE_CONFIGA
;
typedef
struct
_QUERY_SERVICE_CONFIGW
{
DWORD
dwServiceType
;
DWORD
dwStartType
;
DWORD
dwErrorControl
;
LPWSTR
lpBinaryPathName
;
LPWSTR
lpLoadOrderGroup
;
DWORD
dwTagId
;
LPWSTR
lpDependencies
;
LPWSTR
lpServiceStartName
;
LPWSTR
lpDisplayName
; }
QUERY_SERVICE_CONFIGW
, *
LPQUERY_SERVICE_CONFIGW
;
#ifdef UNICODE
typedef
QUERY_SERVICE_CONFIGW
QUERY_SERVICE_CONFIG
;
typedef
LPQUERY_SERVICE_CONFIGW
LPQUERY_SERVICE_CONFIG
;
#else
typedef QUERY_SERVICE_CONFIGA QUERY_SERVICE_CONFIG;
typedef LPQUERY_SERVICE_CONFIGA LPQUERY_SERVICE_CONFIG; #endif // UNICODE
//
// Function Prototype for the Service Main Function
//
DWORD
dwNumServicesArgs,
LPWSTR
*lpServiceArgVectors );
DWORD
dwNumServicesArgs,
LPTSTR
*lpServiceArgVectors );
#ifdef UNICODE
#define SERVICE_MAIN_FUNCTION SERVICE_MAIN_FUNCTIONW
#else
#define SERVICE_MAIN_FUNCTION SERVICE_MAIN_FUNCTIONA #endif //UNICODE
DWORD
dwNumServicesArgs,
LPWSTR
*lpServiceArgVectors );
DWORD
dwNumServicesArgs,
LPSTR
*lpServiceArgVectors );
#ifdef UNICODE
#define LPSERVICE_MAIN_FUNCTION LPSERVICE_MAIN_FUNCTIONW
#else
#define LPSERVICE_MAIN_FUNCTION LPSERVICE_MAIN_FUNCTIONA #endif //UNICODE
//
// Service Start Table
//
typedef
struct
_SERVICE_TABLE_ENTRYA
{
LPSTR
lpServiceName
;
LPSERVICE_MAIN_FUNCTIONA
lpServiceProc
; }
SERVICE_TABLE_ENTRYA
, *
LPSERVICE_TABLE_ENTRYA
;
typedef
struct
_SERVICE_TABLE_ENTRYW
{
LPWSTR
lpServiceName
;
LPSERVICE_MAIN_FUNCTIONW
lpServiceProc
; }
SERVICE_TABLE_ENTRYW
, *
LPSERVICE_TABLE_ENTRYW
;
#ifdef UNICODE
typedef
SERVICE_TABLE_ENTRYW
SERVICE_TABLE_ENTRY
;
typedef
LPSERVICE_TABLE_ENTRYW
LPSERVICE_TABLE_ENTRY
;
#else
typedef SERVICE_TABLE_ENTRYA SERVICE_TABLE_ENTRY;
typedef LPSERVICE_TABLE_ENTRYA LPSERVICE_TABLE_ENTRY; #endif // UNICODE
//
// Prototype for the Service Control Handler Function
//
DWORD
dwControl );
DWORD
dwControl,
DWORD
dwEventType,
LPVOID
lpEventData,
LPVOID
lpContext );
DWORD
dwControl );
DWORD
dwControl,
DWORD
dwEventType,
LPVOID
lpEventData,
LPVOID
lpContext );
//
// Service notification parameters
//
typedef
);
//
// Each new notify structure is a superset of the older version
//
typedef
struct
_SERVICE_NOTIFY_1
{
DWORD
dwVersion
;
PFN_SC_NOTIFY_CALLBACK
pfnNotifyCallback
;
PVOID
pContext
;
DWORD
dwNotificationStatus
;
SERVICE_STATUS_PROCESS
ServiceStatus
; }
SERVICE_NOTIFY_1
, *
PSERVICE_NOTIFY_1
;
typedef
struct
_SERVICE_NOTIFY_2A
{
DWORD
dwVersion
;
PFN_SC_NOTIFY_CALLBACK
pfnNotifyCallback
;
PVOID
pContext
;
DWORD
dwNotificationStatus
;
SERVICE_STATUS_PROCESS
ServiceStatus
;
DWORD
dwNotificationTriggered
;
LPSTR
pszServiceNames
; }
SERVICE_NOTIFY_2A
, *
PSERVICE_NOTIFY_2A
;
typedef
struct
_SERVICE_NOTIFY_2W
{
DWORD
dwVersion
;
PFN_SC_NOTIFY_CALLBACK
pfnNotifyCallback
;
PVOID
pContext
;
DWORD
dwNotificationStatus
;
SERVICE_STATUS_PROCESS
ServiceStatus
;
DWORD
dwNotificationTriggered
;
LPWSTR
pszServiceNames
; }
SERVICE_NOTIFY_2W
, *
PSERVICE_NOTIFY_2W
;
#ifdef UNICODE
typedef
SERVICE_NOTIFY_2W
SERVICE_NOTIFY_2
;
typedef
PSERVICE_NOTIFY_2W
PSERVICE_NOTIFY_2
;
#else
typedef SERVICE_NOTIFY_2A SERVICE_NOTIFY_2;
typedef PSERVICE_NOTIFY_2A PSERVICE_NOTIFY_2; #endif // UNICODE
typedef
SERVICE_NOTIFY_2A
SERVICE_NOTIFYA
, *
PSERVICE_NOTIFYA
;
typedef
SERVICE_NOTIFY_2W
SERVICE_NOTIFYW
, *
PSERVICE_NOTIFYW
;
#ifdef UNICODE
typedef
SERVICE_NOTIFYW
SERVICE_NOTIFY
;
typedef
PSERVICE_NOTIFYW
PSERVICE_NOTIFY
;
#else
typedef SERVICE_NOTIFYA SERVICE_NOTIFY;
typedef PSERVICE_NOTIFYA PSERVICE_NOTIFY; #endif // UNICODE
//
// Service control status reason parameters
//
typedef
struct
_SERVICE_CONTROL_STATUS_REASON_PARAMSA
{
DWORD
dwReason
;
LPSTR
pszComment
;
SERVICE_STATUS_PROCESS
ServiceStatus
; }
SERVICE_CONTROL_STATUS_REASON_PARAMSA
, *
PSERVICE_CONTROL_STATUS_REASON_PARAMSA
;
//
// Service control status reason parameters
//
typedef
struct
_SERVICE_CONTROL_STATUS_REASON_PARAMSW
{
DWORD
dwReason
;
LPWSTR
pszComment
;
SERVICE_STATUS_PROCESS
ServiceStatus
; }
SERVICE_CONTROL_STATUS_REASON_PARAMSW
, *
PSERVICE_CONTROL_STATUS_REASON_PARAMSW
;
#ifdef UNICODE
typedef
SERVICE_CONTROL_STATUS_REASON_PARAMSW
SERVICE_CONTROL_STATUS_REASON_PARAMS
;
typedef
PSERVICE_CONTROL_STATUS_REASON_PARAMSW
PSERVICE_CONTROL_STATUS_REASON_PARAMS
;
#else
typedef SERVICE_CONTROL_STATUS_REASON_PARAMSA SERVICE_CONTROL_STATUS_REASON_PARAMS;
typedef PSERVICE_CONTROL_STATUS_REASON_PARAMSA PSERVICE_CONTROL_STATUS_REASON_PARAMS; #endif // UNICODE
//
// Service start reason
//
typedef
struct
_SERVICE_START_REASON
{
DWORD
dwReason
; }
SERVICE_START_REASON
, *
PSERVICE_START_REASON
;
///////////////////////////////////////////////////////////////////////////
// API Function Prototypes
///////////////////////////////////////////////////////////////////////////
BOOL
ChangeServiceConfigA
( );
BOOL
ChangeServiceConfigW
( );
#ifdef UNICODE
#define ChangeServiceConfig ChangeServiceConfigW
#else
#define ChangeServiceConfig ChangeServiceConfigA #endif // !UNICODE
BOOL
ChangeServiceConfig2A
( );
BOOL
ChangeServiceConfig2W
( );
#ifdef UNICODE
#define ChangeServiceConfig2 ChangeServiceConfig2W
#else
#define ChangeServiceConfig2 ChangeServiceConfig2A #endif // !UNICODE
BOOL
CloseServiceHandle
( );
BOOL
ControlService
( );
_Must_inspect_result_
SC_HANDLE
CreateServiceA
( );
_Must_inspect_result_
SC_HANDLE
CreateServiceW
( );
#ifdef UNICODE
#define CreateService CreateServiceW
#else
#define CreateService CreateServiceA #endif // !UNICODE
BOOL
DeleteService
( );
_Must_inspect_result_
BOOL
EnumDependentServicesA
(
_Out_writes_bytes_opt_(cbBufSize)
LPENUM_SERVICE_STATUSA
lpServices
, );
_Must_inspect_result_
BOOL
EnumDependentServicesW
(
_Out_writes_bytes_opt_(cbBufSize)
LPENUM_SERVICE_STATUSW
lpServices
, );
#ifdef UNICODE
#define EnumDependentServices EnumDependentServicesW
#else
#define EnumDependentServices EnumDependentServicesA #endif // !UNICODE
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion #pragma region Desktop Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
_Must_inspect_result_
BOOL
EnumServicesStatusA
(
_Out_writes_bytes_opt_(cbBufSize)
LPENUM_SERVICE_STATUSA
lpServices
, );
_Must_inspect_result_
BOOL
EnumServicesStatusW
(
_Out_writes_bytes_opt_(cbBufSize)
LPENUM_SERVICE_STATUSW
lpServices
, );
#ifdef UNICODE
#define EnumServicesStatus EnumServicesStatusW
#else
#define EnumServicesStatus EnumServicesStatusA #endif // !UNICODE
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
#pragma endregion #pragma region Desktop Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
_Must_inspect_result_
BOOL
EnumServicesStatusExA
(
_Out_writes_bytes_opt_(cbBufSize)
LPBYTE
lpServices
, );
_Must_inspect_result_
BOOL
EnumServicesStatusExW
(
_Out_writes_bytes_opt_(cbBufSize)
LPBYTE
lpServices
, );
#ifdef UNICODE
#define EnumServicesStatusEx EnumServicesStatusExW
#else
#define EnumServicesStatusEx EnumServicesStatusExA #endif // !UNICODE
_Must_inspect_result_
BOOL
GetServiceKeyNameA
(
_Out_writes_opt_(*lpcchBuffer)
LPSTR
lpServiceName
, );
_Must_inspect_result_
BOOL
GetServiceKeyNameW
(
_Out_writes_opt_(*lpcchBuffer)
LPWSTR
lpServiceName
, );
#ifdef UNICODE
#define GetServiceKeyName GetServiceKeyNameW
#else
#define GetServiceKeyName GetServiceKeyNameA #endif // !UNICODE
_Must_inspect_result_
BOOL
GetServiceDisplayNameA
(
_Out_writes_opt_(*lpcchBuffer)
LPSTR
lpDisplayName
, );
_Must_inspect_result_
BOOL
GetServiceDisplayNameW
(
_Out_writes_opt_(*lpcchBuffer)
LPWSTR
lpDisplayName
, );
#ifdef UNICODE
#define GetServiceDisplayName GetServiceDisplayNameW
#else
#define GetServiceDisplayName GetServiceDisplayNameA #endif // !UNICODE
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion #pragma region Desktop Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
SC_LOCK
LockServiceDatabase
( );
BOOL
NotifyBootConfigStatus
( );
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
#pragma endregion #pragma region Desktop Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
_Must_inspect_result_
SC_HANDLE
OpenSCManagerA
( );
_Must_inspect_result_
SC_HANDLE
OpenSCManagerW
( );
#ifdef UNICODE
#define OpenSCManager OpenSCManagerW
#else
#define OpenSCManager OpenSCManagerA #endif // !UNICODE
_Must_inspect_result_
SC_HANDLE
OpenServiceA
( );
_Must_inspect_result_
SC_HANDLE
OpenServiceW
( );
#ifdef UNICODE
#define OpenService OpenServiceW
#else
#define OpenService OpenServiceA #endif // !UNICODE
_Must_inspect_result_
BOOL
QueryServiceConfigA
(
_Out_writes_bytes_opt_(cbBufSize)
LPQUERY_SERVICE_CONFIGA
lpServiceConfig
, );
_Must_inspect_result_
BOOL
QueryServiceConfigW
(
_Out_writes_bytes_opt_(cbBufSize)
LPQUERY_SERVICE_CONFIGW
lpServiceConfig
, );
#ifdef UNICODE
#define QueryServiceConfig QueryServiceConfigW
#else
#define QueryServiceConfig QueryServiceConfigA #endif // !UNICODE
_When_(dwInfoLevel == SERVICE_CONFIG_DESCRIPTION, _At_(cbBufSize, _In_range_(>=, sizeof(LPSERVICE_DESCRIPTIONA))))
_When_(dwInfoLevel == SERVICE_CONFIG_FAILURE_ACTIONS, _At_(cbBufSize, _In_range_(>=, sizeof(LPSERVICE_FAILURE_ACTIONSA))))
_When_(dwInfoLevel == SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO, _At_(cbBufSize, _In_range_(>=, sizeof(LPSERVICE_REQUIRED_PRIVILEGES_INFOA))))
_Must_inspect_result_
BOOL
QueryServiceConfig2A
(
_Out_writes_bytes_opt_(cbBufSize)
LPBYTE
lpBuffer
, );
_When_(dwInfoLevel == SERVICE_CONFIG_DESCRIPTION, _At_(cbBufSize, _In_range_(>=, sizeof(LPSERVICE_DESCRIPTIONW))))
_When_(dwInfoLevel == SERVICE_CONFIG_FAILURE_ACTIONS, _At_(cbBufSize, _In_range_(>=, sizeof(LPSERVICE_FAILURE_ACTIONSW))))
_When_(dwInfoLevel == SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO, _At_(cbBufSize, _In_range_(>=, sizeof(LPSERVICE_REQUIRED_PRIVILEGES_INFOW))))
_Must_inspect_result_
BOOL
QueryServiceConfig2W
(
_Out_writes_bytes_opt_(cbBufSize)
LPBYTE
lpBuffer
, );
#ifdef UNICODE
#define QueryServiceConfig2 QueryServiceConfig2W
#else
#define QueryServiceConfig2 QueryServiceConfig2A #endif // !UNICODE
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion #pragma region Desktop Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
_Must_inspect_result_
BOOL
QueryServiceLockStatusA
(
_Out_writes_bytes_opt_(cbBufSize)
LPQUERY_SERVICE_LOCK_STATUSA
lpLockStatus
, );
_Must_inspect_result_
BOOL
QueryServiceLockStatusW
(
_Out_writes_bytes_opt_(cbBufSize)
LPQUERY_SERVICE_LOCK_STATUSW
lpLockStatus
, );
#ifdef UNICODE
#define QueryServiceLockStatus QueryServiceLockStatusW
#else
#define QueryServiceLockStatus QueryServiceLockStatusA #endif // !UNICODE
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
#pragma endregion #pragma region Desktop Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
_Must_inspect_result_
BOOL
QueryServiceObjectSecurity
(
_Out_writes_bytes_opt_(cbBufSize)
PSECURITY_DESCRIPTOR
lpSecurityDescriptor
, );
_Must_inspect_result_
BOOL
QueryServiceStatus
( );
_Must_inspect_result_
BOOL
QueryServiceStatusEx
(
_Out_writes_bytes_opt_(cbBufSize)
LPBYTE
lpBuffer
, );
_Must_inspect_result_
SERVICE_STATUS_HANDLE
RegisterServiceCtrlHandlerA
(
_In_ __callback
LPHANDLER_FUNCTION
lpHandlerProc
);
_Must_inspect_result_
SERVICE_STATUS_HANDLE
RegisterServiceCtrlHandlerW
(
_In_ __callback
LPHANDLER_FUNCTION
lpHandlerProc
);
#ifdef UNICODE
#define RegisterServiceCtrlHandler RegisterServiceCtrlHandlerW
#else
#define RegisterServiceCtrlHandler RegisterServiceCtrlHandlerA #endif // !UNICODE
_Must_inspect_result_
SERVICE_STATUS_HANDLE
RegisterServiceCtrlHandlerExA
(
_In_ __callback
LPHANDLER_FUNCTION_EX
lpHandlerProc
, );
_Must_inspect_result_
SERVICE_STATUS_HANDLE
RegisterServiceCtrlHandlerExW
(
_In_ __callback
LPHANDLER_FUNCTION_EX
lpHandlerProc
, );
#ifdef UNICODE
#define RegisterServiceCtrlHandlerEx RegisterServiceCtrlHandlerExW
#else
#define RegisterServiceCtrlHandlerEx RegisterServiceCtrlHandlerExA #endif // !UNICODE
BOOL
SetServiceObjectSecurity
( );
BOOL
SetServiceStatus
( );
BOOL
StartServiceCtrlDispatcherA
( );
BOOL
StartServiceCtrlDispatcherW
( );
#ifdef UNICODE
#define StartServiceCtrlDispatcher StartServiceCtrlDispatcherW
#else
#define StartServiceCtrlDispatcher StartServiceCtrlDispatcherA #endif // !UNICODE
BOOL
StartServiceA
(
_In_reads_opt_(dwNumServiceArgs)
LPCSTR
*
lpServiceArgVectors
);
BOOL
StartServiceW
(
_In_reads_opt_(dwNumServiceArgs)
LPCWSTR
*
lpServiceArgVectors
);
#ifdef UNICODE
#define StartService StartServiceW
#else
#define StartService StartServiceA #endif // !UNICODE
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion #pragma region Desktop Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
BOOL
UnlockServiceDatabase
( );
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
#pragma endregion #pragma region Desktop Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#if (NTDDI_VERSION >= NTDDI_VISTA)
DWORD
NotifyServiceStatusChangeA
( );
DWORD
NotifyServiceStatusChangeW
( );
#ifdef UNICODE
#define NotifyServiceStatusChange NotifyServiceStatusChangeW
#else
#define NotifyServiceStatusChange NotifyServiceStatusChangeA #endif // !UNICODE
BOOL
ControlServiceExA
( );
BOOL
ControlServiceExW
( );
#ifdef UNICODE
#define ControlServiceEx ControlServiceExW
#else
#define ControlServiceEx ControlServiceExA #endif // !UNICODE
BOOL
QueryServiceDynamicInformation
( );
#endif // NTDDI_VERSION >= NTDDI_VISTA
#if (NTDDI_VERSION >= NTDDI_WIN8)
//
// Service status change notification API
//
typedef
enum
_SC_EVENT_TYPE
{
SC_EVENT_DATABASE_CHANGE
,
SC_EVENT_PROPERTY_CHANGE
,
SC_EVENT_STATUS_CHANGE
}
SC_EVENT_TYPE
, *
PSC_EVENT_TYPE
;
typedef
SC_NOTIFICATION_CALLBACK
( );
typedef
SC_NOTIFICATION_CALLBACK
*
PSC_NOTIFICATION_CALLBACK
;
typedef
struct
_SC_NOTIFICATION_REGISTRATION*
PSC_NOTIFICATION_REGISTRATION
;
DWORD
SubscribeServiceChangeNotifications
( );
UnsubscribeServiceChangeNotifications
( );
DWORD
WaitServiceState
( );
#endif // NTDDI_VERSION >= NTDDI_WIN8
#if (NTDDI_VERSION >= NTDDI_WIN10_RS4)
//
// Service state type enums
//
typedef
enum
SERVICE_REGISTRY_STATE_TYPE
{
ServiceRegistryStateParameters
=
0
,
ServiceRegistryStatePersistent
=
1
,
MaxServiceRegistryStateType
=
2
, }
SERVICE_REGISTRY_STATE_TYPE
;
_Must_inspect_result_
DWORD
GetServiceRegistryStateKey
( );
#endif // NTDDI_VERSION >= NTDDI_WIN10_RS4
#if (NTDDI_VERSION >= NTDDI_WIN10_RS5)
typedef
enum
SERVICE_DIRECTORY_TYPE
{
ServiceDirectoryPersistentState
=
0
,
ServiceDirectoryTypeMax
=
1
, }
SERVICE_DIRECTORY_TYPE
;
_Must_inspect_result_
DWORD
GetServiceDirectory
( );
#endif // NTDDI_VERSION >= NTDDI_WIN10_RS5
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion
#ifdef __cplusplus
}
#endif
#if _MSC_VER >= 1200
#pragma warning(pop)
#endif
#endif // _WINSVC_