blob: 248bd2a0a9b194ab5274fa96a47099b4dcd3cb6f [file]
/**
* Windows API header module
*
* Translated from MinGW Windows headers
*
* Authors: Stewart Gordon
* License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
* Source: $(DRUNTIMESRC core/sys/windows/_winsvc.d)
*/
module core.sys.windows.winsvc;
version (Windows):
version (ANSI) {} else version = Unicode;
pragma(lib, "advapi32");
import core.sys.windows.w32api, core.sys.windows.windef;
// FIXME: check Windows version support
const TCHAR[]
SERVICES_ACTIVE_DATABASE = "ServicesActive",
SERVICES_FAILED_DATABASE = "ServicesFailed";
const TCHAR SC_GROUP_IDENTIFIER = '+';
enum DWORD
SC_MANAGER_ALL_ACCESS = 0xf003f,
SC_MANAGER_CONNECT = 1,
SC_MANAGER_CREATE_SERVICE = 2,
SC_MANAGER_ENUMERATE_SERVICE = 4,
SC_MANAGER_LOCK = 8,
SC_MANAGER_QUERY_LOCK_STATUS = 16,
SC_MANAGER_MODIFY_BOOT_CONFIG = 32;
enum DWORD SERVICE_NO_CHANGE = 0xffffffff;
enum : DWORD {
SERVICE_STOPPED = 1,
SERVICE_START_PENDING,
SERVICE_STOP_PENDING,
SERVICE_RUNNING,
SERVICE_CONTINUE_PENDING,
SERVICE_PAUSE_PENDING,
SERVICE_PAUSED // = 7
}
enum DWORD
SERVICE_ACCEPT_STOP = 1,
SERVICE_ACCEPT_PAUSE_CONTINUE = 2,
SERVICE_ACCEPT_SHUTDOWN = 4,
SERVICE_ACCEPT_PARAMCHANGE = 8,
SERVICE_ACCEPT_NETBINDCHANGE = 16,
SERVICE_ACCEPT_HARDWAREPROFILECHANGE = 32,
SERVICE_ACCEPT_POWEREVENT = 64,
SERVICE_ACCEPT_SESSIONCHANGE = 128;
enum : DWORD {
SERVICE_CONTROL_STOP = 1,
SERVICE_CONTROL_PAUSE,
SERVICE_CONTROL_CONTINUE,
SERVICE_CONTROL_INTERROGATE,
SERVICE_CONTROL_SHUTDOWN,
SERVICE_CONTROL_PARAMCHANGE,
SERVICE_CONTROL_NETBINDADD,
SERVICE_CONTROL_NETBINDREMOVE,
SERVICE_CONTROL_NETBINDENABLE,
SERVICE_CONTROL_NETBINDDISABLE,
SERVICE_CONTROL_DEVICEEVENT,
SERVICE_CONTROL_HARDWAREPROFILECHANGE,
SERVICE_CONTROL_POWEREVENT,
SERVICE_CONTROL_SESSIONCHANGE, // = 14
}
enum : DWORD {
SERVICE_ACTIVE = 1,
SERVICE_INACTIVE,
SERVICE_STATE_ALL
}
enum DWORD
SERVICE_QUERY_CONFIG = 0x0001,
SERVICE_CHANGE_CONFIG = 0x0002,
SERVICE_QUERY_STATUS = 0x0004,
SERVICE_ENUMERATE_DEPENDENTS = 0x0008,
SERVICE_START = 0x0010,
SERVICE_STOP = 0x0020,
SERVICE_PAUSE_CONTINUE = 0x0040,
SERVICE_INTERROGATE = 0x0080,
SERVICE_USER_DEFINED_CONTROL = 0x0100,
SERVICE_ALL_ACCESS = 0x01FF | STANDARD_RIGHTS_REQUIRED;
// This is not documented on the MSDN site
enum SERVICE_RUNS_IN_SYSTEM_PROCESS = 1;
enum : DWORD {
SERVICE_CONFIG_DESCRIPTION = 1,
SERVICE_CONFIG_FAILURE_ACTIONS,
SERVICE_CONFIG_DELAYED_AUTO_START_INFO,
SERVICE_CONFIG_FAILURE_ACTIONS_FLAG,
SERVICE_CONFIG_SERVICE_SID_INFO,
SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO,
SERVICE_CONFIG_PRESHUTDOWN_INFO // = 7
}
struct SERVICE_STATUS {
DWORD dwServiceType;
DWORD dwCurrentState;
DWORD dwControlsAccepted;
DWORD dwWin32ExitCode;
DWORD dwServiceSpecificExitCode;
DWORD dwCheckPoint;
DWORD dwWaitHint;
}
alias LPSERVICE_STATUS = SERVICE_STATUS*;
struct ENUM_SERVICE_STATUSA {
LPSTR lpServiceName;
LPSTR lpDisplayName;
SERVICE_STATUS ServiceStatus;
}
alias LPENUM_SERVICE_STATUSA = ENUM_SERVICE_STATUSA*;
struct ENUM_SERVICE_STATUSW {
LPWSTR lpServiceName;
LPWSTR lpDisplayName;
SERVICE_STATUS ServiceStatus;
}
alias LPENUM_SERVICE_STATUSW = ENUM_SERVICE_STATUSW*;
struct QUERY_SERVICE_CONFIGA {
DWORD dwServiceType;
DWORD dwStartType;
DWORD dwErrorControl;
LPSTR lpBinaryPathName;
LPSTR lpLoadOrderGroup;
DWORD dwTagId;
LPSTR lpDependencies;
LPSTR lpServiceStartName;
LPSTR lpDisplayName;
}
alias LPQUERY_SERVICE_CONFIGA = QUERY_SERVICE_CONFIGA*;
struct QUERY_SERVICE_CONFIGW {
DWORD dwServiceType;
DWORD dwStartType;
DWORD dwErrorControl;
LPWSTR lpBinaryPathName;
LPWSTR lpLoadOrderGroup;
DWORD dwTagId;
LPWSTR lpDependencies;
LPWSTR lpServiceStartName;
LPWSTR lpDisplayName;
}
alias LPQUERY_SERVICE_CONFIGW = QUERY_SERVICE_CONFIGW*;
struct QUERY_SERVICE_LOCK_STATUSA {
DWORD fIsLocked;
LPSTR lpLockOwner;
DWORD dwLockDuration;
}
alias LPQUERY_SERVICE_LOCK_STATUSA = QUERY_SERVICE_LOCK_STATUSA*;
struct QUERY_SERVICE_LOCK_STATUSW {
DWORD fIsLocked;
LPWSTR lpLockOwner;
DWORD dwLockDuration;
}
alias LPQUERY_SERVICE_LOCK_STATUSW = QUERY_SERVICE_LOCK_STATUSW*;
extern (Windows) {
alias LPSERVICE_MAIN_FUNCTIONA = void function(DWORD, LPSTR*);
alias LPSERVICE_MAIN_FUNCTIONW = void function(DWORD, LPWSTR*);
}
struct SERVICE_TABLE_ENTRYA {
LPSTR lpServiceName;
LPSERVICE_MAIN_FUNCTIONA lpServiceProc;
}
alias LPSERVICE_TABLE_ENTRYA = SERVICE_TABLE_ENTRYA*;
struct SERVICE_TABLE_ENTRYW {
LPWSTR lpServiceName;
LPSERVICE_MAIN_FUNCTIONW lpServiceProc;
}
alias LPSERVICE_TABLE_ENTRYW = SERVICE_TABLE_ENTRYW*;
alias SC_HANDLE = HANDLE;
alias LPSC_HANDLE = SC_HANDLE*;
alias SC_LOCK = void*;
alias SERVICE_STATUS_HANDLE = HANDLE;
extern (Windows) {
alias LPHANDLER_FUNCTION = void function(DWORD);
alias LPHANDLER_FUNCTION_EX = DWORD function(DWORD, DWORD, LPVOID, LPVOID);
}
static if (_WIN32_WINNT >= 0x500) {
struct SERVICE_STATUS_PROCESS {
DWORD dwServiceType;
DWORD dwCurrentState;
DWORD dwControlsAccepted;
DWORD dwWin32ExitCode;
DWORD dwServiceSpecificExitCode;
DWORD dwCheckPoint;
DWORD dwWaitHint;
DWORD dwProcessId;
DWORD dwServiceFlags;
}
alias LPSERVICE_STATUS_PROCESS = SERVICE_STATUS_PROCESS*;
enum SC_STATUS_TYPE {
SC_STATUS_PROCESS_INFO = 0
}
enum SC_ENUM_TYPE {
SC_ENUM_PROCESS_INFO = 0
}
struct ENUM_SERVICE_STATUS_PROCESSA {
LPSTR lpServiceName;
LPSTR lpDisplayName;
SERVICE_STATUS_PROCESS ServiceStatusProcess;
}
alias LPENUM_SERVICE_STATUS_PROCESSA = ENUM_SERVICE_STATUS_PROCESSA*;
struct ENUM_SERVICE_STATUS_PROCESSW {
LPWSTR lpServiceName;
LPWSTR lpDisplayName;
SERVICE_STATUS_PROCESS ServiceStatusProcess;
}
alias LPENUM_SERVICE_STATUS_PROCESSW = ENUM_SERVICE_STATUS_PROCESSW*;
struct SERVICE_DESCRIPTIONA {
LPSTR lpDescription;
}
alias LPSERVICE_DESCRIPTIONA = SERVICE_DESCRIPTIONA*;
struct SERVICE_DESCRIPTIONW {
LPWSTR lpDescription;
}
alias LPSERVICE_DESCRIPTIONW = SERVICE_DESCRIPTIONW*;
enum SC_ACTION_TYPE {
SC_ACTION_NONE,
SC_ACTION_RESTART,
SC_ACTION_REBOOT,
SC_ACTION_RUN_COMMAND
}
struct SC_ACTION {
SC_ACTION_TYPE Type;
DWORD Delay;
}
alias LPSC_ACTION = SC_ACTION*;
struct SERVICE_FAILURE_ACTIONSA {
DWORD dwResetPeriod;
LPSTR lpRebootMsg;
LPSTR lpCommand;
DWORD cActions;
SC_ACTION* lpsaActions;
}
alias LPSERVICE_FAILURE_ACTIONSA = SERVICE_FAILURE_ACTIONSA*;
struct SERVICE_FAILURE_ACTIONSW {
DWORD dwResetPeriod;
LPWSTR lpRebootMsg;
LPWSTR lpCommand;
DWORD cActions;
SC_ACTION* lpsaActions;
}
alias LPSERVICE_FAILURE_ACTIONSW = SERVICE_FAILURE_ACTIONSW*;
}
extern (Windows) nothrow @nogc {
BOOL ChangeServiceConfigA(SC_HANDLE, DWORD, DWORD, DWORD, LPCSTR,
LPCSTR, LPDWORD, LPCSTR, LPCSTR, LPCSTR, LPCSTR);
BOOL ChangeServiceConfigW(SC_HANDLE, DWORD, DWORD, DWORD, LPCWSTR,
LPCWSTR, LPDWORD, LPCWSTR, LPCWSTR, LPCWSTR, LPCWSTR);
BOOL CloseServiceHandle(SC_HANDLE);
BOOL ControlService(SC_HANDLE, DWORD, LPSERVICE_STATUS);
SC_HANDLE CreateServiceA(SC_HANDLE, LPCSTR, LPCSTR, DWORD, DWORD,
DWORD, DWORD, LPCSTR, LPCSTR, PDWORD, LPCSTR, LPCSTR, LPCSTR);
SC_HANDLE CreateServiceW(SC_HANDLE, LPCWSTR, LPCWSTR, DWORD, DWORD,
DWORD, DWORD, LPCWSTR, LPCWSTR, PDWORD, LPCWSTR, LPCWSTR, LPCWSTR);
BOOL DeleteService(SC_HANDLE);
BOOL EnumDependentServicesA(SC_HANDLE, DWORD, LPENUM_SERVICE_STATUSA,
DWORD, PDWORD, PDWORD);
BOOL EnumDependentServicesW(SC_HANDLE, DWORD, LPENUM_SERVICE_STATUSW,
DWORD, PDWORD, PDWORD);
BOOL EnumServicesStatusA(SC_HANDLE, DWORD, DWORD, LPENUM_SERVICE_STATUSA,
DWORD, PDWORD, PDWORD, PDWORD);
BOOL EnumServicesStatusW(SC_HANDLE, DWORD, DWORD, LPENUM_SERVICE_STATUSW,
DWORD, PDWORD, PDWORD, PDWORD);
BOOL GetServiceDisplayNameA(SC_HANDLE, LPCSTR, LPSTR, PDWORD);
BOOL GetServiceDisplayNameW(SC_HANDLE, LPCWSTR, LPWSTR, PDWORD);
BOOL GetServiceKeyNameA(SC_HANDLE, LPCSTR, LPSTR, PDWORD);
BOOL GetServiceKeyNameW(SC_HANDLE, LPCWSTR, LPWSTR, PDWORD);
SC_LOCK LockServiceDatabase(SC_HANDLE);
BOOL NotifyBootConfigStatus(BOOL);
SC_HANDLE OpenSCManagerA(LPCSTR, LPCSTR, DWORD);
SC_HANDLE OpenSCManagerW(LPCWSTR, LPCWSTR, DWORD);
SC_HANDLE OpenServiceA(SC_HANDLE, LPCSTR, DWORD);
SC_HANDLE OpenServiceW(SC_HANDLE, LPCWSTR, DWORD);
BOOL QueryServiceConfigA(SC_HANDLE, LPQUERY_SERVICE_CONFIGA, DWORD,
PDWORD);
BOOL QueryServiceConfigW(SC_HANDLE, LPQUERY_SERVICE_CONFIGW, DWORD,
PDWORD);
BOOL QueryServiceLockStatusA(SC_HANDLE, LPQUERY_SERVICE_LOCK_STATUSA,
DWORD, PDWORD);
BOOL QueryServiceLockStatusW(SC_HANDLE, LPQUERY_SERVICE_LOCK_STATUSW,
DWORD, PDWORD);
BOOL QueryServiceObjectSecurity(SC_HANDLE, SECURITY_INFORMATION,
PSECURITY_DESCRIPTOR, DWORD, LPDWORD);
BOOL QueryServiceStatus(SC_HANDLE, LPSERVICE_STATUS);
SERVICE_STATUS_HANDLE RegisterServiceCtrlHandlerA(LPCSTR,
LPHANDLER_FUNCTION);
SERVICE_STATUS_HANDLE RegisterServiceCtrlHandlerW(LPCWSTR,
LPHANDLER_FUNCTION);
BOOL SetServiceObjectSecurity(SC_HANDLE, SECURITY_INFORMATION,
PSECURITY_DESCRIPTOR);
BOOL SetServiceStatus(SERVICE_STATUS_HANDLE, LPSERVICE_STATUS);
BOOL StartServiceA(SC_HANDLE, DWORD, LPCSTR*);
BOOL StartServiceW(SC_HANDLE, DWORD, LPCWSTR*);
BOOL StartServiceCtrlDispatcherA(LPSERVICE_TABLE_ENTRYA);
BOOL StartServiceCtrlDispatcherW(LPSERVICE_TABLE_ENTRYW);
BOOL UnlockServiceDatabase(SC_LOCK);
static if (_WIN32_WINNT >= 0x500) {
BOOL EnumServicesStatusExA(SC_HANDLE, SC_ENUM_TYPE, DWORD, DWORD, LPBYTE,
DWORD, LPDWORD, LPDWORD, LPDWORD, LPCSTR);
BOOL EnumServicesStatusExW(SC_HANDLE, SC_ENUM_TYPE, DWORD, DWORD, LPBYTE,
DWORD, LPDWORD, LPDWORD, LPDWORD, LPCWSTR);
BOOL QueryServiceConfig2A(SC_HANDLE, DWORD, LPBYTE, DWORD, LPDWORD);
BOOL QueryServiceConfig2W(SC_HANDLE, DWORD, LPBYTE, DWORD, LPDWORD);
BOOL QueryServiceStatusEx(SC_HANDLE, SC_STATUS_TYPE, LPBYTE, DWORD,
LPDWORD);
SERVICE_STATUS_HANDLE RegisterServiceCtrlHandlerExA(LPCSTR,
LPHANDLER_FUNCTION_EX, LPVOID);
SERVICE_STATUS_HANDLE RegisterServiceCtrlHandlerExW(LPCWSTR,
LPHANDLER_FUNCTION_EX, LPVOID);
}
static if (_WIN32_WINNT >= 0x501) {
BOOL ChangeServiceConfig2A(SC_HANDLE, DWORD, LPVOID);
BOOL ChangeServiceConfig2W(SC_HANDLE, DWORD, LPVOID);
}
}
version (Unicode) {
alias ENUM_SERVICE_STATUS = ENUM_SERVICE_STATUSW;
alias QUERY_SERVICE_CONFIG = QUERY_SERVICE_CONFIGW;
alias QUERY_SERVICE_LOCK_STATUS = QUERY_SERVICE_LOCK_STATUSW;
alias LPSERVICE_MAIN_FUNCTION = LPSERVICE_MAIN_FUNCTIONW;
alias SERVICE_TABLE_ENTRY = SERVICE_TABLE_ENTRYW;
alias ChangeServiceConfig = ChangeServiceConfigW;
alias CreateService = CreateServiceW;
alias EnumDependentServices = EnumDependentServicesW;
alias EnumServicesStatus = EnumServicesStatusW;
alias GetServiceDisplayName = GetServiceDisplayNameW;
alias GetServiceKeyName = GetServiceKeyNameW;
alias OpenSCManager = OpenSCManagerW;
alias OpenService = OpenServiceW;
alias QueryServiceConfig = QueryServiceConfigW;
alias QueryServiceLockStatus = QueryServiceLockStatusW;
alias RegisterServiceCtrlHandler = RegisterServiceCtrlHandlerW;
alias StartService = StartServiceW;
alias StartServiceCtrlDispatcher = StartServiceCtrlDispatcherW;
static if (_WIN32_WINNT >= 0x500) {
alias ENUM_SERVICE_STATUS_PROCESS = ENUM_SERVICE_STATUS_PROCESSW;
alias SERVICE_DESCRIPTION = SERVICE_DESCRIPTIONW;
alias SERVICE_FAILURE_ACTIONS = SERVICE_FAILURE_ACTIONSW;
alias EnumServicesStatusEx = EnumServicesStatusExW;
alias QueryServiceConfig2 = QueryServiceConfig2W;
alias RegisterServiceCtrlHandlerEx = RegisterServiceCtrlHandlerExW;
}
static if (_WIN32_WINNT >= 0x501) {
alias ChangeServiceConfig2 = ChangeServiceConfig2W;
}
} else {
alias ENUM_SERVICE_STATUS = ENUM_SERVICE_STATUSA;
alias QUERY_SERVICE_CONFIG = QUERY_SERVICE_CONFIGA;
alias QUERY_SERVICE_LOCK_STATUS = QUERY_SERVICE_LOCK_STATUSA;
alias LPSERVICE_MAIN_FUNCTION = LPSERVICE_MAIN_FUNCTIONA;
alias SERVICE_TABLE_ENTRY = SERVICE_TABLE_ENTRYA;
alias ChangeServiceConfig = ChangeServiceConfigA;
alias CreateService = CreateServiceA;
alias EnumDependentServices = EnumDependentServicesA;
alias EnumServicesStatus = EnumServicesStatusA;
alias GetServiceDisplayName = GetServiceDisplayNameA;
alias GetServiceKeyName = GetServiceKeyNameA;
alias OpenSCManager = OpenSCManagerA;
alias OpenService = OpenServiceA;
alias QueryServiceConfig = QueryServiceConfigA;
alias QueryServiceLockStatus = QueryServiceLockStatusA;
alias RegisterServiceCtrlHandler = RegisterServiceCtrlHandlerA;
alias StartService = StartServiceA;
alias StartServiceCtrlDispatcher = StartServiceCtrlDispatcherA;
static if (_WIN32_WINNT >= 0x500) {
alias ENUM_SERVICE_STATUS_PROCESS = ENUM_SERVICE_STATUS_PROCESSA;
alias SERVICE_DESCRIPTION = SERVICE_DESCRIPTIONA;
alias SERVICE_FAILURE_ACTIONS = SERVICE_FAILURE_ACTIONSA;
alias EnumServicesStatusEx = EnumServicesStatusExA;
alias QueryServiceConfig2 = QueryServiceConfig2A;
alias RegisterServiceCtrlHandlerEx = RegisterServiceCtrlHandlerExA;
}
static if (_WIN32_WINNT >= 0x501) {
alias ChangeServiceConfig2 = ChangeServiceConfig2A;
}
}
alias LPENUM_SERVICE_STATUS = ENUM_SERVICE_STATUS*;
alias LPQUERY_SERVICE_CONFIG = QUERY_SERVICE_CONFIG*;
alias LPQUERY_SERVICE_LOCK_STATUS = QUERY_SERVICE_LOCK_STATUS*;
alias LPSERVICE_TABLE_ENTRY = SERVICE_TABLE_ENTRY*;
static if (_WIN32_WINNT >= 0x500) {
alias LPENUM_SERVICE_STATUS_PROCESS = ENUM_SERVICE_STATUS_PROCESS*;
alias LPSERVICE_DESCRIPTION = SERVICE_DESCRIPTION*;
alias LPSERVICE_FAILURE_ACTIONS = SERVICE_FAILURE_ACTIONS*;
}