Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
For ease of implementation, the full Interface Definition Language (IDL) is provided as follows, where "ms-dtyp.idl" is the IDL found in [MS-DTYP] Appendix A.
-
import "ms-dtyp.idl"; [ uuid(367ABB81-9844-35F1-AD32-98F038001003), version(2.0), ms_union, pointer_default(unique) ] interface svcctl{ const unsigned int MAX_SERVICE_NAME_LENGTH = 256; const unsigned short SC_MAX_DEPEND_SIZE = 4 * 1024; const unsigned short SC_MAX_NAME_LENGTH = MAX_SERVICE_NAME_LENGTH + 1; const unsigned short SC_MAX_PATH_LENGTH = 32 * 1024; const unsigned short SC_MAX_PWD_SIZE = 514; const unsigned short SC_MAX_COMPUTER_NAME_LENGTH = 1024; const unsigned short SC_MAX_ACCOUNT_NAME_LENGTH = 2 * 1024; const unsigned short SC_MAX_COMMENT_LENGTH = 128; const unsigned short SC_MAX_ARGUMENT_LENGTH = 1024; const unsigned short SC_MAX_ARGUMENTS = 1024; typedef [handle] wchar_t* SVCCTL_HANDLEW; typedef [handle] LPSTR SVCCTL_HANDLEA; typedef [context_handle] PVOID SC_RPC_HANDLE; typedef [context_handle] PVOID SC_RPC_LOCK; typedef [context_handle] PVOID SC_NOTIFY_RPC_HANDLE; typedef SC_RPC_HANDLE * LPSC_RPC_HANDLE; typedef SC_RPC_LOCK * LPSC_RPC_LOCK; typedef SC_NOTIFY_RPC_HANDLE * LPSC_NOTIFY_RPC_HANDLE; typedef struct _STRING_PTRSA { [string, range(0, SC_MAX_ARGUMENT_LENGTH)] LPSTR StringPtr; } STRING_PTRSA, *PSTRING_PTRSA, *LPSTRING_PTRSA; typedef struct _STRING_PTRSW { [string, range(0, SC_MAX_ARGUMENT_LENGTH)] wchar_t* StringPtr; } STRING_PTRSW, *PSTRING_PTRSW, *LPSTRING_PTRSW; typedef [range(0, 1024 * 4)] DWORD BOUNDED_DWORD_4K; typedef BOUNDED_DWORD_4K * LPBOUNDED_DWORD_4K; typedef [range(0, 1024 * 8)] DWORD BOUNDED_DWORD_8K; typedef BOUNDED_DWORD_8K * LPBOUNDED_DWORD_8K; typedef [range(0, 1024 * 256)] DWORD BOUNDED_DWORD_256K; typedef BOUNDED_DWORD_256K * LPBOUNDED_DWORD_256K; typedef struct { DWORD dwServiceType; DWORD dwCurrentState; DWORD dwControlsAccepted; DWORD dwWin32ExitCode; DWORD dwServiceSpecificExitCode; DWORD dwCheckPoint; DWORD dwWaitHint; } SERVICE_STATUS, *LPSERVICE_STATUS; typedef struct { DWORD dwServiceType; DWORD dwCurrentState; DWORD dwControlsAccepted; DWORD dwWin32ExitCode; DWORD dwServiceSpecificExitCode; DWORD dwCheckPoint; DWORD dwWaitHint; DWORD dwProcessId; DWORD dwServiceFlags; } SERVICE_STATUS_PROCESS, *LPSERVICE_STATUS_PROCESS; typedef struct _QUERY_SERVICE_CONFIGW { DWORD dwServiceType; DWORD dwStartType; DWORD dwErrorControl; [string,range(0, 8 * 1024)] LPWSTR lpBinaryPathName; [string,range(0, 8 * 1024)] LPWSTR lpLoadOrderGroup; DWORD dwTagId; [string,range(0, 8 * 1024)] LPWSTR lpDependencies; [string,range(0, 8 * 1024)] LPWSTR lpServiceStartName; [string,range(0, 8 * 1024)] LPWSTR lpDisplayName; } QUERY_SERVICE_CONFIGW, *LPQUERY_SERVICE_CONFIGW; typedef struct _QUERY_SERVICE_LOCK_STATUSW { DWORD fIsLocked; [string,range(0, 8 * 1024)] LPWSTR lpLockOwner; DWORD dwLockDuration; } QUERY_SERVICE_LOCK_STATUSW, *LPQUERY_SERVICE_LOCK_STATUSW; typedef struct _QUERY_SERVICE_CONFIGA { DWORD dwServiceType; DWORD dwStartType; DWORD dwErrorControl; [string,range(0, 8 * 1024)] LPSTR lpBinaryPathName; [string,range(0, 8 * 1024)] LPSTR lpLoadOrderGroup; DWORD dwTagId; [string,range(0, 8 * 1024)] LPSTR lpDependencies; [string,range(0, 8 * 1024)] LPSTR lpServiceStartName; [string,range(0, 8 * 1024)] LPSTR lpDisplayName; } QUERY_SERVICE_CONFIGA, *LPQUERY_SERVICE_CONFIGA; typedef struct { DWORD fIsLocked; [string,range(0, 8 * 1024)] char* lpLockOwner; DWORD dwLockDuration; } QUERY_SERVICE_LOCK_STATUSA, *LPQUERY_SERVICE_LOCK_STATUSA; typedef struct _SERVICE_DESCRIPTIONA { [string,range(0, 8 * 1024)] LPSTR lpDescription; } SERVICE_DESCRIPTIONA, *LPSERVICE_DESCRIPTIONA; typedef [v1_enum] 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_TYPE Type; DWORD Delay; } SC_ACTION, *LPSC_ACTION; typedef struct _SERVICE_FAILURE_ACTIONSA { DWORD dwResetPeriod; [string,range(0, 8 * 1024)] LPSTR lpRebootMsg; [string,range(0, 8 * 1024)] LPSTR lpCommand; [range(0, 1024)] DWORD cActions; [size_is(cActions)] SC_ACTION * lpsaActions; } SERVICE_FAILURE_ACTIONSA, *LPSERVICE_FAILURE_ACTIONSA; typedef struct _SERVICE_DELAYED_AUTO_START_INFO { BOOL fDelayedAutostart; } SERVICE_DELAYED_AUTO_START_INFO, *LPSERVICE_DELAYED_AUTO_START_INFO; typedef struct _SERVICE_FAILURE_ACTIONS_FLAG { BOOL fFailureActionsOnNonCrashFailures; } SERVICE_FAILURE_ACTIONS_FLAG, *LPSERVICE_FAILURE_ACTIONS_FLAG; typedef struct _SERVICE_SID_INFO { DWORD dwServiceSidType; } SERVICE_SID_INFO, *LPSERVICE_SID_INFO; typedef struct _SERVICE_PRESHUTDOWN_INFO { DWORD dwPreshutdownTimeout; } SERVICE_PRESHUTDOWN_INFO, *LPSERVICE_PRESHUTDOWN_INFO; typedef struct _SERVICE_DESCRIPTIONW { [string,range(0, 8 * 1024)] LPWSTR lpDescription; } SERVICE_DESCRIPTIONW, *LPSERVICE_DESCRIPTIONW; typedef struct _SERVICE_FAILURE_ACTIONSW { DWORD dwResetPeriod; [string,range(0, 8 * 1024)] LPWSTR lpRebootMsg; [string,range(0, 8 * 1024)] LPWSTR lpCommand; [range(0, 1024)] DWORD cActions; [size_is(cActions)] SC_ACTION * lpsaActions; } SERVICE_FAILURE_ACTIONSW, *LPSERVICE_FAILURE_ACTIONSW; typedef [v1_enum] enum { SC_STATUS_PROCESS_INFO = 0 } SC_STATUS_TYPE; typedef [v1_enum] enum { SC_ENUM_PROCESS_INFO = 0 } SC_ENUM_TYPE; typedef struct _SERVICE_PREFERRED_NODE_INFO { USHORT usPreferredNode; BOOLEAN fDelete; } SERVICE_PREFERRED_NODE_INFO, *LPSERVICE_PREFERRED_NODE_INFO; typedef struct _SERVICE_TRIGGER_SPECIFIC_DATA_ITEM { DWORD dwDataType; [range(0, 1024)] DWORD cbData; [size_is(cbData)] PBYTE pData; } SERVICE_TRIGGER_SPECIFIC_DATA_ITEM, *PSERVICE_TRIGGER_SPECIFIC_DATA_ITEM; typedef struct _SERVICE_TRIGGER { DWORD dwTriggerType; DWORD dwAction; GUID * pTriggerSubtype; [range(0, 64)] DWORD cDataItems; [size_is(cDataItems)] PSERVICE_TRIGGER_SPECIFIC_DATA_ITEM pDataItems; } SERVICE_TRIGGER, *PSERVICE_TRIGGER; typedef struct _SERVICE_TRIGGER_INFO { [range(0, 64)] DWORD cTriggers; [size_is(cTriggers)] PSERVICE_TRIGGER pTriggers; PBYTE pReserved; } SERVICE_TRIGGER_INFO, *PSERVICE_TRIGGER_INFO; typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION; 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; 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; typedef struct _SERVICE_DESCRIPTION_WOW64 { DWORD dwDescriptionOffset; } SERVICE_DESCRIPTION_WOW64, *LPSERVICE_DESCRIPTION_WOW64; typedef struct _SERVICE_FAILURE_ACTIONS_WOW64 { DWORD dwResetPeriod; DWORD dwRebootMsgOffset; DWORD dwCommandOffset; DWORD cActions; DWORD dwsaActionsOffset; } SERVICE_FAILURE_ACTIONS_WOW64, *LPSERVICE_FAILURE_ACTIONS_WOW64; typedef struct _SERVICE_REQUIRED_PRIVILEGES_INFO_WOW64 { DWORD dwRequiredPrivilegesOffset; } SERVICE_REQUIRED_PRIVILEGES_INFO_WOW64, *LPSERVICE_REQUIRED_PRIVILEGES_INFO_WOW64; DWORD RCloseServiceHandle( [in,out] LPSC_RPC_HANDLE hSCObject ); DWORD RControlService( [in] SC_RPC_HANDLE hService, [in] DWORD dwControl, [out] LPSERVICE_STATUS lpServiceStatus ); DWORD RDeleteService( [in] SC_RPC_HANDLE hService ); DWORD RLockServiceDatabase( [in] SC_RPC_HANDLE hSCManager, [out] LPSC_RPC_LOCK lpLock ); DWORD RQueryServiceObjectSecurity( [in] SC_RPC_HANDLE hService, [in] SECURITY_INFORMATION dwSecurityInformation, [out, size_is(cbBufSize)] LPBYTE lpSecurityDescriptor, [in, range(0, 1024 * 256)] DWORD cbBufSize, [out] LPBOUNDED_DWORD_256K pcbBytesNeeded ); DWORD RSetServiceObjectSecurity( [in] SC_RPC_HANDLE hService, [in] SECURITY_INFORMATION dwSecurityInformation, [in,size_is(cbBufSize)] LPBYTE lpSecurityDescriptor, [in] DWORD cbBufSize ); DWORD RQueryServiceStatus( [in] SC_RPC_HANDLE hService, [out] LPSERVICE_STATUS lpServiceStatus ); DWORD RSetServiceStatus( [in] SC_RPC_HANDLE hServiceStatus, [in] LPSERVICE_STATUS lpServiceStatus ); DWORD RUnlockServiceDatabase( [in,out] LPSC_RPC_LOCK Lock ); DWORD RNotifyBootConfigStatus( [in,string,unique,range(0, SC_MAX_COMPUTER_NAME_LENGTH)] SVCCTL_HANDLEW lpMachineName, [in] DWORD BootAcceptable ); void Opnum10NotUsedOnWire(void); DWORD RChangeServiceConfigW( [in] SC_RPC_HANDLE hService, [in] DWORD dwServiceType, [in] DWORD dwStartType, [in] DWORD dwErrorControl, [in,string,unique,range(0, SC_MAX_PATH_LENGTH)] wchar_t * lpBinaryPathName, [in,string,unique,range(0, SC_MAX_NAME_LENGTH)] wchar_t * lpLoadOrderGroup, [in,out,unique] LPDWORD lpdwTagId, [in,unique,size_is(dwDependSize)] LPBYTE lpDependencies, [in, range (0, SC_MAX_DEPEND_SIZE)] DWORD dwDependSize, [in,string,unique,range(0, SC_MAX_ACCOUNT_NAME_LENGTH)] wchar_t * lpServiceStartName, [in,unique,size_is(dwPwSize)] LPBYTE lpPassword, [in, range(0, SC_MAX_PWD_SIZE)] DWORD dwPwSize, [in,string,unique,range(0, SC_MAX_NAME_LENGTH)] wchar_t * lpDisplayName ); DWORD RCreateServiceW( [in] SC_RPC_HANDLE hSCManager, [in,string,range(0, SC_MAX_NAME_LENGTH)] wchar_t * lpServiceName, [in,string,unique,range(0, SC_MAX_NAME_LENGTH)] wchar_t * lpDisplayName, [in] DWORD dwDesiredAccess, [in] DWORD dwServiceType, [in] DWORD dwStartType, [in] DWORD dwErrorControl, [in,string, range(0, SC_MAX_PATH_LENGTH)] wchar_t * lpBinaryPathName, [in,string,unique,range(0, SC_MAX_NAME_LENGTH)] wchar_t * lpLoadOrderGroup, [in,out,unique] LPDWORD lpdwTagId, [in,unique,size_is(dwDependSize)] LPBYTE lpDependencies, [in, range (0, SC_MAX_DEPEND_SIZE)] DWORD dwDependSize, [in,string,unique,range(0, SC_MAX_ACCOUNT_NAME_LENGTH)] wchar_t * lpServiceStartName, [in,unique,size_is(dwPwSize)] LPBYTE lpPassword, [in, range(0, SC_MAX_PWD_SIZE)] DWORD dwPwSize, [out] LPSC_RPC_HANDLE lpServiceHandle ); DWORD REnumDependentServicesW( [in] SC_RPC_HANDLE hService, [in] DWORD dwServiceState, [out, size_is(cbBufSize)] LPBYTE lpServices, [in, range(0, 1024 * 256)] DWORD cbBufSize, [out] LPBOUNDED_DWORD_256K pcbBytesNeeded, [out] LPBOUNDED_DWORD_256K lpServicesReturned ); DWORD REnumServicesStatusW( [in] SC_RPC_HANDLE hSCManager, [in] DWORD dwServiceType, [in] DWORD dwServiceState, [out, size_is(cbBufSize)] LPBYTE lpBuffer, [in, range(0, 1024 * 256)] DWORD cbBufSize, [out] LPBOUNDED_DWORD_256K pcbBytesNeeded, [out] LPBOUNDED_DWORD_256K lpServicesReturned, [in,out,unique] LPBOUNDED_DWORD_256K lpResumeIndex ); DWORD ROpenSCManagerW( [in,string,unique,range(0, SC_MAX_COMPUTER_NAME_LENGTH)] SVCCTL_HANDLEW lpMachineName, [in,string,unique,range(0, SC_MAX_NAME_LENGTH)] wchar_t * lpDatabaseName, [in] DWORD dwDesiredAccess, [out] LPSC_RPC_HANDLE lpScHandle ); DWORD ROpenServiceW( [in] SC_RPC_HANDLE hSCManager, [in,string,range(0, SC_MAX_NAME_LENGTH)] wchar_t * lpServiceName, [in] DWORD dwDesiredAccess, [out] LPSC_RPC_HANDLE lpServiceHandle ); DWORD RQueryServiceConfigW( [in] SC_RPC_HANDLE hService, [out] LPQUERY_SERVICE_CONFIGW lpServiceConfig, [in, range(0, 1024 * 8)] DWORD cbBufSize, [out] LPBOUNDED_DWORD_8K pcbBytesNeeded ); DWORD RQueryServiceLockStatusW( [in] SC_RPC_HANDLE hSCManager, [out] LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus, [in, range(0, 1024 * 4)] DWORD cbBufSize, [out] LPBOUNDED_DWORD_4K pcbBytesNeeded ); DWORD RStartServiceW( [in] SC_RPC_HANDLE hService, [in, range(0, SC_MAX_ARGUMENTS)] DWORD argc, [in,unique,size_is(argc)] LPSTRING_PTRSW argv ); DWORD RGetServiceDisplayNameW( [in] SC_RPC_HANDLE hSCManager, [in,string,range(0, SC_MAX_NAME_LENGTH)] wchar_t * lpServiceName, [out,string, range(1, 4*1024+1), size_is(*lpcchBuffer+1)] wchar_t * lpDisplayName, [in,out] DWORD * lpcchBuffer ); DWORD RGetServiceKeyNameW( [in] SC_RPC_HANDLE hSCManager, [in,string,range(0, SC_MAX_NAME_LENGTH)] wchar_t * lpDisplayName, [out,string, range(1, 4*1024+1), size_is(*lpcchBuffer+1)] wchar_t * lpServiceName, [in,out] DWORD * lpcchBuffer ); void Opnum22NotUsedOnWire(void); DWORD RChangeServiceConfigA( [in] SC_RPC_HANDLE hService, [in] DWORD dwServiceType, [in] DWORD dwStartType, [in] DWORD dwErrorControl, [in,string,unique,range(0, SC_MAX_PATH_LENGTH)] LPSTR lpBinaryPathName, [in,string,unique,range(0, SC_MAX_NAME_LENGTH)] LPSTR lpLoadOrderGroup, [in,out,unique] LPDWORD lpdwTagId, [in,unique,size_is(dwDependSize)] LPBYTE lpDependencies, [in, range (0, SC_MAX_DEPEND_SIZE)] DWORD dwDependSize, [in,string,unique,range(0, SC_MAX_ACCOUNT_NAME_LENGTH)] LPSTR lpServiceStartName, [in,unique,size_is(dwPwSize)] LPBYTE lpPassword, [in, range(0, SC_MAX_PWD_SIZE)] DWORD dwPwSize, [in,string,unique,range(0, SC_MAX_NAME_LENGTH)] LPSTR lpDisplayName ); DWORD RCreateServiceA( [in] SC_RPC_HANDLE hSCManager, [in,string,range(0, SC_MAX_NAME_LENGTH)] LPSTR lpServiceName, [in,string,unique,range(0, SC_MAX_NAME_LENGTH)] LPSTR lpDisplayName, [in] DWORD dwDesiredAccess, [in] DWORD dwServiceType, [in] DWORD dwStartType, [in] DWORD dwErrorControl, [in,string, range(0, SC_MAX_PATH_LENGTH)] LPSTR lpBinaryPathName, [in,string,unique,range(0, SC_MAX_NAME_LENGTH)] LPSTR lpLoadOrderGroup, [in,out,unique] LPDWORD lpdwTagId, [in,unique,size_is(dwDependSize)] LPBYTE lpDependencies, [in, range (0, SC_MAX_DEPEND_SIZE)] DWORD dwDependSize, [in,string,unique,range(0, SC_MAX_ACCOUNT_NAME_LENGTH)] LPSTR lpServiceStartName, [in,unique,size_is(dwPwSize)] LPBYTE lpPassword, [in, range(0, SC_MAX_PWD_SIZE)] DWORD dwPwSize, [out] LPSC_RPC_HANDLE lpServiceHandle ); DWORD REnumDependentServicesA( [in] SC_RPC_HANDLE hService, [in] DWORD dwServiceState, [out, size_is(cbBufSize)] LPBYTE lpServices, [in, range(0, 1024 * 256)] DWORD cbBufSize, [out] LPBOUNDED_DWORD_256K pcbBytesNeeded, [out] LPBOUNDED_DWORD_256K lpServicesReturned ); DWORD REnumServicesStatusA( [in] SC_RPC_HANDLE hSCManager, [in] DWORD dwServiceType, [in] DWORD dwServiceState, [out, size_is(cbBufSize)] LPBYTE lpBuffer, [in, range(0, 1024 * 256)] DWORD cbBufSize, [out] LPBOUNDED_DWORD_256K pcbBytesNeeded, [out] LPBOUNDED_DWORD_256K lpServicesReturned, [in,out,unique] LPBOUNDED_DWORD_256K lpResumeIndex ); DWORD ROpenSCManagerA( [in,string,unique,range(0, SC_MAX_COMPUTER_NAME_LENGTH)] SVCCTL_HANDLEA lpMachineName, [in,string,unique,range(0, SC_MAX_NAME_LENGTH)] LPSTR lpDatabaseName, [in] DWORD dwDesiredAccess, [out] LPSC_RPC_HANDLE lpScHandle ); DWORD ROpenServiceA( [in] SC_RPC_HANDLE hSCManager, [in,string,range(0, SC_MAX_NAME_LENGTH)] LPSTR lpServiceName, [in] DWORD dwDesiredAccess, [out] LPSC_RPC_HANDLE lpServiceHandle ); DWORD RQueryServiceConfigA( [in] SC_RPC_HANDLE hService, [out] LPQUERY_SERVICE_CONFIGA lpServiceConfig, [in, range(0, 1024 * 8)] DWORD cbBufSize, [out] LPBOUNDED_DWORD_8K pcbBytesNeeded ); DWORD RQueryServiceLockStatusA( [in] SC_RPC_HANDLE hSCManager, [out] LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus, [in, range(0, 1024 * 4)] DWORD cbBufSize, [out] LPBOUNDED_DWORD_4K pcbBytesNeeded ); DWORD RStartServiceA( [in] SC_RPC_HANDLE hService, [in, range(0, SC_MAX_ARGUMENTS)] DWORD argc, [in,unique,size_is(argc)] LPSTRING_PTRSA argv ); DWORD RGetServiceDisplayNameA( [in] SC_RPC_HANDLE hSCManager, [in,string,range(0, SC_MAX_NAME_LENGTH)] LPSTR lpServiceName, [out,string, size_is(*lpcchBuffer)] LPSTR lpDisplayName, [in,out] LPBOUNDED_DWORD_4K lpcchBuffer ); DWORD RGetServiceKeyNameA( [in] SC_RPC_HANDLE hSCManager, [in,string,range(0, SC_MAX_NAME_LENGTH)] LPSTR lpDisplayName, [out,string, size_is(*lpcchBuffer)] LPSTR lpKeyName, [in,out] LPBOUNDED_DWORD_4K lpcchBuffer ); void Opnum34NotUsedOnWire(void); DWORD REnumServiceGroupW( [in] SC_RPC_HANDLE hSCManager, [in] DWORD dwServiceType, [in] DWORD dwServiceState, [out, size_is(cbBufSize)] LPBYTE lpBuffer, [in, range(0, 1024 * 256)] DWORD cbBufSize, [out] LPBOUNDED_DWORD_256K pcbBytesNeeded, [out] LPBOUNDED_DWORD_256K lpServicesReturned, [in,out,unique] LPBOUNDED_DWORD_256K lpResumeIndex, [in,string,unique,range(0, SC_MAX_NAME_LENGTH)] LPCWSTR pszGroupName ); typedef struct _SERVICE_RPC_REQUIRED_PRIVILEGES_INFO { [range(0, 1024 * 4)] DWORD cbRequiredPrivileges; [size_is(cbRequiredPrivileges)] PBYTE pRequiredPrivileges; } SERVICE_RPC_REQUIRED_PRIVILEGES_INFO, *LPSERVICE_RPC_REQUIRED_PRIVILEGES_INFO; typedef struct _SC_RPC_CONFIG_INFOA { DWORD dwInfoLevel; [switch_is(dwInfoLevel)] union { [case(1)] LPSERVICE_DESCRIPTIONA psd; [case(2)] LPSERVICE_FAILURE_ACTIONSA psfa; [case(3)] LPSERVICE_DELAYED_AUTO_START_INFO psda; [case(4)] LPSERVICE_FAILURE_ACTIONS_FLAG psfaf; [case(5)] LPSERVICE_SID_INFO pssid; [case(6)] LPSERVICE_RPC_REQUIRED_PRIVILEGES_INFO psrp; [case(7)] LPSERVICE_PRESHUTDOWN_INFO psps; [case(8)] PSERVICE_TRIGGER_INFO psti; [case(9)] LPSERVICE_PREFERRED_NODE_INFO pspn; }; } SC_RPC_CONFIG_INFOA; typedef struct _SC_RPC_CONFIG_INFOW { DWORD dwInfoLevel; [switch_is(dwInfoLevel)] union { [case(1)] LPSERVICE_DESCRIPTIONW psd; [case(2)] LPSERVICE_FAILURE_ACTIONSW psfa; [case(3)] LPSERVICE_DELAYED_AUTO_START_INFO psda; [case(4)] LPSERVICE_FAILURE_ACTIONS_FLAG psfaf; [case(5)] LPSERVICE_SID_INFO pssid; [case(6)] LPSERVICE_RPC_REQUIRED_PRIVILEGES_INFO psrp; [case(7)] LPSERVICE_PRESHUTDOWN_INFO psps; [case(8)] PSERVICE_TRIGGER_INFO psti; [case(9)] LPSERVICE_PREFERRED_NODE_INFO pspn; }; } SC_RPC_CONFIG_INFOW; DWORD RChangeServiceConfig2A( [in] SC_RPC_HANDLE hService, [in] SC_RPC_CONFIG_INFOA Info ); DWORD RChangeServiceConfig2W( [in] SC_RPC_HANDLE hService, [in] SC_RPC_CONFIG_INFOW Info ); DWORD RQueryServiceConfig2A( [in] SC_RPC_HANDLE hService, [in] DWORD dwInfoLevel, [out, size_is(cbBufSize)] LPBYTE lpBuffer, [in, range(0, 1024 * 8)] DWORD cbBufSize, [out] LPBOUNDED_DWORD_8K pcbBytesNeeded ); DWORD RQueryServiceConfig2W( [in] SC_RPC_HANDLE hService, [in] DWORD dwInfoLevel, [out, size_is(cbBufSize)] LPBYTE lpBuffer, [in, range(0, 1024 * 8)] DWORD cbBufSize, [out] LPBOUNDED_DWORD_8K pcbBytesNeeded ); DWORD RQueryServiceStatusEx( [in] SC_RPC_HANDLE hService, [in] SC_STATUS_TYPE InfoLevel, [out, size_is(cbBufSize)] LPBYTE lpBuffer, [in, range(0, 1024 * 8)] DWORD cbBufSize, [out] LPBOUNDED_DWORD_8K pcbBytesNeeded ); DWORD REnumServicesStatusExA ( [in] SC_RPC_HANDLE hSCManager, [in] SC_ENUM_TYPE InfoLevel, [in] DWORD dwServiceType, [in] DWORD dwServiceState, [out, size_is(cbBufSize)] LPBYTE lpBuffer, [in, range(0, 1024 * 256)] DWORD cbBufSize, [out] LPBOUNDED_DWORD_256K pcbBytesNeeded, [out] LPBOUNDED_DWORD_256K lpServicesReturned, [in,out,unique] LPBOUNDED_DWORD_256K lpResumeIndex, [in,string,unique,range(0, SC_MAX_NAME_LENGTH)] LPCSTR pszGroupName ); DWORD REnumServicesStatusExW ( [in] SC_RPC_HANDLE hSCManager, [in] SC_ENUM_TYPE InfoLevel, [in] DWORD dwServiceType, [in] DWORD dwServiceState, [out, size_is(cbBufSize)] LPBYTE lpBuffer, [in, range(0, 1024 * 256)] DWORD cbBufSize, [out] LPBOUNDED_DWORD_256K pcbBytesNeeded, [out] LPBOUNDED_DWORD_256K lpServicesReturned, [in,out,unique] LPBOUNDED_DWORD_256K lpResumeIndex, [in,string,unique,range(0, SC_MAX_NAME_LENGTH)] LPCWSTR pszGroupName ); void Opnum43NotUsedOnWire(void); DWORD RCreateServiceWOW64A( [in] SC_RPC_HANDLE hSCManager, [in,string,range(0, SC_MAX_NAME_LENGTH)] LPSTR lpServiceName, [in,string,unique,range(0, SC_MAX_NAME_LENGTH)] LPSTR lpDisplayName, [in] DWORD dwDesiredAccess, [in] DWORD dwServiceType, [in] DWORD dwStartType, [in] DWORD dwErrorControl, [in,string, range(0, SC_MAX_PATH_LENGTH)] LPSTR lpBinaryPathName, [in,string,unique,range(0, SC_MAX_NAME_LENGTH)] LPSTR lpLoadOrderGroup, [in,out,unique] LPDWORD lpdwTagId, [in,unique,size_is(dwDependSize)] LPBYTE lpDependencies, [in, range (0, SC_MAX_DEPEND_SIZE)] DWORD dwDependSize, [in,string,unique,range(0, SC_MAX_ACCOUNT_NAME_LENGTH)] LPSTR lpServiceStartName, [in,unique,size_is(dwPwSize)] LPBYTE lpPassword, [in, range(0, SC_MAX_PWD_SIZE)] DWORD dwPwSize, [out] LPSC_RPC_HANDLE lpServiceHandle ); DWORD RCreateServiceWOW64W( [in] SC_RPC_HANDLE hSCManager, [in,string,range(0, SC_MAX_NAME_LENGTH)] wchar_t * lpServiceName, [in,string,unique,range(0, SC_MAX_NAME_LENGTH)] wchar_t * lpDisplayName, [in] DWORD dwDesiredAccess, [in] DWORD dwServiceType, [in] DWORD dwStartType, [in] DWORD dwErrorControl, [in,string,range(0, SC_MAX_PATH_LENGTH)] wchar_t * lpBinaryPathName, [in,string,unique,range(0, SC_MAX_NAME_LENGTH)] wchar_t * lpLoadOrderGroup, [in,out,unique] LPDWORD lpdwTagId, [in,unique,size_is(dwDependSize)] LPBYTE lpDependencies, [in, range (0, SC_MAX_DEPEND_SIZE)] DWORD dwDependSize, [in,string,unique,range(0, SC_MAX_ACCOUNT_NAME_LENGTH)] wchar_t * lpServiceStartName, [in,unique,size_is(dwPwSize)] LPBYTE lpPassword, [in, range(0, SC_MAX_PWD_SIZE)] DWORD dwPwSize, [out] LPSC_RPC_HANDLE lpServiceHandle ); void Opnum46NotUsedOnWire(void); typedef struct _SERVICE_NOTIFY_STATUS_CHANGE_PARAMS_1 { ULONGLONG ullThreadId; DWORD dwNotifyMask; UCHAR CallbackAddressArray [ 16 ]; UCHAR CallbackParamAddressArray [ 16 ]; SERVICE_STATUS_PROCESS ServiceStatus; DWORD dwNotificationStatus; DWORD dwSequence; } SERVICE_NOTIFY_STATUS_CHANGE_PARAMS_1, *PSERVICE_NOTIFY_STATUS_CHANGE_PARAMS_1; typedef struct _SERVICE_NOTIFY_STATUS_CHANGE_PARAMS_2 { ULONGLONG ullThreadId; DWORD dwNotifyMask; UCHAR CallbackAddressArray [ 16 ]; UCHAR CallbackParamAddressArray [ 16 ]; SERVICE_STATUS_PROCESS ServiceStatus; DWORD dwNotificationStatus; DWORD dwSequence; DWORD dwNotificationTriggered; [string, range(0, 64*1024)] PWSTR pszServiceNames; } SERVICE_NOTIFY_STATUS_CHANGE_PARAMS_2, *PSERVICE_NOTIFY_STATUS_CHANGE_PARAMS_2; typedef SERVICE_NOTIFY_STATUS_CHANGE_PARAMS_2 SERVICE_NOTIFY_STATUS_CHANGE_PARAMS, *PSERVICE_NOTIFY_STATUS_CHANGE_PARAMS; typedef struct _SC_RPC_NOTIFY_PARAMS { DWORD dwInfoLevel; [ switch_is ( dwInfoLevel ) ] union { [case(1)] PSERVICE_NOTIFY_STATUS_CHANGE_PARAMS_1 pStatusChangeParam1; [case(2)] PSERVICE_NOTIFY_STATUS_CHANGE_PARAMS_2 pStatusChangeParams; }; } SC_RPC_NOTIFY_PARAMS; typedef struct _SC_RPC_NOTIFY_PARAMS_LIST { BOUNDED_DWORD_4K cElements; [size_is(cElements)] SC_RPC_NOTIFY_PARAMS NotifyParamsArray [*]; } SC_RPC_NOTIFY_PARAMS_LIST, *PSC_RPC_NOTIFY_PARAMS_LIST; DWORD RNotifyServiceStatusChange( [in] SC_RPC_HANDLE hService, [in] SC_RPC_NOTIFY_PARAMS NotifyParams, [in] GUID * pClientProcessGuid, [out] GUID * pSCMProcessGuid, [out] PBOOL pfCreateRemoteQueue, [out] LPSC_NOTIFY_RPC_HANDLE phNotify ); error_status_t RGetNotifyResults( [in] SC_NOTIFY_RPC_HANDLE hNotify, [out] PSC_RPC_NOTIFY_PARAMS_LIST *ppNotifyParams ); DWORD RCloseNotifyHandle( [in, out] LPSC_NOTIFY_RPC_HANDLE phNotify, [out] PBOOL pfApcFired ); typedef struct _SERVICE_CONTROL_STATUS_REASON_IN_PARAMSA { DWORD dwReason; [string,range(0, SC_MAX_COMMENT_LENGTH)] LPSTR pszComment; } SERVICE_CONTROL_STATUS_REASON_IN_PARAMSA, *PSERVICE_CONTROL_STATUS_REASON_IN_PARAMSA; typedef struct _SERVICE_CONTROL_STATUS_REASON_OUT_PARAMS { SERVICE_STATUS_PROCESS ServiceStatus; } SERVICE_CONTROL_STATUS_REASON_OUT_PARAMS, *PSERVICE_CONTROL_STATUS_REASON_OUT_PARAMS; typedef [switch_type(DWORD)] union _SC_RPC_SERVICE_CONTROL_IN_PARAMSA { [case(1)] PSERVICE_CONTROL_STATUS_REASON_IN_PARAMSA psrInParams; } SC_RPC_SERVICE_CONTROL_IN_PARAMSA, *PSC_RPC_SERVICE_CONTROL_IN_PARAMSA; typedef [switch_type(DWORD)] union _SC_RPC_SERVICE_CONTROL_OUT_PARAMSA { [case(1)] PSERVICE_CONTROL_STATUS_REASON_OUT_PARAMS psrOutParams; } SC_RPC_SERVICE_CONTROL_OUT_PARAMSA, *PSC_RPC_SERVICE_CONTROL_OUT_PARAMSA; DWORD RControlServiceExA ( [in] SC_RPC_HANDLE hService, [in] DWORD dwControl, [in] DWORD dwInfoLevel, [in, switch_is(dwInfoLevel)] PSC_RPC_SERVICE_CONTROL_IN_PARAMSA pControlInParams, [out, switch_is(dwInfoLevel)] PSC_RPC_SERVICE_CONTROL_OUT_PARAMSA pControlOutParams ); typedef struct _SERVICE_CONTROL_STATUS_REASON_IN_PARAMSW { DWORD dwReason; [string,range(0, SC_MAX_COMMENT_LENGTH)] LPWSTR pszComment; } SERVICE_CONTROL_STATUS_REASON_IN_PARAMSW, *PSERVICE_CONTROL_STATUS_REASON_IN_PARAMSW; typedef [switch_type(DWORD)] union _SC_RPC_SERVICE_CONTROL_IN_PARAMSW { [case(1)] PSERVICE_CONTROL_STATUS_REASON_IN_PARAMSW psrInParams; } SC_RPC_SERVICE_CONTROL_IN_PARAMSW, *PSC_RPC_SERVICE_CONTROL_IN_PARAMSW; typedef [switch_type(DWORD)] union _SC_RPC_SERVICE_CONTROL_OUT_PARAMSW { [case(1)] PSERVICE_CONTROL_STATUS_REASON_OUT_PARAMS psrOutParams; } SC_RPC_SERVICE_CONTROL_OUT_PARAMSW, *PSC_RPC_SERVICE_CONTROL_OUT_PARAMSW; DWORD RControlServiceExW ( [in] SC_RPC_HANDLE hService, [in] DWORD dwControl, [in] DWORD dwInfoLevel, [in, switch_is(dwInfoLevel)] PSC_RPC_SERVICE_CONTROL_IN_PARAMSW pControlInParams, [out, switch_is(dwInfoLevel)] PSC_RPC_SERVICE_CONTROL_OUT_PARAMSW pControlOutParams ); void Opnum52NotUsedOnWire(void); void Opnum53NotUsedOnWire(void); void Opnum54NotUsedOnWire(void); void Opnum55NotUsedOnWire(void); DWORD RQueryServiceConfigEx ( [in] SC_RPC_HANDLE hService, [in] DWORD dwInfoLevel, [out] SC_RPC_CONFIG_INFOW * pInfo ); } void Opnum57NotUsedOnWire(void); void Opnum58NotUsedOnWire(void); void Opnum59NotUsedOnWire(void); DWORD RCreateWowService( [in] SC_RPC_HANDLE hSCManager, [in,string,range(0, SC_MAX_NAME_LENGTH)] wchar_t * lpServiceName, [in,string,unique,range(0, SC_MAX_NAME_LENGTH)] wchar_t * lpDisplayName, [in] DWORD dwDesiredAccess, [in] DWORD dwServiceType, [in] DWORD dwStartType, [in] DWORD dwErrorControl, [in,string,range(0, SC_MAX_PATH_LENGTH)] wchar_t * lpBinaryPathName, [in,string,unique,range(0, SC_MAX_NAME_LENGTH)] wchar_t * lpLoadOrderGroup, [in,out,unique] LPDWORD lpdwTagId, [in,unique,size_is(dwDependSize)] LPBYTE lpDependencies, [in, range (0, SC_MAX_DEPEND_SIZE)] DWORD dwDependSize, [in,string,unique,range(0, SC_MAX_ACCOUNT_NAME_LENGTH)] wchar_t * lpServiceStartName, [in,unique,size_is(dwPwSize)] LPBYTE lpPassword, [in, range(0, SC_MAX_PWD_SIZE)] DWORD dwPwSize, [in] USHORT dwServiceWowType, [out] LPSC_RPC_HANDLE lpServiceHandle ); void Opnum61NotUsedOnWire(void); void Opnum62NotUsedOnWire(void); void Opnum63NotUsedOnWire(void); DWORD ROpenSCManager2( [in] handle_t BindingHandle, [in,string,unique,range(0, SC_MAX_NAME_LENGTH)] wchar_t *DatabaseName, [in] DWORD DesiredAccess, [out] LPSC_RPC_HANDLE ScmHandle );