/* * svcctl interface definitions - exported by services.exe to access the * services database * * Copyright 2007 Google (Mikolaj Zalewski) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ import "wtypes.idl"; /* * some defined for the C code */ cpp_quote("#include \"winsvc.h\"") cpp_quote("#define SVCCTL_TRANSPORT {'n','c','a','c','n','_','n','p',0}") cpp_quote("#define SVCCTL_ENDPOINT {'\\\\','p','i','p','e','\\\\','s','v','c','c','t','l',0}") /* Not the Windows event name - if needed the true one can be found in Inside Windows */ cpp_quote("#define SVCCTL_STARTED_EVENT {'_','_','w','i','n','e','_','S','v','c','c','t','l','S','t','a','r','t','e','d',0}") /* Service startup protocol over control pipe - not compatible with Windows */ enum service_pipe_command { WINESERV_STARTINFO = 1, WINESERV_SENDCONTROL = 2 }; typedef struct service_start_info_t { enum service_pipe_command cmd; /* request code */ DWORD total_size; /* total request size */ DWORD name_size; /* size of name in data buffer */ DWORD control; /* control code */ WCHAR data[1]; } service_start_info; [ uuid(367abb81-9844-35f1-ad32-98f038001003), version(2.0), pointer_default(unique), endpoint("ncacn_np:[\\pipe\\svcctl]") ] interface svcctl { /* handle types */ typedef [handle] LPCWSTR MACHINE_HANDLEW; typedef [context_handle] void *SC_RPC_HANDLE; typedef [context_handle] void *SC_RPC_LOCK; /* undocumented access rights */ cpp_quote("#define SERVICE_SET_STATUS 0x8000") cpp_quote("#if 0 /* already defined in winsvc.h */") typedef struct _QUERY_SERVICE_CONFIGW { DWORD dwServiceType; DWORD dwStartType; DWORD dwErrorControl; [unique] LPWSTR lpBinaryPathName; [unique] LPWSTR lpLoadOrderGroup; DWORD dwTagId; [unique] LPWSTR lpDependencies; [unique] LPWSTR lpServiceStartName; [unique] LPWSTR lpDisplayName; } QUERY_SERVICE_CONFIGW, *LPQUERY_SERVICE_CONFIGW; typedef struct _SERVICE_STATUS { DWORD dwServiceType; DWORD dwCurrentState; DWORD dwControlsAccepted; DWORD dwWin32ExitCode; DWORD dwServiceSpecificExitCode; DWORD dwCheckPoint; DWORD dwWaitHint; } SERVICE_STATUS, *LPSERVICE_STATUS; typedef enum _SC_STATUS_TYPE { SC_STATUS_PROCESS_INFO = 0 } SC_STATUS_TYPE; typedef struct _SERVICE_DESCRIPTIONW { LPWSTR lpDescription; } SERVICE_DESCRIPTIONW,*LPSERVICE_DESCRIPTIONW; typedef enum _SC_ACTION_TYPE { SC_ACTION_NONE = 0, SC_ACTION_RESTART = 1, SC_ACTION_REBOOT = 2, SC_ACTION_RUN_COMMAND = 3 } SC_ACTION_TYPE; typedef struct _SC_ACTION { SC_ACTION_TYPE Type; DWORD Delay; } SC_ACTION,*LPSC_ACTION; typedef struct _SERVICE_FAILURE_ACTIONSW { DWORD dwResetPeriod; [unique] LPWSTR lpRebootMsg; [unique] LPWSTR lpCommand; DWORD cActions; [size_is(cActions)] SC_ACTION *lpsaActions; } SERVICE_FAILURE_ACTIONSW,*LPSERVICE_FAILURE_ACTIONSW; typedef struct _SERVICE_DELAYED_AUTO_START_INFO { BOOL fDelayedAutostart; } SERVICE_DELAYED_AUTO_START_INFO; typedef struct _SERVICE_FAILURE_ACTIONS_FLAG { BOOL fFailureActionsOnNonCrashFailures; } SERVICE_FAILURE_ACTIONS_FLAG; typedef struct _SERVICE_SID_INFO { DWORD dwServiceSidType; } SERVICE_SID_INFO; typedef struct _SERVICE_PRESHUTDOWN_INFO { DWORD dwPreshutdownTimeout; } SERVICE_PRESHUTDOWN_INFO,*LPSERVICE_PRESHUTDOWN_INFO; #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 typedef struct _ENUM_SERVICE_STATUSW { LPWSTR lpServiceName; LPWSTR lpDisplayName; SERVICE_STATUS ServiceStatus; } ENUM_SERVICE_STATUSW, *LPENUM_SERVICE_STATUSW; cpp_quote("#endif") typedef struct _SERVICE_RPC_REQUIRED_PRIVILEGES_INFO { DWORD cbRequiredPrivileges; [size_is(cbRequiredPrivileges)] BYTE *pRequiredPrivileges; } SERVICE_RPC_REQUIRED_PRIVILEGES_INFO; typedef struct _SC_RPC_CONFIG_INFOW { DWORD dwInfoLevel; [switch_is(dwInfoLevel)] union { [case(SERVICE_CONFIG_DESCRIPTION)] SERVICE_DESCRIPTIONW *descr; [case(SERVICE_CONFIG_FAILURE_ACTIONS)] SERVICE_FAILURE_ACTIONSW *actions; [case(SERVICE_CONFIG_DELAYED_AUTO_START_INFO)] SERVICE_DELAYED_AUTO_START_INFO *delayedstart; [case(SERVICE_CONFIG_FAILURE_ACTIONS_FLAG)] SERVICE_FAILURE_ACTIONS_FLAG *actionsflag; [case(SERVICE_CONFIG_SERVICE_SID_INFO)] SERVICE_SID_INFO *sid; [case(SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO)] SERVICE_RPC_REQUIRED_PRIVILEGES_INFO *privinfo; [case(SERVICE_CONFIG_PRESHUTDOWN_INFO)] SERVICE_PRESHUTDOWN_INFO *preshutdown; }; } SC_RPC_CONFIG_INFOW; /* Compatible with Windows function 0x00 */ DWORD svcctl_CloseServiceHandle( [in,out] SC_RPC_HANDLE *handle ); /* Compatible with Windows function 0x01 */ DWORD svcctl_ControlService( [in] SC_RPC_HANDLE hService, [in] DWORD dwControl, [out] SERVICE_STATUS *lpServiceStatus ); /* Compatible with Windows function 0x02 */ DWORD svcctl_DeleteService( [in] SC_RPC_HANDLE hService ); /* Compatible with Windows function 0x03 */ DWORD svcctl_LockServiceDatabase( [in] SC_RPC_HANDLE hSCManager, [out] SC_RPC_LOCK *phLock ); /* Not compatible with Windows function 0x04 */ DWORD svcctl_QueryServiceObjectSecurity(/* FIXME */); /* Not compatible with Windows function 0x05 */ DWORD svcctl_SetServiceObjectSecurity(/* FIXME */); /* Not compatible with Windows function 0x06 */ DWORD svcctl_QueryServiceStatus(/* FIXME */); /* Compatible with Windows function 0x07 */ DWORD svcctl_SetServiceStatus( [in] SC_RPC_HANDLE hServiceStatus, [in] LPSERVICE_STATUS lpServiceStatus ); /* Compatible with Windows function 0x08 */ DWORD svcctl_UnlockServiceDatabase( [in,out] SC_RPC_LOCK *phLock ); /* Not compatible with Windows function 0x09 */ DWORD svcctl_NotifyBootConfigStatus(/* FIXME */); /* Not compatible with Windows function 0x0a */ DWORD svcctl_SCSetServiceBitsW(/* FIXME */); /* Compatible with Windows function 0x0b */ DWORD svcctl_ChangeServiceConfigW( [in] SC_RPC_HANDLE hService, [in] DWORD dwServiceType, [in] DWORD dwStartType, [in] DWORD dwErrorControl, [in,unique] LPCWSTR lpBinaryPathName, [in,unique] LPCWSTR lpLoadOrderGroupKey, [in,out,unique] DWORD *lpdwTagId, [in,unique,size_is(dwDependenciesSize)] const BYTE *lpDependencies, [in] DWORD dwDependenciesSize, [in,unique] LPCWSTR lpServiceStartName, [in,unique,size_is(dwPasswordSize)] const BYTE *lpPassword, [in] DWORD dwPasswordSize, [in,unique] LPCWSTR lpDisplayName ); /* Compatible with Windows function 0x0c */ DWORD svcctl_CreateServiceW( [in] SC_RPC_HANDLE hSCManager, [in] LPCWSTR lpServiceName, [in,unique] LPCWSTR lpDisplayName, [in] DWORD dwDesiredAccess, [in] DWORD dwServiceType, [in] DWORD dwStartType, [in] DWORD dwErrorControl, [in] LPCWSTR lpBinaryPathName, [in,unique] LPCWSTR lpLoadOrderGroup, [in,out,unique] DWORD *lpdwTagId, [in,unique,size_is(dwDependenciesSize)] const BYTE *lpDependencies, [in] DWORD dwDependenciesSize, [in,unique] LPCWSTR lpServiceStartName, [in,unique,size_is(dwPasswordSize)] const BYTE *lpPassword, [in] DWORD dwPasswordSize, [out] SC_RPC_HANDLE *phService ); /* Not compatible with Windows function 0x0d */ DWORD svcctl_EnumDependentServicesW(/* FIXME */); /* Compatible with Windows function 0x0e */ DWORD svcctl_EnumServicesStatusW( [in] SC_RPC_HANDLE hmngr, [in] DWORD type, [in] DWORD state, [out,size_is(size)] BYTE *buffer, [in] DWORD size, [out] LPDWORD needed, [out] LPDWORD returned, [in,out,unique] LPDWORD resume ); /* Compatible with Windows function 0x0f */ DWORD svcctl_OpenSCManagerW( [in,unique] MACHINE_HANDLEW MachineName, [in,unique] LPCWSTR DatabaseName, [in] DWORD dwAccessMask, [out] SC_RPC_HANDLE *handle ); /* Compatible with Windows function 0x10 */ DWORD svcctl_OpenServiceW( [in] SC_RPC_HANDLE hSCManager, [in] LPCWSTR lpServiceName, [in] DWORD dwDesiredAccess, [out] SC_RPC_HANDLE *phService ); /* Windows function 0x11 must be using a different prototype - not compatible */ DWORD svcctl_QueryServiceConfigW( [in] SC_RPC_HANDLE hService, [out] QUERY_SERVICE_CONFIGW *config); /* Not compatible with Windows function 0x12 */ DWORD svcctl_QueryServiceLockStatusW(/* FIXME */); /* Untested with Windows function 0x13 */ DWORD svcctl_StartServiceW( [in] SC_RPC_HANDLE hService, [in] DWORD dwNumServiceArgs, [in,unique,size_is(dwNumServiceArgs)] LPCWSTR *lpServiceArgVectors ); /* Compatible with Windows function 0x14 */ DWORD svcctl_GetServiceDisplayNameW( [in] SC_RPC_HANDLE hSCManager, [in] LPCWSTR lpServiceName, [out,string,size_is(*cchBufSize+1)] WCHAR lpBuffer[], [in,out] DWORD *cchBufSize); /* Compatible with Windows function 0x15 */ DWORD svcctl_GetServiceKeyNameW( [in] SC_RPC_HANDLE hSCManager, [in] LPCWSTR lpServiceDisplayName, [out,string,size_is(*cchBufSize+1)] WCHAR lpBuffer[], [in,out] DWORD *cchBufSize); /* Not compatible with Windows function 0x16 */ DWORD svcctl_SCSetServiceBitsA(/* FIXME */); /* Not compatible with Windows function 0x17 */ DWORD svcctl_ChangeServiceConfigA(/* FIXME */); /* Not compatible with Windows function 0x18 */ DWORD svcctl_CreateServiceA(/* FIXME */); /* Not compatible with Windows function 0x19 */ DWORD svcctl_EnumDependentServicesA(/* FIXME */); /* Not compatible with Windows function 0x1a */ DWORD svcctl_EnumServicesStatusA(/* FIXME */); /* Not compatible with Windows function 0x1b */ DWORD svcctl_OpenSCManagerA(/* FIXME */); /* Not compatible with Windows function 0x1c */ DWORD svcctl_OpenServiceA(/* FIXME */); /* Not compatible with Windows function 0x1d */ DWORD svcctl_QueryServiceConfigA(/* FIXME */); /* Not compatible with Windows function 0x1e */ DWORD svcctl_QueryServiceLockStatusA(/* FIXME */); /* Not compatible with Windows function 0x1f */ DWORD svcctl_StartServiceA(/* FIXME */); /* Not compatible with Windows function 0x20 */ DWORD svcctl_GetServiceDisplayNameA(/* FIXME */); /* Not compatible with Windows function 0x21 */ DWORD svcctl_GetServiceKeyNameA(/* FIXME */); /* Not compatible with Windows function 0x22 */ DWORD svcctl_GetCurrentGroupStateW(/* FIXME */); /* Not compatible with Windows function 0x23 */ DWORD svcctl_EnumServiceGroupW(/* FIXME */); /* Not compatible with Windows function 0x24 */ DWORD svcctl_ChangeServiceConfig2A(/* FIXME */); /* Compatible with Windows function 0x25 */ DWORD svcctl_ChangeServiceConfig2W( [in] SC_RPC_HANDLE hService, [in] SC_RPC_CONFIG_INFOW config); /* Not compatible with Windows function 0x26 */ DWORD svcctl_QueryServiceConfig2A(/* FIXME */); /* Untested with Windows function 0x27 */ DWORD svcctl_QueryServiceConfig2W( [in] SC_RPC_HANDLE hService, [in] DWORD InfoLevel, [out,size_is(cbBufSize)] BYTE lpBuffer[], [in] DWORD cbBufSize, [out] LPDWORD pcbBytesNeeded ); /* Untested with Windows function 0x28 */ DWORD svcctl_QueryServiceStatusEx( [in] SC_RPC_HANDLE hService, [in] SC_STATUS_TYPE InfoLevel, [out,size_is(cbBufSize)] BYTE *lpBuffer, [in] DWORD cbBufSize, [out] LPDWORD pcbBytesNeeded ); DWORD svcctl_EnumServicesStatusExW( [in] SC_RPC_HANDLE hmngr, [in] DWORD type, [in] DWORD state, [out,size_is(size)] BYTE *buffer, [in] DWORD size, [out] LPDWORD needed, [out] LPDWORD returned, [in,unique] LPCWSTR group ); }