/* * Service Control Manager (SCM) interface definition */ //#include //#include #define BYTE unsigned char #define DWORD unsigned long #define BOOL unsigned long #define SC_HANDLE unsigned int #define SC_LOCK unsigned int #define SERVICE_STATUS_HANDLE unsigned long #define SC_STATUS_TYPE unsigned long #define SC_ENUM_TYPE unsigned long #define LPSTR char* #define LPCSTR char* #define LPWSTR wchar_t* #define LPCWSTR wchar_t* #define LPBYTE unsigned char* #define LPDWORD unsigned long* [ uuid(367abb81-9844-35f1-ad32-98f038001003), version(2.0), pointer_default(unique), explicit_handle ] interface svcctl { cpp_quote("#if 0") typedef struct _SERVICE_STATUS { DWORD dwServiceType; DWORD dwCurrentState; DWORD dwControlsAccepted; DWORD dwWin32ExitCode; DWORD dwServiceSpecificExitCode; DWORD dwCheckPoint; DWORD dwWaitHint; } SERVICE_STATUS, *LPSERVICE_STATUS; cpp_quote("#endif") /* Function 0 */ DWORD ScmrCloseServiceHandle([in] handle_t BindingHandle, [in] SC_HANDLE hSCObject); /* Function 1 */ BOOL ScmrControlService([in] handle_t BindingHandle, [in] SC_HANDLE hService, [in] DWORD dwControl, [out] LPSERVICE_STATUS lpServiceStatus); /* Function 2 */ DWORD ScmrDeleteService([in] handle_t BindingHandle, [in] SC_HANDLE hService); /* Function 3 */ DWORD ScmrLockServiceDatabase([in] handle_t BindingHandle, [in] SC_HANDLE hSCManager, [out] SC_LOCK *hLock); /* Function 4 */ DWORD ScmrQueryServiceObjectSecurity([in] handle_t BindingHandle, [in] SC_HANDLE hService, [in] DWORD dwSecurityInformation, [out, size_is(dwSecuityDescriptorSize)] unsigned char *lpSecurityDescriptor, [in] DWORD dwSecuityDescriptorSize, [out] LPDWORD pcbBytesNeeded); /* Function 5 */ DWORD ScmrSetServiceObjectSecurity([in] handle_t BindingHandle, [in] SC_HANDLE hService, [in] DWORD dwSecurityInformation, [in, size_is(dwSecuityDescriptorSize)] unsigned char *lpSecurityDescriptor, [in] DWORD dwSecuityDescriptorSize); /* Function 6 */ DWORD ScmrQueryServiceStatus([in] handle_t BindingHandle, [in] SC_HANDLE hSCManager, [out] LPSERVICE_STATUS lpServiceStatus); /* Function 7 */ DWORD ScmrSetServiceStatus([in] handle_t BindingHandle, [in] SERVICE_STATUS_HANDLE hServiceStatus); /* FIXME */ /* Function 8 */ DWORD ScmrUnlockServiceDatabase([in] handle_t BindingHandle, [in] SC_LOCK hLock); /* Function 9 */ DWORD ScmrNotifyBootConfigStatus([in] handle_t BindingHandle, [in] BOOL BootAcceptable); /* Function 10 */ DWORD ScmrSetServiceBitsW([in] handle_t BindingHandle, [in] SERVICE_STATUS_HANDLE hServiceStatus, [in] DWORD dwServiceBits, [in] BOOL bSetBitsOn, [in] BOOL bUpdateImmediately, [in, string, unique] LPWSTR lpString); /* Function 11 */ DWORD ScmrChangeServiceConfigW([in] handle_t BindingHandle, [in] SC_HANDLE hSCManager, [in] DWORD dwServiceType, [in] DWORD dwStartType, [in] DWORD dwErrorControl, [in, string, unique] LPCWSTR lpBinaryPathName, [in, string, unique] LPCWSTR lpLoadOrderGroup, [in, out, unique] LPDWORD lpdwTagId, [in, size_is(dwDependenciesLength), unique] LPCWSTR lpDependencies, [in] DWORD dwDependenciesLength, [in, string, unique] LPCWSTR lpServiceStartName, [in, size_is(dwPasswordLength), unique] LPCWSTR lpPassword, [in] DWORD dwPasswordLength, [in, string, unique] LPCWSTR lpDisplayName); /* Function 12 */ DWORD ScmrCreateServiceW([in] handle_t BindingHandle, [in] SC_HANDLE hSCManager, [in, string, ref] LPCWSTR lpServiceName, [in, string, unique] LPCWSTR lpDisplayName, [in] DWORD dwDesiredAccess, [in] DWORD dwServiceType, [in] DWORD dwStartType, [in] DWORD dwErrorControl, [in, string, ref] LPCWSTR lpBinaryPathName, [in, string, unique] LPCWSTR lpLoadOrderGroup, [in, out, unique] LPDWORD lpdwTagId, [in, size_is(dwDependenciesLength), unique] LPCWSTR lpDependencies, [in] DWORD dwDependenciesLength, [in, string, unique] LPCWSTR lpServiceStartName, [in, size_is(dwPasswordLength), unique] LPCWSTR lpPassword, [in] DWORD dwPasswordLength, [out] SC_HANDLE *hService); /* Function 13 */ DWORD ScmrEnumDependentServicesW([in] handle_t BindingHandle, [in] SC_HANDLE hService, [in] DWORD dwServiceState, [out, unique, size_is(cbBufSize)] LPBYTE lpServices, [in] DWORD cbBufSize, [out] LPDWORD pcbBytesNeeded, [out] LPDWORD lpServicesReturned); /* Function 14 */ DWORD ScmrEnumServicesStatusW([in] handle_t BindingHandle, [in] SC_HANDLE hSCManager, [in] DWORD dwServiceType, [in] DWORD dwServiceState, [out, unique, size_is(dwBufSize)] LPBYTE lpServices, [in] DWORD dwBufSize, [out] LPDWORD pcbBytesNeeded, [out] LPDWORD lpServicesReturned, [in, out, unique] LPDWORD lpResumeHandle); /* Function 15 */ DWORD ScmrOpenSCManagerW([in] handle_t BindingHandle, [in, string, unique] LPCWSTR lpMachineName, [in, string, unique] LPCWSTR lpDatabaseName, [in] DWORD dwDesiredAccess, [out] SC_HANDLE *hScm); /* Function 16 */ SC_HANDLE ScmrOpenServiceW([in] handle_t BindingHandle, [in] SC_HANDLE hSCManager, [in, string] LPCWSTR lpServiceName, [in] DWORD dwDesiredAccess, [out] SC_HANDLE *hScm); /* Function 17 */ DWORD ScmrQueryServiceConfigW([in] handle_t BindingHandle, [in] SC_HANDLE hService, [out, unique, size_is(cbBufSize)] LPBYTE lpServiceConfig, [in] DWORD cbBufSize, [out] LPDWORD pcbBytesNeeded); /* Function 18 */ DWORD ScmrQueryServiceLockStatusW([in] handle_t BindingHandle, [in] SC_HANDLE hSCManager, [out, unique, size_is(cbBufSize)] LPBYTE lpLockStatus, [in] DWORD cbBufSize, [out] LPDWORD pcbBytesNeeded); /* Function 19 */ DWORD ScmrStartServiceW([in] handle_t BindingHandle, [in] SC_HANDLE hService, [in] DWORD dwNumServiceArgs, [in, size_is(cbBufSize)] LPBYTE lpServiceArgBuffer, [in] DWORD cbBufSize); /* FIXME: This is the correct interface but WIDL doesn't support it yet! */ // DWORD ScmrStartServiceW([in] handle_t BindingHandle, // [in] SC_HANDLE hService, // [in] DWORD dwNumServiceArgs, // [in, string, size_is(dwNumServiceArgs, ), unique] LPWSTR *lpServiceArgVectors); /* Function 20 */ DWORD ScmrGetServiceDisplayNameW([in] handle_t BindingHandle, [in] SC_HANDLE hSCManager, [in, string, ref] LPCWSTR lpServiceName, [out, size_is(*lpcchBuffer), unique] LPWSTR lpDisplayName, [in, out, ref] LPDWORD lpcchBuffer); /* Function 21 */ DWORD ScmrGetServiceKeyNameW([in] handle_t BindingHandle, [in] SC_HANDLE hSCManager, [in, string, ref] LPCWSTR lpDisplayName, [out, size_is(*lpcchBuffer), unique] LPWSTR lpServiceName, [in, out, ref] LPDWORD lpcchBuffer); /* Function 22 */ DWORD ScmrSetServiceBitsA([in] handle_t BindingHandle, [in] SERVICE_STATUS_HANDLE hServiceStatus, [in] DWORD dwServiceBits, [in] BOOL bSetBitsOn, [in] BOOL bUpdateImmediately, [in, string, unique] LPSTR lpString); /* Function 23 */ DWORD ScmrChangeServiceConfigA([in] handle_t BindingHandle, [in] SC_HANDLE hSCManager, [in] DWORD dwServiceType, [in] DWORD dwStartType, [in] DWORD dwErrorControl, [in, string, unique] LPCSTR lpBinaryPathName, [in, string, unique] LPCSTR lpLoadOrderGroup, [in, out, unique] LPDWORD lpdwTagId, [in, size_is(dwDependenciesLength), unique] LPCSTR lpDependencies, [in] DWORD dwDependenciesLength, [in, string, unique] LPCSTR lpServiceStartName, [in, size_is(dwPasswordLength), unique] LPCSTR lpPassword, [in] DWORD dwPasswordLength, [in, string, unique] LPCSTR lpDisplayName); /* Function 24 */ DWORD ScmrCreateServiceA([in] handle_t BindingHandle, [in] SC_HANDLE hSCManager, [in, string, ref] LPCSTR lpServiceName, [in, string, unique] LPCSTR lpDisplayName, [in] DWORD dwDesiredAccess, [in] DWORD dwServiceType, [in] DWORD dwStartType, [in] DWORD dwErrorControl, [in, string, ref] LPCSTR lpBinaryPathName, [in, string, unique] LPCSTR lpLoadOrderGroup, [in, out, unique] LPDWORD lpdwTagId, [in, size_is(dwDependenciesLength), unique] LPCSTR lpDependencies, [in] DWORD dwDependenciesLength, [in, string, unique] LPCSTR lpServiceStartName, [in, size_is(dwPasswordLength), unique] LPCSTR lpPassword, [in] DWORD dwPasswordLength, [out] SC_HANDLE *hService); /* Function 25 */ DWORD ScmrEnumDependentServicesA([in] handle_t BindingHandle, [in] SC_HANDLE hService, [in] DWORD dwServiceState, [out, unique, size_is(cbBufSize)] LPBYTE lpServices, [in] DWORD cbBufSize, [out] LPDWORD pcbBytesNeeded, [out] LPDWORD lpServicesReturned); /* Function 26 */ DWORD ScmrEnumServicesStatusA([in] handle_t BindingHandle, [in] SC_HANDLE hSCManager, [in] DWORD dwServiceType, [in] DWORD dwServiceState, [out, unique, size_is(dwBufSize)] LPBYTE lpServices, [in] DWORD dwBufSize, [out] LPDWORD pcbBytesNeeded, [out] LPDWORD lpServicesReturned, [in, out, unique] LPDWORD lpResumeHandle); /* Function 27 */ DWORD ScmrOpenSCManagerA([in] handle_t BindingHandle, [in, string, unique] LPCSTR lpMachineName, [in, string, unique] LPCSTR lpDatabaseName, [in] DWORD dwDesiredAccess, [out] SC_HANDLE *hScm); /* Function 28 */ SC_HANDLE ScmrOpenServiceA([in] handle_t BindingHandle, [in] SC_HANDLE hSCManager, [in, string] LPCSTR lpServiceName, [in] DWORD dwDesiredAccess, [out] SC_HANDLE *hScm); /* Function 29 */ DWORD ScmrQueryServiceConfigA([in] handle_t BindingHandle, [in] SC_HANDLE hService, [out, unique, size_is(cbBufSize)] LPBYTE lpServiceConfig, [in] DWORD cbBufSize, [out] LPDWORD pcbBytesNeeded); /* Function 30 */ DWORD ScmrQueryServiceLockStatusA([in] handle_t BindingHandle, [in] SC_HANDLE hSCManager, [out, unique, size_is(cbBufSize)] LPBYTE lpLockStatus, [in] DWORD cbBufSize, [out] LPDWORD pcbBytesNeeded); /* Function 31 */ DWORD ScmrStartServiceA([in] handle_t BindingHandle, [in] SC_HANDLE hService, [in] DWORD dwNumServiceArgs, [in, size_is(cbBufSize)] LPBYTE lpServiceArgBuffer, [in] DWORD cbBufSize); /* FIXME: This is the correct interface but WIDL doesn't support it yet! */ // DWORD ScmrStartServiceA([in] handle_t BindingHandle, // [in] SC_HANDLE hService, // [in] DWORD dwNumServiceArgs, // [in, unique, string, size_is(dwNumServiceArgs, )] LPSTR *lpServiceArgVectors); /* Function 32 */ DWORD ScmrGetServiceDisplayNameA([in] handle_t BindingHandle, [in] SC_HANDLE hSCManager, [in, string, ref] LPCSTR lpServiceName, [out, unique, size_is(*lpcchBuffer)] LPSTR lpDisplayName, [in, out, ref] LPDWORD lpcchBuffer); /* Function 33 */ DWORD ScmrGetServiceKeyNameA([in] handle_t BindingHandle, [in] SC_HANDLE hSCManager, [in, string, ref] LPCSTR lpDisplayName, [out, unique, size_is(*lpcchBuffer)] LPSTR lpServiceName, [in, out, ref] LPDWORD lpcchBuffer); /* Function 34 */ DWORD ScmrGetCurrentGroupStateW([in] handle_t BindingHandle); /* FIXME */ /* Function 35 */ DWORD ScmrEnumServiceGroupW([in] handle_t BindingHandle); /* FIXME */ /* Function 36 */ DWORD ScmrChangeServiceConfig2A([in] handle_t BindingHandle, [in] SC_HANDLE hService, [in] DWORD dwInfoLevel, [in, size_is(dwInfoSize)] LPBYTE lpInfo, [in] DWORD dwInfoSize); /* Function 37 */ DWORD ScmrChangeServiceConfig2W([in] handle_t BindingHandle, [in] SC_HANDLE hService, [in] DWORD dwInfoLevel, [in, size_is(dwInfoSize)] LPBYTE lpInfo, [in] DWORD dwInfoSize); /* Function 38 */ DWORD ScmrQueryServiceConfig2A([in] handle_t BindingHandle, [in] SC_HANDLE hService, [in] DWORD dwInfoLevel, [out, unique, size_is(cbBufSize)] LPBYTE lpBuffer, [in] DWORD cbBufSize, [out] LPDWORD pcbBytesNeeded); /* Function 39 */ DWORD ScmrQueryServiceConfig2W([in] handle_t BindingHandle, [in] SC_HANDLE hService, [in] DWORD dwInfoLevel, [out, unique, size_is(cbBufSize)] LPBYTE lpBuffer, [in] DWORD cbBufSize, [out] LPDWORD pcbBytesNeeded); /* Function 40 */ DWORD ScmrQueryServiceStatusEx([in] handle_t BindingHandle, [in] SC_HANDLE hService, [in] SC_STATUS_TYPE InfoLevel, [out, unique, size_is(cbBufSize)] LPBYTE lpBuffer, [in] DWORD cbBufSize, [out] LPDWORD pcbBytesNeeded); /* Function 41 */ DWORD ScmrEnumServicesStatusExA([in] handle_t BindingHandle, [in] SC_HANDLE hService, [in] SC_ENUM_TYPE InfoLevel, [in] DWORD dwServiceType, [in] DWORD dwServiceState, [out, unique, size_is(cbBufSize)] LPBYTE lpServices, [in] DWORD cbBufSize, [out] LPDWORD pcbBytesNeeded, [out] LPDWORD lpServicesReturned, [in, out, unique] LPDWORD lpResumeHandle, [in, string] LPCSTR pszGroupName); /* Function 42 */ DWORD ScmrEnumServicesStatusExW([in] handle_t BindingHandle, [in] SC_HANDLE hService, [in] SC_ENUM_TYPE InfoLevel, [in] DWORD dwServiceType, [in] DWORD dwServiceState, [out, unique, size_is(cbBufSize)] LPBYTE lpServices, [in] DWORD cbBufSize, [out] LPDWORD pcbBytesNeeded, [out] LPDWORD lpServicesReturned, [in, out, unique] LPDWORD lpResumeHandle, [in, string] LPCWSTR pszGroupName); /* Function 43 */ /* ScmrSendTSMessage */ }