-/*\r
- * Service Control Manager (SCM) interface definition\r
- */\r
-\r
-//#include <windef.h>\r
-//#include <winsvc.h>\r
-\r
-#define BYTE unsigned char\r
-#define DWORD unsigned long\r
-#define BOOL unsigned long\r
-#define SC_HANDLE unsigned int\r
-#define SC_LOCK unsigned int\r
-#define SERVICE_STATUS_HANDLE unsigned long\r
-#define SC_STATUS_TYPE unsigned long\r
-#define SC_ENUM_TYPE unsigned long\r
-#define LPSTR char*\r
-#define LPCSTR char*\r
-#define LPWSTR wchar_t*\r
-#define LPCWSTR wchar_t*\r
-#define LPBYTE unsigned char*\r
-#define LPDWORD unsigned long*\r
-\r
-[\r
- uuid(367abb81-9844-35f1-ad32-98f038001003),\r
- version(2.0),\r
- pointer_default(unique),\r
- explicit_handle\r
-]\r
-interface svcctl\r
-{\r
-cpp_quote("#if 0")\r
- typedef struct _SERVICE_STATUS\r
- {\r
- DWORD dwServiceType;\r
- DWORD dwCurrentState;\r
- DWORD dwControlsAccepted;\r
- DWORD dwWin32ExitCode;\r
- DWORD dwServiceSpecificExitCode;\r
- DWORD dwCheckPoint;\r
- DWORD dwWaitHint;\r
- } SERVICE_STATUS, *LPSERVICE_STATUS;\r
-cpp_quote("#endif")\r
-\r
- /* Function 0 */\r
- DWORD ScmrCloseServiceHandle([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hSCObject);\r
-\r
- /* Function 1 */\r
- BOOL ScmrControlService([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hService,\r
- [in] DWORD dwControl,\r
- [out] LPSERVICE_STATUS lpServiceStatus);\r
-\r
- /* Function 2 */\r
- DWORD ScmrDeleteService([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hService);\r
-\r
- /* Function 3 */\r
- DWORD ScmrLockServiceDatabase([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hSCManager,\r
- [out] SC_LOCK *hLock);\r
-\r
- /* Function 4 */\r
- DWORD ScmrQueryServiceObjectSecurity([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hService,\r
- [in] DWORD dwSecurityInformation,\r
- [out, size_is(dwSecuityDescriptorSize)] unsigned char *lpSecurityDescriptor,\r
- [in] DWORD dwSecuityDescriptorSize,\r
- [out] LPDWORD pcbBytesNeeded);\r
-\r
- /* Function 5 */\r
- DWORD ScmrSetServiceObjectSecurity([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hService,\r
- [in] DWORD dwSecurityInformation,\r
- [in, size_is(dwSecuityDescriptorSize)] unsigned char *lpSecurityDescriptor,\r
- [in] DWORD dwSecuityDescriptorSize);\r
-\r
- /* Function 6 */\r
- DWORD ScmrQueryServiceStatus([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hSCManager,\r
- [out] LPSERVICE_STATUS lpServiceStatus);\r
-\r
- /* Function 7 */\r
- DWORD ScmrSetServiceStatus([in] handle_t BindingHandle,\r
- [in] SERVICE_STATUS_HANDLE hServiceStatus); /* FIXME */\r
-\r
- /* Function 8 */\r
- DWORD ScmrUnlockServiceDatabase([in] handle_t BindingHandle,\r
- [in] SC_LOCK hLock);\r
-\r
- /* Function 9 */\r
- DWORD ScmrNotifyBootConfigStatus([in] handle_t BindingHandle,\r
- [in] BOOL BootAcceptable);\r
-\r
- /* Function 10 */\r
- DWORD ScmrSetServiceBitsW([in] handle_t BindingHandle,\r
- [in] SERVICE_STATUS_HANDLE hServiceStatus,\r
- [in] DWORD dwServiceBits,\r
- [in] BOOL bSetBitsOn,\r
- [in] BOOL bUpdateImmediately,\r
- [in, string, unique] LPWSTR lpString);\r
-\r
- /* Function 11 */\r
- DWORD ScmrChangeServiceConfigW([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hSCManager,\r
- [in] DWORD dwServiceType,\r
- [in] DWORD dwStartType,\r
- [in] DWORD dwErrorControl,\r
- [in, string, unique] LPCWSTR lpBinaryPathName,\r
- [in, string, unique] LPCWSTR lpLoadOrderGroup,\r
- [in, out, unique] LPDWORD lpdwTagId,\r
- [in, size_is(dwDependenciesLength), unique] LPCWSTR lpDependencies,\r
- [in] DWORD dwDependenciesLength,\r
- [in, string, unique] LPCWSTR lpServiceStartName,\r
- [in, size_is(dwPasswordLength), unique] LPCWSTR lpPassword,\r
- [in] DWORD dwPasswordLength,\r
- [in, string, unique] LPCWSTR lpDisplayName);\r
-\r
- /* Function 12 */\r
- DWORD ScmrCreateServiceW([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hSCManager,\r
- [in, string, ref] LPCWSTR lpServiceName,\r
- [in, string, unique] LPCWSTR lpDisplayName,\r
- [in] DWORD dwDesiredAccess,\r
- [in] DWORD dwServiceType,\r
- [in] DWORD dwStartType,\r
- [in] DWORD dwErrorControl,\r
- [in, string, ref] LPCWSTR lpBinaryPathName,\r
- [in, string, unique] LPCWSTR lpLoadOrderGroup,\r
- [in, out, unique] LPDWORD lpdwTagId,\r
- [in, size_is(dwDependenciesLength), unique] LPCWSTR lpDependencies,\r
- [in] DWORD dwDependenciesLength,\r
- [in, string, unique] LPCWSTR lpServiceStartName,\r
- [in, size_is(dwPasswordLength), unique] LPCWSTR lpPassword,\r
- [in] DWORD dwPasswordLength,\r
- [out] SC_HANDLE *hService);\r
-\r
- /* Function 13 */\r
- DWORD ScmrEnumDependentServicesW([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hService,\r
- [in] DWORD dwServiceState,\r
- [out, unique, size_is(cbBufSize)] LPBYTE lpServices,\r
- [in] DWORD cbBufSize,\r
- [out] LPDWORD pcbBytesNeeded,\r
- [out] LPDWORD lpServicesReturned);\r
-\r
- /* Function 14 */\r
- DWORD ScmrEnumServicesStatusW([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hSCManager,\r
- [in] DWORD dwServiceType,\r
- [in] DWORD dwServiceState,\r
- [out, unique, size_is(dwBufSize)] LPBYTE lpServices,\r
- [in] DWORD dwBufSize,\r
- [out] LPDWORD pcbBytesNeeded,\r
- [out] LPDWORD lpServicesReturned,\r
- [in, out, unique] LPDWORD lpResumeHandle);\r
-\r
- /* Function 15 */\r
- DWORD ScmrOpenSCManagerW([in] handle_t BindingHandle,\r
- [in, string, unique] LPCWSTR lpMachineName,\r
- [in, string, unique] LPCWSTR lpDatabaseName,\r
- [in] DWORD dwDesiredAccess,\r
- [out] SC_HANDLE *hScm);\r
-\r
- /* Function 16 */\r
- SC_HANDLE ScmrOpenServiceW([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hSCManager,\r
- [in, string] LPCWSTR lpServiceName,\r
- [in] DWORD dwDesiredAccess,\r
- [out] SC_HANDLE *hScm);\r
-\r
- /* Function 17 */\r
- DWORD ScmrQueryServiceConfigW([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hService,\r
- [out, unique, size_is(cbBufSize)] LPBYTE lpServiceConfig,\r
- [in] DWORD cbBufSize,\r
- [out] LPDWORD pcbBytesNeeded);\r
-\r
- /* Function 18 */\r
- DWORD ScmrQueryServiceLockStatusW([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hSCManager,\r
- [out, unique, size_is(cbBufSize)] LPBYTE lpLockStatus,\r
- [in] DWORD cbBufSize,\r
- [out] LPDWORD pcbBytesNeeded);\r
-\r
- /* Function 19 */\r
- DWORD ScmrStartServiceW([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hService,\r
- [in] DWORD dwNumServiceArgs,\r
- [in, size_is(cbBufSize)] LPBYTE lpServiceArgBuffer,\r
- [in] DWORD cbBufSize);\r
-\r
- /* FIXME: This is the correct interface but WIDL doesn't support it yet! */\r
-// DWORD ScmrStartServiceW([in] handle_t BindingHandle,\r
-// [in] SC_HANDLE hService,\r
-// [in] DWORD dwNumServiceArgs,\r
-// [in, string, size_is(dwNumServiceArgs, ), unique] LPWSTR *lpServiceArgVectors);\r
-\r
- /* Function 20 */\r
- DWORD ScmrGetServiceDisplayNameW([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hSCManager,\r
- [in, string, ref] LPCWSTR lpServiceName,\r
- [out, size_is(*lpcchBuffer), unique] LPWSTR lpDisplayName,\r
- [in, out, ref] LPDWORD lpcchBuffer);\r
-\r
- /* Function 21 */\r
- DWORD ScmrGetServiceKeyNameW([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hSCManager,\r
- [in, string, ref] LPCWSTR lpDisplayName,\r
- [out, size_is(*lpcchBuffer), unique] LPWSTR lpServiceName,\r
- [in, out, ref] LPDWORD lpcchBuffer);\r
-\r
- /* Function 22 */\r
- DWORD ScmrSetServiceBitsA([in] handle_t BindingHandle,\r
- [in] SERVICE_STATUS_HANDLE hServiceStatus,\r
- [in] DWORD dwServiceBits,\r
- [in] BOOL bSetBitsOn,\r
- [in] BOOL bUpdateImmediately,\r
- [in, string, unique] LPSTR lpString);\r
-\r
- /* Function 23 */\r
- DWORD ScmrChangeServiceConfigA([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hSCManager,\r
- [in] DWORD dwServiceType,\r
- [in] DWORD dwStartType,\r
- [in] DWORD dwErrorControl,\r
- [in, string, unique] LPCSTR lpBinaryPathName,\r
- [in, string, unique] LPCSTR lpLoadOrderGroup,\r
- [in, out, unique] LPDWORD lpdwTagId,\r
- [in, size_is(dwDependenciesLength), unique] LPCSTR lpDependencies,\r
- [in] DWORD dwDependenciesLength,\r
- [in, string, unique] LPCSTR lpServiceStartName,\r
- [in, size_is(dwPasswordLength), unique] LPCSTR lpPassword,\r
- [in] DWORD dwPasswordLength,\r
- [in, string, unique] LPCSTR lpDisplayName);\r
-\r
- /* Function 24 */\r
- DWORD ScmrCreateServiceA([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hSCManager,\r
- [in, string, ref] LPCSTR lpServiceName,\r
- [in, string, unique] LPCSTR lpDisplayName,\r
- [in] DWORD dwDesiredAccess,\r
- [in] DWORD dwServiceType,\r
- [in] DWORD dwStartType,\r
- [in] DWORD dwErrorControl,\r
- [in, string, ref] LPCSTR lpBinaryPathName,\r
- [in, string, unique] LPCSTR lpLoadOrderGroup,\r
- [in, out, unique] LPDWORD lpdwTagId,\r
- [in, size_is(dwDependenciesLength), unique] LPCSTR lpDependencies,\r
- [in] DWORD dwDependenciesLength,\r
- [in, string, unique] LPCSTR lpServiceStartName,\r
- [in, size_is(dwPasswordLength), unique] LPCSTR lpPassword,\r
- [in] DWORD dwPasswordLength,\r
- [out] SC_HANDLE *hService);\r
-\r
- /* Function 25 */\r
- DWORD ScmrEnumDependentServicesA([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hService,\r
- [in] DWORD dwServiceState,\r
- [out, unique, size_is(cbBufSize)] LPBYTE lpServices,\r
- [in] DWORD cbBufSize,\r
- [out] LPDWORD pcbBytesNeeded,\r
- [out] LPDWORD lpServicesReturned);\r
-\r
- /* Function 26 */\r
- DWORD ScmrEnumServicesStatusA([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hSCManager,\r
- [in] DWORD dwServiceType,\r
- [in] DWORD dwServiceState,\r
- [out, unique, size_is(dwBufSize)] LPBYTE lpServices,\r
- [in] DWORD dwBufSize,\r
- [out] LPDWORD pcbBytesNeeded,\r
- [out] LPDWORD lpServicesReturned,\r
- [in, out, unique] LPDWORD lpResumeHandle);\r
-\r
- /* Function 27 */\r
- DWORD ScmrOpenSCManagerA([in] handle_t BindingHandle,\r
- [in, string, unique] LPCSTR lpMachineName,\r
- [in, string, unique] LPCSTR lpDatabaseName,\r
- [in] DWORD dwDesiredAccess,\r
- [out] SC_HANDLE *hScm);\r
-\r
- /* Function 28 */\r
- SC_HANDLE ScmrOpenServiceA([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hSCManager,\r
- [in, string] LPCSTR lpServiceName,\r
- [in] DWORD dwDesiredAccess,\r
- [out] SC_HANDLE *hScm);\r
-\r
- /* Function 29 */\r
- DWORD ScmrQueryServiceConfigA([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hService,\r
- [out, unique, size_is(cbBufSize)] LPBYTE lpServiceConfig,\r
- [in] DWORD cbBufSize,\r
- [out] LPDWORD pcbBytesNeeded);\r
-\r
- /* Function 30 */\r
- DWORD ScmrQueryServiceLockStatusA([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hSCManager,\r
- [out, unique, size_is(cbBufSize)] LPBYTE lpLockStatus,\r
- [in] DWORD cbBufSize,\r
- [out] LPDWORD pcbBytesNeeded);\r
-\r
- /* Function 31 */\r
- DWORD ScmrStartServiceA([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hService,\r
- [in] DWORD dwNumServiceArgs,\r
- [in, size_is(cbBufSize)] LPBYTE lpServiceArgBuffer,\r
- [in] DWORD cbBufSize);\r
-\r
- /* FIXME: This is the correct interface but WIDL doesn't support it yet! */\r
-// DWORD ScmrStartServiceA([in] handle_t BindingHandle,\r
-// [in] SC_HANDLE hService,\r
-// [in] DWORD dwNumServiceArgs,\r
-// [in, unique, string, size_is(dwNumServiceArgs, )] LPSTR *lpServiceArgVectors);\r
-\r
- /* Function 32 */\r
- DWORD ScmrGetServiceDisplayNameA([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hSCManager,\r
- [in, string, ref] LPCSTR lpServiceName,\r
- [out, unique, size_is(*lpcchBuffer)] LPSTR lpDisplayName,\r
- [in, out, ref] LPDWORD lpcchBuffer);\r
-\r
- /* Function 33 */\r
- DWORD ScmrGetServiceKeyNameA([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hSCManager,\r
- [in, string, ref] LPCSTR lpDisplayName,\r
- [out, unique, size_is(*lpcchBuffer)] LPSTR lpServiceName,\r
- [in, out, ref] LPDWORD lpcchBuffer);\r
-\r
- /* Function 34 */\r
- DWORD ScmrGetCurrentGroupStateW([in] handle_t BindingHandle); /* FIXME */\r
-\r
- /* Function 35 */\r
- DWORD ScmrEnumServiceGroupW([in] handle_t BindingHandle); /* FIXME */\r
-\r
- /* Function 36 */\r
- DWORD ScmrChangeServiceConfig2A([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hService,\r
- [in] DWORD dwInfoLevel,\r
- [in, size_is(dwInfoSize)] LPBYTE lpInfo,\r
- [in] DWORD dwInfoSize);\r
-\r
- /* Function 37 */\r
- DWORD ScmrChangeServiceConfig2W([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hService,\r
- [in] DWORD dwInfoLevel,\r
- [in, size_is(dwInfoSize)] LPBYTE lpInfo,\r
- [in] DWORD dwInfoSize);\r
-\r
- /* Function 38 */\r
- DWORD ScmrQueryServiceConfig2A([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hService,\r
- [in] DWORD dwInfoLevel,\r
- [out, unique, size_is(cbBufSize)] LPBYTE lpBuffer,\r
- [in] DWORD cbBufSize,\r
- [out] LPDWORD pcbBytesNeeded);\r
-\r
- /* Function 39 */\r
- DWORD ScmrQueryServiceConfig2W([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hService,\r
- [in] DWORD dwInfoLevel,\r
- [out, unique, size_is(cbBufSize)] LPBYTE lpBuffer,\r
- [in] DWORD cbBufSize,\r
- [out] LPDWORD pcbBytesNeeded);\r
-\r
- /* Function 40 */\r
- DWORD ScmrQueryServiceStatusEx([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hService,\r
- [in] SC_STATUS_TYPE InfoLevel,\r
- [out, unique, size_is(cbBufSize)] LPBYTE lpBuffer,\r
- [in] DWORD cbBufSize,\r
- [out] LPDWORD pcbBytesNeeded);\r
-\r
- /* Function 41 */\r
- DWORD ScmrEnumServicesStatusExA([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hService,\r
- [in] SC_ENUM_TYPE InfoLevel,\r
- [in] DWORD dwServiceType,\r
- [in] DWORD dwServiceState,\r
- [out, unique, size_is(cbBufSize)] LPBYTE lpServices,\r
- [in] DWORD cbBufSize,\r
- [out] LPDWORD pcbBytesNeeded,\r
- [out] LPDWORD lpServicesReturned,\r
- [in, out, unique] LPDWORD lpResumeHandle,\r
- [in, string, unique] LPCSTR pszGroupName);\r
-\r
- /* Function 42 */\r
- DWORD ScmrEnumServicesStatusExW([in] handle_t BindingHandle,\r
- [in] SC_HANDLE hService,\r
- [in] SC_ENUM_TYPE InfoLevel,\r
- [in] DWORD dwServiceType,\r
- [in] DWORD dwServiceState,\r
- [out, unique, size_is(cbBufSize)] LPBYTE lpServices,\r
- [in] DWORD cbBufSize,\r
- [out] LPDWORD pcbBytesNeeded,\r
- [out] LPDWORD lpServicesReturned,\r
- [in, out, unique] LPDWORD lpResumeHandle,\r
- [in, string, unique] LPCWSTR pszGroupName);\r
-\r
- /* Function 43 */\r
- /* ScmrSendTSMessage */\r
-}\r
+/*
+ * Service Control Manager (SCM) interface definition
+ */
+
+#include "include/reactos/idl/wtypes.idl"
+
+const unsigned int MAX_SERVICE_NAME_LENGTH = 255;
+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 unsigned long SECURITY_INFORMATION;
+typedef [handle] LPSTR SVCCTL_HANDLEA;
+typedef [handle] LPWSTR SVCCTL_HANDLEW;
+typedef [context_handle] unsigned long SC_RPC_HANDLE;
+typedef SC_RPC_HANDLE* LPSC_RPC_HANDLE;
+typedef [context_handle] PVOID SC_RPC_LOCK;
+typedef SC_RPC_LOCK* LPSC_RPC_LOCK;
+typedef [context_handle] unsigned long SC_NOTIFY_RPC_HANDLE;
+typedef SC_NOTIFY_RPC_HANDLE* LPSC_NOTIFY_RPC_HANDLE;
+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_4K* LPBOUNDED_DWORD_8K;
+typedef [range(0, 1024 * 256)] DWORD BOUNDED_DWORD_256K;
+typedef BOUNDED_DWORD_4K* LPBOUNDED_DWORD_256K;
+
+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;
+
+typedef struct _SERVICE_STATUS_PROCESS {
+ 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 _ENUM_SERVICE_STATUSA {
+ [string, range(0, 8 * 1024)] LPSTR lpServiceName;
+ [string, range(0, 8 * 1024)] LPSTR lpDisplayName;
+ SERVICE_STATUS ServiceStatus;
+} ENUM_SERVICE_STATUSA, *LPENUM_SERVICE_STATUSA;
+
+typedef struct _ENUM_SERVICE_STATUSW {
+ [string, range(0, 8 * 1024)] LPWSTR lpServiceName;
+ [string, range(0, 8 * 1024)] LPWSTR lpDisplayName;
+ SERVICE_STATUS ServiceStatus;
+} ENUM_SERVICE_STATUSW, *LPENUM_SERVICE_STATUSW;
+
+typedef struct _ENUM_SERVICE_STATUS_PROCESSA {
+ [string, range(0, 8 * 1024)] LPSTR lpServiceName;
+ [string, range(0, 8 * 1024)] LPSTR lpDisplayName;
+ SERVICE_STATUS_PROCESS ServiceStatusProcess;
+} ENUM_SERVICE_STATUS_PROCESSA, *LPENUM_SERVICE_STATUS_PROCESSA;
+
+typedef struct _ENUM_SERVICE_STATUS_PROCESSW {
+ [string, range(0, 8 * 1024)] LPWSTR lpServiceName;
+ [string, range(0, 8 * 1024)] LPWSTR lpDisplayName;
+ SERVICE_STATUS_PROCESS ServiceStatusProcess;
+} ENUM_SERVICE_STATUS_PROCESSW, *LPENUM_SERVICE_STATUS_PROCESSW;
+
+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;
+ LPSTR lpDisplayName;
+} QUERY_SERVICE_CONFIGA, *LPQUERY_SERVICE_CONFIGA;
+
+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;
+ LPWSTR lpDisplayName;
+} QUERY_SERVICE_CONFIGW, *LPQUERY_SERVICE_CONFIGW;
+
+typedef struct _QUERY_SERVICE_LOCK_STATUSA {
+ DWORD fIsLocked;
+ [string, range(0, 8 * 1024)] LPSTR lpLockOwner;
+ DWORD dwLockDuration;
+} QUERY_SERVICE_LOCK_STATUSA, *LPQUERY_SERVICE_LOCK_STATUSA;
+
+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 [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 {
+ SC_ACTION_TYPE Type;
+ DWORD Delay;
+} SC_ACTION, *LPSC_ACTION;
+
+typedef [v1_enum] enum _SC_ENUM_TYPE {
+ SC_ENUM_PROCESS_INFO = 0,
+} SC_ENUM_TYPE;
+
+typedef struct _SERVICE_DESCRIPTIONA {
+ [string, range(0, 8 * 1024)] LPSTR lpDescription;
+} SERVICE_DESCRIPTIONA, *LPSERVICE_DESCRIPTIONA;
+
+typedef struct _SERVICE_DESCRIPTIONW {
+ [string, range(0, 8 * 1024)] LPWSTR lpDescription;
+} SERVICE_DESCRIPTIONW, *LPSERVICE_DESCRIPTIONW;
+
+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_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;
+
+cpp_quote("#endif")
+
+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 dwServicesSidType;
+} SERVICE_SID_INFO, *LPSERVICE_SID_INFO;
+
+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 _SERVICE_PRESHUTDOWN_INFO {
+ DWORD dwPreshutdownTimeout;
+} SERVICE_PRESHUTDOWN_INFO, *LPSERVICE_PRESHUTDOWN_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;;
+ };
+} SC_RPC_CONFIG_INFOA, *LPSC_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;
+ };
+} SC_RPC_CONFIG_INFOW, *LPSC_RPC_CONFIG_INFOW;
+
+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 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 pStatusChangeParam2;
+ };
+} SC_RPC_NOTIFY_PARAMS, *LPSC_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;
+
+cpp_quote("#if 0")
+
+#if 0
+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, *LPSC_RPC_SERVICE_CONTROL_IN_PARAMSA;
+
+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, *LPSC_RPC_SERVICE_CONTROL_IN_PARAMSW;
+
+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, *LPSC_RPC_SERVICE_CONTROL_OUT_PARAMSA;
+
+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, *LPSC_RPC_SERVICE_CONTROL_OUT_PARAMSW;
+#endif
+
+typedef [v1_enum] enum _SC_STATUS_TYPE {
+ SC_STATUS_PROCESS_INFO = 0,
+} SC_STATUS_TYPE;
+
+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, *LPSERVICE_CONTROL_STATUS_REASON_IN_PARAMSA;
+
+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, *LPSERVICE_CONTROL_STATUS_REASON_IN_PARAMSW;
+
+typedef struct _SERVICE_CONTROL_STATUS_REASON_OUT_PARAMS {
+ SERVICE_STATUS_PROCESS ServiceStatus;
+} SERVICE_CONTROL_STATUS_REASON_OUT_PARAMS, *LPSERVICE_CONTROL_STATUS_REASON_OUT_PARAMS;
+
+typedef SERVICE_NOTIFY_STATUS_CHANGE_PARAMS_2 SERVICE_NOTIFY_STATUS_CHANGE_PARAMS, *LPSERVICE_NOTIFY_STATUS_CHANGE_PARAMS;
+
+cpp_quote("#endif")
+
+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)] LPWSTR StringPtr;
+} STRING_PTRSW, *PSTRING_PTRSW, *LPSTRING_PTRSW;
+
+[
+ uuid(367abb81-9844-35f1-ad32-98f038001003),
+ version(2.0),
+ pointer_default(unique),
+ #ifndef __midl
+ ,explicit_handle
+ #endif
+]
+interface svcctl
+{
+ /* Function 0 */
+ DWORD RCloseServiceHandle(
+ [in] handle_t BindingHandle,
+ [in, out] LPSC_RPC_HANDLE hSCObject);
+
+ /* Function 1 */
+ DWORD RControlService(
+ [in] handle_t BindingHandle,
+ [in] SC_RPC_HANDLE hService,
+ [in] DWORD dwControl,
+ [out] LPSERVICE_STATUS lpServiceStatus);
+
+ /* Function 2 */
+ DWORD RDeleteService(
+ [in] handle_t BindingHandle,
+ [in] SC_RPC_HANDLE hService);
+
+ /* Function 3 */
+ DWORD RLockServiceDatabase(
+ [in] handle_t BindingHandle,
+ [in] SC_RPC_HANDLE hSCManager,
+ [out] LPSC_RPC_LOCK lpLock);
+
+ /* Function 4 */
+ DWORD RQueryServiceObjectSecurity(
+ [in] handle_t BindingHandle,
+ [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);
+
+ /* Function 5 */
+ DWORD RSetServiceObjectSecurity(
+ [in] handle_t BindingHandle,
+ [in] SC_RPC_HANDLE hService,
+ [in] DWORD dwSecurityInformation,
+ [in, size_is(dwSecuityDescriptorSize)] LPBYTE lpSecurityDescriptor,
+ [in] DWORD dwSecuityDescriptorSize);
+
+ /* Function 6 */
+ DWORD RQueryServiceStatus(
+ [in] handle_t BindingHandle,
+ [in] SC_RPC_HANDLE hService,
+ [out] LPSERVICE_STATUS lpServiceStatus);
+
+ /* Function 7 */
+ DWORD RSetServiceStatus(
+ [in] handle_t BindingHandle,
+ [in] SC_RPC_HANDLE hServiceStatus,
+ [in] LPSERVICE_STATUS lpServiceStatus);
+
+ /* Function 8 */
+ DWORD RUnlockServiceDatabase(
+ [in] handle_t BindingHandle,
+ [in, out] LPSC_RPC_LOCK Lock);
+
+ /* Function 9 */
+ DWORD RNotifyBootConfigStatus(
+ [in] handle_t BindingHandle,
+ [in, string, unique, range(0, SC_MAX_COMPUTER_NAME_LENGTH)] SVCCTL_HANDLEW lpMachineName,
+ [in] DWORD BootAcceptable);
+
+ /* Function 10 */
+ DWORD RSetServiceBitsW(
+ [in] handle_t BindingHandle,
+ [in] SC_RPC_HANDLE hServiceStatus,
+ [in] DWORD dwServiceBits,
+ [in] BOOL bSetBitsOn,
+ [in] BOOL bUpdateImmediately,
+ [in, string, unique] LPWSTR lpString);
+
+ /* Function 11 */
+ DWORD RChangeServiceConfigW(
+ [in] handle_t BindingHandle,
+ [in] SC_RPC_HANDLE hService,
+ [in] DWORD dwServiceType,
+ [in] DWORD dwStartType,
+ [in] DWORD dwErrorControl,
+ [in, string, unique, range(0, SC_MAX_PATH_LENGTH)] LPWSTR lpBinaryPathName,
+ [in, string, unique, range(0, SC_MAX_PATH_LENGTH)] LPWSTR 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)] LPWSTR 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)] LPWSTR lpDisplayName);
+
+ /* Function 12 */
+ DWORD RCreateServiceW(
+ [in] handle_t BindingHandle,
+ [in] SC_RPC_HANDLE hSCManager,
+ [in, string, range(0, SC_MAX_NAME_LENGTH)] LPWSTR lpServiceName,
+ [in, string, unique, range(0, SC_MAX_NAME_LENGTH)] LPWSTR lpDisplayName,
+ [in] DWORD dwDesiredAccess,
+ [in] DWORD dwServiceType,
+ [in] DWORD dwStartType,
+ [in] DWORD dwErrorControl,
+ [in, string, range(0, SC_MAX_PATH_LENGTH)] LPWSTR lpBinaryPathName,
+ [in, string, unique, range(0, SC_MAX_NAME_LENGTH)] LPWSTR 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)] LPWSTR lpServiceStartName,
+ [in, unique, size_is(dwPwSize)] LPBYTE lpPassword,
+ [in, range(0, SC_MAX_PWD_SIZE)] DWORD dwPwSize,
+ [out] LPSC_RPC_HANDLE lpServiceHandle);
+
+ /* Function 13 */
+ DWORD REnumDependentServicesW(
+ [in] handle_t BindingHandle,
+ [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);
+
+ /* Function 14 */
+ DWORD REnumServicesStatusW(
+ [in] handle_t BindingHandle,
+ [in] SC_RPC_HANDLE hSCManager,
+ [in] DWORD dwServiceType,
+ [in] DWORD dwServiceState,
+ [out, size_is(dwBufSize)] LPBYTE lpBuffer,
+ [in, range(0, 1024*256)] DWORD dwBufSize,
+ [out] LPBOUNDED_DWORD_256K pcbBytesNeeded,
+ [out] LPBOUNDED_DWORD_256K lpServicesReturned,
+ [in, out, unique] LPBOUNDED_DWORD_256K lpResumeHandle);
+
+ /* Function 15 */
+ DWORD ROpenSCManagerW(
+ [in] handle_t BindingHandle,
+ [in, string, unique, range(0, SC_MAX_COMPUTER_NAME_LENGTH)] LPWSTR lpMachineName,
+ [in, string, unique, range(0, SC_MAX_NAME_LENGTH)] LPWSTR lpDatabaseName,
+ [in] DWORD dwDesiredAccess,
+ [out] LPSC_RPC_HANDLE lpScHandle);
+
+ /* Function 16 */
+ DWORD ROpenServiceW(
+ [in] handle_t BindingHandle,
+ [in] SC_RPC_HANDLE hSCManager,
+ [in, string, range(0, SC_MAX_NAME_LENGTH)] LPWSTR lpServiceName,
+ [in] DWORD dwDesiredAccess,
+ [out] LPSC_RPC_HANDLE lpServiceHandle);
+
+ /* Function 17 */
+ DWORD RQueryServiceConfigW(
+ [in] handle_t BindingHandle,
+ [in] SC_RPC_HANDLE hService,
+ [out, unique, size_is(cbBufSize)] LPBYTE lpServiceConfig,
+ /* FIXME: should be [out] LPQUERY_SERVICE_CONFIGW lpServiceConfig, */
+ [in, range(0, 1024*8)] DWORD cbBufSize,
+ [out] LPBOUNDED_DWORD_8K pcbBytesNeeded);
+
+ /* Function 18 */
+ DWORD RQueryServiceLockStatusW(
+ [in] handle_t BindingHandle,
+ [in] SC_RPC_HANDLE hSCManager,
+ [out] LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus,
+ [in, range(0, 1024*4)] DWORD cbBufSize,
+ [out] LPBOUNDED_DWORD_4K pcbBytesNeeded);
+
+ /* Function 19 */
+ DWORD RStartServiceW(
+ [in] handle_t BindingHandle,
+ [in] SC_RPC_HANDLE hService,
+ [in, range(0, SC_MAX_ARGUMENTS)] DWORD argc,
+ [in, unique, size_is(argc)] LPSTRING_PTRSW argv);
+
+ /* Function 20 */
+ DWORD RGetServiceDisplayNameW(
+ [in] handle_t BindingHandle,
+ [in] SC_RPC_HANDLE hSCManager,
+ [in, string, range(0, SC_MAX_NAME_LENGTH)] LPWSTR lpServiceName,
+ [out, string, range(1, 4*1024+1), size_is(*lpcchBuffer + 1)] LPWSTR lpDisplayName,
+ [in, out] DWORD* lpcchBuffer);
+
+ /* Function 21 */
+ DWORD RGetServiceKeyNameW(
+ [in] handle_t BindingHandle,
+ [in] SC_RPC_HANDLE hSCManager,
+ [in, string, range(0, SC_MAX_NAME_LENGTH)] LPWSTR lpDisplayName,
+ [out, string, range(1, 4*1024+1), size_is(*lpcchBuffer + 1)] LPWSTR lpServiceName,
+ [in, out] DWORD* lpcchBuffer);
+
+ /* Function 22 */
+ DWORD RSetServiceBitsA(
+ [in] handle_t BindingHandle,
+ [in] SC_RPC_HANDLE hServiceStatus,
+ [in] DWORD dwServiceBits,
+ [in] BOOL bSetBitsOn,
+ [in] BOOL bUpdateImmediately,
+ [in, string, unique] LPSTR lpString);
+
+ /* Function 23 */
+ DWORD RChangeServiceConfigA(
+ [in] handle_t BindingHandle,
+ [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)] LPSTR 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);
+
+ /* Function 24 */
+ DWORD RCreateServiceA(
+ [in] handle_t BindingHandle,
+ [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);
+
+ /* Function 25 */
+ DWORD REnumDependentServicesA(
+ [in] handle_t BindingHandle,
+ [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);
+
+ /* Function 26 */
+ DWORD REnumServicesStatusA(
+ [in] handle_t BindingHandle,
+ [in] SC_RPC_HANDLE hSCManager,
+ [in] DWORD dwServiceType,
+ [in] DWORD dwServiceState,
+ [out, size_is(dwBufSize)] LPBYTE lpBuffer,
+ [in, range(0, 1024*256)] DWORD dwBufSize,
+ [out] LPBOUNDED_DWORD_256K pcbBytesNeeded,
+ [out] LPBOUNDED_DWORD_256K lpServicesReturned,
+ [in, out, unique] LPBOUNDED_DWORD_256K lpResumeHandle);
+
+ /* Function 27 */
+ DWORD ROpenSCManagerA(
+ [in] handle_t BindingHandle,
+ [in, string, unique, range(0, SC_MAX_COMPUTER_NAME_LENGTH)] LPSTR lpMachineName,
+ [in, string, unique, range(0, SC_MAX_NAME_LENGTH)] LPSTR lpDatabaseName,
+ [in] DWORD dwDesiredAccess,
+ [out] LPSC_RPC_HANDLE lpScHandle);
+
+ /* Function 28 */
+ DWORD ROpenServiceA(
+ [in] handle_t BindingHandle,
+ [in] SC_RPC_HANDLE hSCManager,
+ [in, string, range(0, SC_MAX_NAME_LENGTH)] LPSTR lpServiceName,
+ [in] DWORD dwDesiredAccess,
+ [out] LPSC_RPC_HANDLE lpServiceHandle);
+
+ /* Function 29 */
+ DWORD RQueryServiceConfigA(
+ [in] handle_t BindingHandle,
+ [in] SC_RPC_HANDLE hService,
+ [out] LPQUERY_SERVICE_CONFIGA lpServiceConfig,
+ [in, range(0, 1024*8)] DWORD cbBufSize,
+ [out] LPBOUNDED_DWORD_8K pcbBytesNeeded);
+
+ /* Function 30 */
+ DWORD RQueryServiceLockStatusA(
+ [in] handle_t BindingHandle,
+ [in] SC_RPC_HANDLE hSCManager,
+ [out] LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus,
+ [in, range(0, 1024*4)] DWORD cbBufSize,
+ [out] LPBOUNDED_DWORD_4K pcbBytesNeeded);
+
+ /* Function 31 */
+ DWORD RStartServiceA(
+ [in] handle_t BindingHandle,
+ [in] SC_RPC_HANDLE hService,
+ [in, range(0, SC_MAX_ARGUMENTS)] DWORD argc,
+ [in, unique, size_is(argc)] LPSTRING_PTRSA argv);
+
+ /* Function 32 */
+ DWORD RGetServiceDisplayNameA(
+ [in] handle_t BindingHandle,
+ [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);
+
+ /* Function 33 */
+ DWORD RGetServiceKeyNameA(
+ [in] handle_t BindingHandle,
+ [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);
+
+ /* Function 34 */
+ DWORD RGetCurrentGroupStateW(
+ [in] handle_t BindingHandle); /* FIXME */
+
+ /* Function 35 */
+ DWORD REnumServiceGroupW(
+ [in] handle_t BindingHandle,
+ [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);
+
+ /* Function 36 */
+ DWORD RChangeServiceConfig2A(
+ [in] handle_t BindingHandle,
+ [in] SC_RPC_HANDLE hService,
+ [in] SC_RPC_CONFIG_INFOA Info);
+
+ /* Function 37 */
+ DWORD RChangeServiceConfig2W(
+ [in] handle_t BindingHandle,
+ [in] SC_RPC_HANDLE hService,
+ [in] SC_RPC_CONFIG_INFOW Info);
+
+ /* Function 38 */
+ DWORD RQueryServiceConfig2A(
+ [in] handle_t BindingHandle,
+ [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);
+
+ /* Function 39 */
+ DWORD RQueryServiceConfig2W(
+ [in] handle_t BindingHandle,
+ [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);
+
+ /* Function 40 */
+ DWORD RQueryServiceStatusEx(
+ [in] handle_t BindingHandle,
+ [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);
+
+ /* Function 41 */
+ DWORD REnumServicesStatusExA(
+ [in] handle_t BindingHandle,
+ [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);
+
+ /* Function 42 */
+ DWORD REnumServicesStatusExW(
+ [in] handle_t BindingHandle,
+ [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);
+
+ /* Function 43 */
+ DWORD RSendTSMessage(
+ [in] handle_t BindingHandle); /* FIXME */
+
+ /* Function 44 */
+ DWORD RCreateServiceWOW64A(
+ [in] handle_t BindingHandle,
+ [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);
+
+ /* Function 45 */
+ DWORD RCreateServiceWOW64W(
+ [in] handle_t BindingHandle,
+ [in, string, range(0, SC_MAX_NAME_LENGTH)] LPWSTR lpServiceName,
+ [in, string, unique, range(0, SC_MAX_NAME_LENGTH)] LPWSTR lpDisplayName,
+ [in] DWORD dwDesiredAccess,
+ [in] DWORD dwServiceType,
+ [in] DWORD dwStartType,
+ [in] DWORD dwErrorControl,
+ [in, string, range(0, SC_MAX_PATH_LENGTH)] LPWSTR lpBinaryPathName,
+ [in, string, unique, range(0, SC_MAX_NAME_LENGTH)] LPWSTR 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)] LPWSTR lpServiceStartName,
+ [in, unique, size_is(dwPwSize)] LPBYTE lpPassword,
+ [in, range(0, SC_MAX_PWD_SIZE)] DWORD dwPwSize,
+ [out] LPSC_RPC_HANDLE lpServiceHandle);
+
+ /* Function 46 */
+ DWORD RQueryServiceTagInfo(
+ [in] handle_t BindingHandle); /* FIXME */
+
+ /* Function 47 */
+ DWORD RNotifyServiceStatusChange(
+ [in] handle_t BindingHandle,
+ [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);
+
+ /* Function 48 */
+ DWORD RGetNotifyResults(
+ [in] handle_t BindingHandle,
+ [in] SC_NOTIFY_RPC_HANDLE hNotify,
+ [out] PSC_RPC_NOTIFY_PARAMS_LIST *ppNotifyParams);
+
+ /* Function 49 */
+ DWORD RCloseNotifyHandle(
+ [in] handle_t BindingHandle,
+ [in, out] LPSC_NOTIFY_RPC_HANDLE phNotify,
+ [out] PBOOL pfApcFired);
+
+ /* Function 50 */
+ DWORD RControlServiceExA(
+ [in] handle_t BindingHandle,
+ [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_IN_PARAMSA pControlOutParams*/);
+
+ /* Function 51 */
+ DWORD RControlServiceExW(
+ [in] handle_t BindingHandle,
+ [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_IN_PARAMSW pControlOutParams*/);
+
+ /* Function 52 */
+ DWORD RSendPnPMessage(
+ [in] handle_t BindingHandle); /* FIXME */
+
+ /* Function 53 */
+ DWORD RValidatePnPService(
+ [in] handle_t BindingHandle); /* FIXME */
+
+ /* Function 54 */
+ DWORD ROpenServiceStatusHandle(
+ [in] handle_t BindingHandle); /* FIXME */
+
+ /* Function 55 */
+ DWORD RFunction55(
+ [in] handle_t BindingHandle); /* FIXME */
+}