6 Appendix A: Full IDL

For ease of implementation, the full Interface Definition Language (IDL) is provided as follows, where "ms-dtyp.idl" is the IDL found in [MS-DTYP] Appendix A.

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