| /** |
| * 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*; |
| } |