/** * 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 src/core/sys/windows/_winsvc.d) */ module core.sys.windows.winsvc; version (Windows): @system: 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 SERVICE_STATUS* LPSERVICE_STATUS; struct ENUM_SERVICE_STATUSA { LPSTR lpServiceName; LPSTR lpDisplayName; SERVICE_STATUS ServiceStatus; } alias ENUM_SERVICE_STATUSA* LPENUM_SERVICE_STATUSA; struct ENUM_SERVICE_STATUSW { LPWSTR lpServiceName; LPWSTR lpDisplayName; SERVICE_STATUS ServiceStatus; } alias ENUM_SERVICE_STATUSW* LPENUM_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 QUERY_SERVICE_CONFIGA* LPQUERY_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 QUERY_SERVICE_CONFIGW* LPQUERY_SERVICE_CONFIGW; struct QUERY_SERVICE_LOCK_STATUSA { DWORD fIsLocked; LPSTR lpLockOwner; DWORD dwLockDuration; } alias QUERY_SERVICE_LOCK_STATUSA* LPQUERY_SERVICE_LOCK_STATUSA; struct QUERY_SERVICE_LOCK_STATUSW { DWORD fIsLocked; LPWSTR lpLockOwner; DWORD dwLockDuration; } alias QUERY_SERVICE_LOCK_STATUSW* LPQUERY_SERVICE_LOCK_STATUSW; extern (Windows) { alias void function(DWORD, LPSTR*) LPSERVICE_MAIN_FUNCTIONA; alias void function(DWORD, LPWSTR*) LPSERVICE_MAIN_FUNCTIONW; } struct SERVICE_TABLE_ENTRYA { LPSTR lpServiceName; LPSERVICE_MAIN_FUNCTIONA lpServiceProc; } alias SERVICE_TABLE_ENTRYA* LPSERVICE_TABLE_ENTRYA; struct SERVICE_TABLE_ENTRYW { LPWSTR lpServiceName; LPSERVICE_MAIN_FUNCTIONW lpServiceProc; } alias SERVICE_TABLE_ENTRYW* LPSERVICE_TABLE_ENTRYW; mixin DECLARE_HANDLE!("SC_HANDLE"); alias SC_HANDLE* LPSC_HANDLE; alias void* SC_LOCK; mixin DECLARE_HANDLE!("SERVICE_STATUS_HANDLE"); extern (Windows) { alias void function(DWORD) LPHANDLER_FUNCTION; alias DWORD function(DWORD, DWORD, LPVOID, LPVOID) LPHANDLER_FUNCTION_EX; } 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 SERVICE_STATUS_PROCESS* LPSERVICE_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 ENUM_SERVICE_STATUS_PROCESSA* LPENUM_SERVICE_STATUS_PROCESSA; struct ENUM_SERVICE_STATUS_PROCESSW { LPWSTR lpServiceName; LPWSTR lpDisplayName; SERVICE_STATUS_PROCESS ServiceStatusProcess; } alias ENUM_SERVICE_STATUS_PROCESSW* LPENUM_SERVICE_STATUS_PROCESSW; struct SERVICE_DESCRIPTIONA { LPSTR lpDescription; } alias SERVICE_DESCRIPTIONA* LPSERVICE_DESCRIPTIONA; struct SERVICE_DESCRIPTIONW { LPWSTR lpDescription; } alias SERVICE_DESCRIPTIONW* LPSERVICE_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 SC_ACTION* LPSC_ACTION; struct SERVICE_FAILURE_ACTIONSA { DWORD dwResetPeriod; LPSTR lpRebootMsg; LPSTR lpCommand; DWORD cActions; SC_ACTION* lpsaActions; } alias SERVICE_FAILURE_ACTIONSA* LPSERVICE_FAILURE_ACTIONSA; struct SERVICE_FAILURE_ACTIONSW { DWORD dwResetPeriod; LPWSTR lpRebootMsg; LPWSTR lpCommand; DWORD cActions; SC_ACTION* lpsaActions; } alias SERVICE_FAILURE_ACTIONSW* LPSERVICE_FAILURE_ACTIONSW; } extern (Windows) { 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_STATUSW ENUM_SERVICE_STATUS; alias QUERY_SERVICE_CONFIGW QUERY_SERVICE_CONFIG; alias QUERY_SERVICE_LOCK_STATUSW QUERY_SERVICE_LOCK_STATUS; alias LPSERVICE_MAIN_FUNCTIONW LPSERVICE_MAIN_FUNCTION; alias SERVICE_TABLE_ENTRYW SERVICE_TABLE_ENTRY; alias ChangeServiceConfigW ChangeServiceConfig; alias CreateServiceW CreateService; alias EnumDependentServicesW EnumDependentServices; alias EnumServicesStatusW EnumServicesStatus; alias GetServiceDisplayNameW GetServiceDisplayName; alias GetServiceKeyNameW GetServiceKeyName; alias OpenSCManagerW OpenSCManager; alias OpenServiceW OpenService; alias QueryServiceConfigW QueryServiceConfig; alias QueryServiceLockStatusW QueryServiceLockStatus; alias RegisterServiceCtrlHandlerW RegisterServiceCtrlHandler; alias StartServiceW StartService; alias StartServiceCtrlDispatcherW StartServiceCtrlDispatcher; static if (_WIN32_WINNT >= 0x500) { alias ENUM_SERVICE_STATUS_PROCESSW ENUM_SERVICE_STATUS_PROCESS; alias SERVICE_DESCRIPTIONW SERVICE_DESCRIPTION; alias SERVICE_FAILURE_ACTIONSW SERVICE_FAILURE_ACTIONS; alias EnumServicesStatusExW EnumServicesStatusEx; alias QueryServiceConfig2W QueryServiceConfig2; alias RegisterServiceCtrlHandlerExW RegisterServiceCtrlHandlerEx; } static if (_WIN32_WINNT >= 0x501) { alias ChangeServiceConfig2W ChangeServiceConfig2; } } else { alias ENUM_SERVICE_STATUSA ENUM_SERVICE_STATUS; alias QUERY_SERVICE_CONFIGA QUERY_SERVICE_CONFIG; alias QUERY_SERVICE_LOCK_STATUSA QUERY_SERVICE_LOCK_STATUS; alias LPSERVICE_MAIN_FUNCTIONA LPSERVICE_MAIN_FUNCTION; alias SERVICE_TABLE_ENTRYA SERVICE_TABLE_ENTRY; alias ChangeServiceConfigA ChangeServiceConfig; alias CreateServiceA CreateService; alias EnumDependentServicesA EnumDependentServices; alias EnumServicesStatusA EnumServicesStatus; alias GetServiceDisplayNameA GetServiceDisplayName; alias GetServiceKeyNameA GetServiceKeyName; alias OpenSCManagerA OpenSCManager; alias OpenServiceA OpenService; alias QueryServiceConfigA QueryServiceConfig; alias QueryServiceLockStatusA QueryServiceLockStatus; alias RegisterServiceCtrlHandlerA RegisterServiceCtrlHandler; alias StartServiceA StartService; alias StartServiceCtrlDispatcherA StartServiceCtrlDispatcher; static if (_WIN32_WINNT >= 0x500) { alias ENUM_SERVICE_STATUS_PROCESSA ENUM_SERVICE_STATUS_PROCESS; alias SERVICE_DESCRIPTIONA SERVICE_DESCRIPTION; alias SERVICE_FAILURE_ACTIONSA SERVICE_FAILURE_ACTIONS; alias EnumServicesStatusExA EnumServicesStatusEx; alias QueryServiceConfig2A QueryServiceConfig2; alias RegisterServiceCtrlHandlerExA RegisterServiceCtrlHandlerEx; } static if (_WIN32_WINNT >= 0x501) { alias ChangeServiceConfig2A ChangeServiceConfig2; } } alias ENUM_SERVICE_STATUS* LPENUM_SERVICE_STATUS; alias QUERY_SERVICE_CONFIG* LPQUERY_SERVICE_CONFIG; alias QUERY_SERVICE_LOCK_STATUS* LPQUERY_SERVICE_LOCK_STATUS; alias SERVICE_TABLE_ENTRY* LPSERVICE_TABLE_ENTRY; static if (_WIN32_WINNT >= 0x500) { alias ENUM_SERVICE_STATUS_PROCESS* LPENUM_SERVICE_STATUS_PROCESS; alias SERVICE_DESCRIPTION* LPSERVICE_DESCRIPTION; alias SERVICE_FAILURE_ACTIONS* LPSERVICE_FAILURE_ACTIONS; }