Don't terminate a cpp_quote statement with a semicolon. New versions of WIDL will...
[reactos.git] / reactos / include / reactos / idl / svcctl.idl
index bf5d37a..dec5d70 100644 (file)
-/*\r
- * Service Control Manager (SCM) interface definition\r
- */\r
-\r
-//#include <windef.h>\r
-//#include <winsvc.h>\r
-#include "include/reactos/idl/wtypes.idl"\r
-\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
-\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
-  DWORD ScmrControlService([in] handle_t BindingHandle,\r
-                           [in] SC_HANDLE hService,\r
-                           [in] DWORD dwControl,\r
-                           [out] SERVICE_STATUS *lpServiceStatus);\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] SERVICE_STATUS *lpServiceStatus);\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
-  DWORD 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 */
+}