6.1 Appendix A.1: clusapi2.idl

 import "ms-dtyp.idl";
  
  [
      uuid(b97db8b2-4c63-11cf-bff6-08002be23f2f), 
     version(2.0)
  ]
  interface clusapi
  {
  
  typedef [context_handle] void *HCLUSTER_RPC;
  typedef [context_handle] void *HNODE_RPC;
  typedef [context_handle] void *HGROUP_RPC;
  typedef [context_handle] void *HRES_RPC;
  typedef [context_handle] void *HKEY_RPC;
  typedef [context_handle] void *HNOTIFY_RPC;
  typedef [context_handle] void *HNETWORK_RPC;
  typedef [context_handle] void *HNETINTERFACE_RPC;
  
  
  typedef struct _RPC_SECURITY_DESCRIPTOR {
      [ size_is( cbInSecurityDescriptor ),
        length_is( cbOutSecurityDescriptor ) ]
        unsigned char *lpSecurityDescriptor;
      unsigned long cbInSecurityDescriptor;
      unsigned long cbOutSecurityDescriptor;
  } RPC_SECURITY_DESCRIPTOR, *PRPC_SECURITY_DESCRIPTOR;
  
  
  typedef struct _RPC_SECURITY_ATTRIBUTES {
      unsigned long nLength;
      RPC_SECURITY_DESCRIPTOR RpcSecurityDescriptor;
      long bInheritHandle;
  } RPC_SECURITY_ATTRIBUTES, *PRPC_SECURITY_ATTRIBUTES;
  
  
  typedef struct _CLUSTER_OPERATIONAL_VERSION_INFO {
      unsigned long dwSize;
      unsigned long dwClusterHighestVersion;
      unsigned long dwClusterLowestVersion;
      unsigned long dwFlags;
      unsigned long dwReserved;
  }CLUSTER_OPERATIONAL_VERSION_INFO,*PCLUSTER_OPERATIONAL_VERSION_INFO;
  
  
  
  
  HCLUSTER_RPC
  ApiOpenCluster(
      [ out ] error_status_t *Status
      );
  
  error_status_t
  ApiCloseCluster(
      [ in, out ] HCLUSTER_RPC *Cluster
      );
  
  error_status_t 
  ApiSetClusterName(
      [in, string] LPCWSTR NewClusterName
      );
  
  error_status_t
  ApiGetClusterName(
      [ out ] [ string ] LPWSTR *ClusterName,
      [ out ] [ string ] LPWSTR *NodeName
      );
  
  error_status_t
  ApiGetClusterVersion(
      [out] WORD* lpwMajorVersion,
      [out] WORD* lpwMinorVersion,
      [out] WORD* lpwBuildNumber,
      [out, string]  LPWSTR* lpszVendorId,
      [out, string]  LPWSTR* lpszCSDVersion
      );
  
  error_status_t
  ApiGetQuorumResource(
      [ out, string ] LPWSTR *lpszResourceName,
      [ out, string ] LPWSTR *lpszDeviceName,
      [ out ] DWORD *pdwMaxQuorumLogSize
      );
  
  error_status_t
  ApiSetQuorumResource(
      [ in ] HRES_RPC hResource,
      [ in, string ] LPCWSTR  lpszDeviceName,
      [ in ] DWORD    dwMaxQuorumLogSize
      );    
  
  
  typedef struct _ENUM_ENTRY {
      DWORD Type;
      [string] LPWSTR Name;
  } ENUM_ENTRY, *PENUM_ENTRY;
  
  typedef struct _ENUM_LIST {
      DWORD EntryCount;
      [size_is(EntryCount)] ENUM_ENTRY Entry[*];
  } ENUM_LIST, *PENUM_LIST;
  
  error_status_t
  ApiCreateEnum(
      [ in ] DWORD dwType,
      [ out ] PENUM_LIST *ReturnEnum
      );
  
  
  HRES_RPC
  ApiOpenResource(
      [in, string]  LPCWSTR lpszResourceName,
      [out] error_status_t *Status
      );
  
  HRES_RPC
  ApiCreateResource(
      [in] HGROUP_RPC hGroup,
      [in, string] LPCWSTR lpszResourceName,
      [in, string] LPCWSTR lpszResourceType,
      [in] DWORD dwFlags,
      [out] error_status_t *Status
      );
      
  error_status_t
  ApiDeleteResource(
      [in] HRES_RPC hResource
      );
      
  error_status_t
  ApiCloseResource(
      [ in, out ] HRES_RPC *Resource
      );
  
  error_status_t
  ApiGetResourceState(
      [in] HRES_RPC hResource,
      [out] DWORD *State,
      [out, string] LPWSTR *NodeName,
      [out, string] LPWSTR *GroupName
      );
  
  error_status_t 
  ApiSetResourceName(
      [in] HRES_RPC hResource,
      [in, string] LPCWSTR lpszResourceName
      );
  
  error_status_t
  ApiGetResourceId(
      [in] HRES_RPC hResource,
      [out, string] LPWSTR* pGuid
      );
  
  error_status_t
  ApiGetResourceType(
      [ in ] HRES_RPC hResource,
      [ out, string ] LPWSTR* lpszResourceType
      );
  
  error_status_t 
 ApiFailResource(
      [in] HRES_RPC hResource
      );
  
  error_status_t
  ApiOnlineResource(
      [ in ] HRES_RPC hResource
      );
  
  error_status_t
  ApiOfflineResource(
      [ in ] HRES_RPC hResource
      );
  
  error_status_t
  ApiAddResourceDependency(
      [ in ] HRES_RPC hResource,
      [ in ] HRES_RPC hDependsOn
      );
  
  error_status_t
  ApiRemoveResourceDependency(
      [ in ] HRES_RPC hResource,
      [ in ] HRES_RPC hDependsOn
      );
  
  error_status_t 
 ApiCanResourceBeDependent(
      [in] HRES_RPC hResource,
      [in] HRES_RPC hResourceDependent
      );
  
  error_status_t
  ApiCreateResEnum(
      [ in ] HRES_RPC hResource,
      [ in ] DWORD dwType,
      [ out ] PENUM_LIST *ReturnEnum
      );
  
  error_status_t
  ApiAddResourceNode(
      [ in ] HRES_RPC hResource,
      [ in ] HNODE_RPC hNode
      );
  
  error_status_t
  ApiRemoveResourceNode(
      [ in ] HRES_RPC hResource,
      [ in ] HNODE_RPC hNode
      );
  
  error_status_t
  ApiChangeResourceGroup(
      [ in ] HRES_RPC hResource,
      [ in ] HGROUP_RPC hGroup
      );
  
  error_status_t
  ApiCreateResourceType(
      [ in, string ] LPCWSTR lpszTypeName,
      [ in, string ] LPCWSTR lpszDisplayName,
      [ in, string ] LPCWSTR lpszDllName,
      [ in ] unsigned long dwLooksAlive,
      [ in ] unsigned long dwIsAlive
      );
  
  error_status_t
  ApiDeleteResourceType(
      [ in, string ] const wchar_t * lpszTypeName
      );
  
  
  HKEY_RPC
  ApiGetRootKey(
      [ in ] unsigned long samDesired,
      [ out ] error_status_t *Status
      );
  
  HKEY_RPC
  ApiCreateKey(
      [ in ] HKEY_RPC hKey,
      [ in, string ] const wchar_t * lpSubKey,
      [ in ] unsigned long dwOptions,
      [ in ] unsigned long samDesired,
      [ in, unique ] PRPC_SECURITY_ATTRIBUTES lpSecurityAttributes,
      [ out ] unsigned long * lpdwDisposition,
      [ out ] error_status_t *Status
      );
  
  HKEY_RPC
  ApiOpenKey(
      [ in ] HKEY_RPC hKey,
      [ in, string ] const wchar_t * lpSubKey,
      [ in ] unsigned long samDesired,
      [ out ] error_status_t *Status
      );
  
  error_status_t
  ApiEnumKey(
      [ in ] HKEY_RPC hKey,
      [ in ] unsigned long dwIndex,
      [ out, string ] wchar_t * *KeyName,
      [ out ] FILETIME *lpftLastWriteTime
      );
  
  error_status_t
  ApiSetValue(
      [ in ] HKEY_RPC hKey,
      [ in, string ] const wchar_t * lpValueName,
      [ in ] unsigned long dwType,
      [ in, size_is(cbData) ] const unsigned char *lpData,
      [ in ] unsigned long cbData
      );
  
  error_status_t
  ApiDeleteValue(
      [ in ] HKEY_RPC hKey,
      [ in, string ] const wchar_t * lpValueName
      );
  
  error_status_t
  ApiQueryValue(
      [ in ] HKEY_RPC hKey,
      [ in, string ] const wchar_t * lpValueName,
      [ out ] unsigned long *lpValueType,
      [ out, size_is(cbData) ] unsigned char *lpData,
      [ in ] unsigned long cbData,
      [ out ] unsigned long * lpcbRequired
      );
  
  error_status_t
  ApiDeleteKey(
      [ in ] HKEY_RPC hKey,
      [ in, string ] const wchar_t * lpSubKey
      );
  
  error_status_t
  ApiEnumValue(
      [ in ] HKEY_RPC hKey,
      [ in ] unsigned long dwIndex,
      [ out, string ] wchar_t * *lpValueName,
      [ out ] unsigned long * lpType,
      [ out, size_is(*lpcbData) ] unsigned char *lpData,
      [ in, out ] unsigned long * lpcbData,
      [ out ] unsigned long * TotalSize
      );
  
  error_status_t
  ApiCloseKey(
      [ in, out ] HKEY_RPC *pKey
      );
  
  error_status_t
  ApiQueryInfoKey(
      [ in ] HKEY_RPC hKey,
      [ out ] LPDWORD lpcSubKeys,
      [ out ] LPDWORD lpcbMaxSubKeyLen,
      [ out ] LPDWORD lpcValues,
      [ out ] LPDWORD lpcbMaxValueNameLen,
      [ out ] LPDWORD lpcbMaxValueLen,
      [ out ] LPDWORD lpcbSecurityDescriptor,
      [ out ] PFILETIME lpftLastWriteTime
      );
  
  error_status_t
  ApiSetKeySecurity(
      [ in ] HKEY_RPC hKey,
      [ in ] DWORD SecurityInformation,
      [ in ] PRPC_SECURITY_DESCRIPTOR pRpcSecurityDescriptor
      );
  
  error_status_t
  ApiGetKeySecurity(
      [ in ] HKEY_RPC hKey,
      [ in ] DWORD SecurityInformation,
      [ in, out ] PRPC_SECURITY_DESCRIPTOR pRpcSecurityDescriptor
      );
  
  
  HGROUP_RPC
  ApiOpenGroup(
      [ in, string ] const wchar_t * lpszGroupName,
      [ out ] error_status_t *Status
      );
  
  HGROUP_RPC
  ApiCreateGroup(
      [ in, string ] LPCWSTR lpszGroupName,
      [ out ] error_status_t *Status
      );
  
  error_status_t
  ApiDeleteGroup(
      [ in ] HGROUP_RPC Group
      );    
  
  error_status_t
  ApiCloseGroup(
      [ in, out ] HGROUP_RPC *Group
      );
  
  error_status_t
  ApiGetGroupState(
      [ in ] HGROUP_RPC hGroup,
      [ out ] unsigned long *State,
      [ out, string ] wchar_t * *NodeName
      );
  
  error_status_t
  ApiSetGroupName(
      [ in ] HGROUP_RPC hGroup,
      [ in, string ] LPCWSTR lpszGroupName
      );
  
  error_status_t
  ApiGetGroupId(
      [ in ] HGROUP_RPC hGroup,
      [ out, string ] LPWSTR *pGuid
      );
  
  error_status_t
  ApiGetNodeId(
      [ in ] HNODE_RPC hNode,
      [ out, string ] LPWSTR *pGuid
      );
  
  error_status_t
  ApiOnlineGroup(
      [ in ] HGROUP_RPC hGroup
      );
  
  error_status_t
  ApiOfflineGroup(
      [ in ] HGROUP_RPC hGroup
      );
  
  error_status_t
  ApiMoveGroup(
      [ in ] HGROUP_RPC hGroup
      );
  
  error_status_t
  ApiMoveGroupToNode(
      [ in ] HGROUP_RPC hGroup,
      [ in ] HNODE_RPC hNode
      );
      
  
  error_status_t
  ApiCreateGroupResourceEnum(
      [ in ] HGROUP_RPC hGroup,
      [ in ] unsigned long dwType,
      [ out ] PENUM_LIST *ReturnEnum
      );
  
  error_status_t
  ApiSetGroupNodeList(
      [ in ] HGROUP_RPC hGroup,
      [ in, unique, size_is(cbListSize) ] UCHAR *lpNodeList,
      [ in ] DWORD cbListSize
      );
  
  HNOTIFY_RPC
  ApiCreateNotify(
      [ out ] error_status_t *Status
      );
  
  error_status_t
  ApiCloseNotify(
      [ in, out ] HNOTIFY_RPC* hNotify
      );
  
  error_status_t
  ApiAddNotifyCluster(
      [ in ] HNOTIFY_RPC hNotify,
      [ in ] HCLUSTER_RPC hCluster,
      [ in ] DWORD dwFilter,
      [ in ] DWORD dwNotifyKey
      );
  
  error_status_t
  ApiAddNotifyNode(
      [ in ] HNOTIFY_RPC hNotify,
      [ in ] HNODE_RPC hNode,
      [ in ] DWORD dwFilter,
      [ in ] DWORD dwNotifyKey,
      [ out ] DWORD *dwStateSequence
      );
  
  error_status_t
  ApiAddNotifyGroup(
      [ in ] HNOTIFY_RPC hNotify,
      [ in ] HGROUP_RPC hGroup,
      [ in ] DWORD dwFilter,
      [ in ] DWORD dwNotifyKey,
      [ out ] DWORD *dwStateSequence
      );
  
  error_status_t
  ApiAddNotifyResource(
      [ in ] HNOTIFY_RPC hNotify,
      [ in ] HRES_RPC hResource,
      [ in ] DWORD dwFilter,
      [ in ] DWORD dwNotifyKey,
      [ out ] DWORD *dwStateSequence
      );
  
  error_status_t
  ApiAddNotifyKey(
      [ in ] HNOTIFY_RPC hNotify,
      [ in ] HKEY_RPC hKey,
      [ in ] DWORD dwNotifyKey,
      [ in ] DWORD dwFilter,
      [ in ] BOOL WatchSubTree
      );
  
  error_status_t
  ApiReAddNotifyNode(
      [ in ] HNOTIFY_RPC hNotify,
      [ in ] HNODE_RPC hNode,
      [ in ] DWORD dwFilter,
      [ in ] DWORD dwNotifyKey,
      [ in ] DWORD StateSequence
      );
  
  error_status_t
  ApiReAddNotifyGroup(
      [ in ] HNOTIFY_RPC hNotify,
      [ in ] HGROUP_RPC hGroup,
      [ in ] DWORD dwFilter,
      [ in ] DWORD dwNotifyKey,
      [ in ] DWORD StateSequence
      );
  
  error_status_t
  ApiReAddNotifyResource(
      [ in ] HNOTIFY_RPC hNotify,
      [ in ] HRES_RPC hResource,
      [ in ] DWORD dwFilter,
      [ in ] DWORD dwNotifyKey,
      [ in ] DWORD StateSequence
      );
  
  error_status_t
  ApiGetNotify(
      [ in ] HNOTIFY_RPC hNotify,
      [ in ] DWORD Timeout,
      [ out ] DWORD *dwNotifyKey,
      [ out ] DWORD *dwFilter,
      [ out ] DWORD *dwStateSequence,
      [ out, string ] LPWSTR *Name
      );
  
  HNODE_RPC
  ApiOpenNode(
      [ in, string ] const wchar_t * lpszNodeName,
      [ out ] error_status_t *Status
      );
  
  error_status_t
  ApiCloseNode(
      [ in, out ] HNODE_RPC *Node
      );
  
  error_status_t
  ApiGetNodeState(
      [ in ] HNODE_RPC hNode,
      [ out ] unsigned long *State
      );
  
  error_status_t
  ApiPauseNode(
      [ in ] HNODE_RPC hNode
      );
  
  error_status_t
  ApiResumeNode(
      [ in ] HNODE_RPC hNode
      );
  
  error_status_t
  ApiEvictNode(
      [ in ] HNODE_RPC hNode
      );
  
  error_status_t
  ApiNodeResourceControl(
      [ in ] HRES_RPC hResource,
      [ in ] HNODE_RPC hNode,
      [ in ] DWORD dwControlCode,
      [ in, unique, size_is(nInBufferSize) ] UCHAR *lpInBuffer,
      [ in ] DWORD nInBufferSize,
      [ out, size_is(nOutBufferSize),
          length_is (*lpBytesReturned)] UCHAR *lpOutBuffer,
      [ in ] DWORD nOutBufferSize,
      [ out ] DWORD *lpBytesReturned,
      [ out ] DWORD *lpcbRequired
      );    
  
  error_status_t
  ApiResourceControl(
      [ in ] HRES_RPC hResource,
      [ in ] unsigned long dwControlCode,
      [ in, unique, size_is(nInBufferSize) ] unsigned char *lpInBuffer,
      [ in ] unsigned long nInBufferSize,
      [ out, size_is(nOutBufferSize),
          length_is (*lpBytesReturned)] unsigned char *lpOutBuffer,
      [ in ] unsigned long nOutBufferSize,
      [ out ] unsigned long *lpBytesReturned,
      [ out ] unsigned long *lpcbRequired
      );
  
  error_status_t
  ApiNodeResourceTypeControl(
      [ in ] HCLUSTER_RPC hCluster,
      [ in, string ] LPCWSTR lpszResourceTypeName,
      [ in ] HNODE_RPC hNode,
      [ in ] DWORD dwControlCode,
      [ in, unique, size_is(nInBufferSize) ] UCHAR *lpInBuffer,
      [ in ] DWORD nInBufferSize,
      [ out, size_is(nOutBufferSize),
          length_is (*lpBytesReturned)] UCHAR *lpOutBuffer,
      [ in ] DWORD nOutBufferSize,
      [ out ] DWORD *lpBytesReturned,
      [ out ] DWORD *lpcbRequired
      );
  
  error_status_t
  ApiResourceTypeControl(
      [ in ] HCLUSTER_RPC hCluster,
      [ in, string ] LPCWSTR lpszResourceTypeName,
      [ in ] DWORD dwControlCode,
      [ in, unique, size_is(nInBufferSize) ] UCHAR *lpInBuffer,
      [ in ] DWORD nInBufferSize,
      [ out, size_is(nOutBufferSize),
          length_is (*lpBytesReturned)] UCHAR *lpOutBuffer,
      [ in ] DWORD nOutBufferSize,
      [ out ] DWORD *lpBytesReturned,
      [ out ] DWORD *lpcbRequired
      );
  
  error_status_t
  ApiNodeGroupControl(
      [ in ] HGROUP_RPC hGroup,
      [ in ] HNODE_RPC hNode,
      [ in ] DWORD dwControlCode,
      [ in, unique, size_is(nInBufferSize) ] UCHAR *lpInBuffer,
      [ in ] DWORD nInBufferSize,
      [ out, size_is(nOutBufferSize),
          length_is (*lpBytesReturned)] UCHAR *lpOutBuffer,
      [ in ] DWORD nOutBufferSize,
      [ out ] DWORD *lpBytesReturned,
      [ out ] DWORD *lpcbRequired
      );
  
  error_status_t
  ApiGroupControl(
      [ in ] HGROUP_RPC hGroup,
      [ in ] DWORD dwControlCode,
      [ in, unique, size_is(nInBufferSize) ] UCHAR *lpInBuffer,
      [ in ] DWORD nInBufferSize,
      [ out, size_is(nOutBufferSize),
          length_is (*lpBytesReturned)] UCHAR *lpOutBuffer,
      [ in ] DWORD nOutBufferSize,
      [ out ] DWORD *lpBytesReturned,
      [ out ] DWORD *lpcbRequired
      );
  
  error_status_t
  ApiNodeNodeControl(
      [ in ] HNODE_RPC hNode,
      [ in ] HNODE_RPC hHostNode,
      [ in ] DWORD dwControlCode,
      [ in, unique, size_is(nInBufferSize) ] UCHAR *lpInBuffer,
      [ in ] DWORD nInBufferSize,
      [ out, size_is(nOutBufferSize),
         length_is (*lpBytesReturned)] UCHAR *lpOutBuffer,
      [ in ] DWORD nOutBufferSize,
      [ out ] DWORD *lpBytesReturned,
      [ out ] DWORD *lpcbRequired
      );
  
  error_status_t
  ApiNodeControl(
      [ in ] HNODE_RPC hNode,
      [ in ] DWORD dwControlCode,
      [ in, unique, size_is(nInBufferSize) ] UCHAR *lpInBuffer,
      [ in ] DWORD nInBufferSize,
      [ out, size_is(nOutBufferSize),
          length_is (*lpBytesReturned)] UCHAR *lpOutBuffer,
      [ in ] DWORD nOutBufferSize,
      [ out ] DWORD *lpBytesReturned,
      [ out ] DWORD *lpcbRequired
      );
  
  error_status_t
  Opnum80NotUsedOnWire(void);
  
  
  HNETWORK_RPC
  ApiOpenNetwork(
      [ in, string ] LPCWSTR lpszNetworkName,
      [ out ] error_status_t *Status
      );
  
  error_status_t
  ApiCloseNetwork(
      [ in, out ] HNETWORK_RPC *Network
      );
  
  error_status_t
  ApiGetNetworkState(
      [ in ] HNETWORK_RPC hNetwork,
      [ out ] DWORD *State
      );
  
  error_status_t
  ApiSetNetworkName(
      [ in ] HNETWORK_RPC hNetwork,
      [ in, string ] LPCWSTR lpszNetworkName
      );
  
  error_status_t
  ApiCreateNetworkEnum(
      [ in ] HNETWORK_RPC hNetwork,
      [ in ] DWORD dwType,
      [ out ] PENUM_LIST *ReturnEnum
      );
  
  error_status_t
  ApiGetNetworkId(
      [ in ] HNETWORK_RPC hNetwork,
      [ out, string ] LPWSTR *pGuid
      );
  
  error_status_t
  ApiSetNetworkPriorityOrder(
      [ in, range(0, 1000)] DWORD NetworkCount,
      [ in, string, size_is(NetworkCount) ] LPWSTR NetworkIdList[*]
      );
  
  error_status_t
  ApiNodeNetworkControl(
      [ in ] HNETWORK_RPC hNetwork,
      [ in ] HNODE_RPC hNode,
      [ in ] DWORD dwControlCode,
      [ in, unique, size_is(nInBufferSize) ] UCHAR *lpInBuffer,
      [ in ] DWORD nInBufferSize,
      [ out, size_is(nOutBufferSize),
          length_is (*lpBytesReturned)] UCHAR *lpOutBuffer,
      [ in ] DWORD nOutBufferSize,
      [ out ] DWORD *lpBytesReturned,
      [ out ] DWORD *lpcbRequired
      );
  
  error_status_t
  ApiNetworkControl(
      [ in ] HNETWORK_RPC hNetwork,
      [ in ] DWORD dwControlCode,
      [ in, unique, size_is(nInBufferSize) ] UCHAR *lpInBuffer,
      [ in ] DWORD nInBufferSize,
      [ out, size_is(nOutBufferSize),
          length_is (*lpBytesReturned)] UCHAR *lpOutBuffer,
      [ in ] DWORD nOutBufferSize,
      [ out ] DWORD *lpBytesReturned,
      [ out ] DWORD *lpcbRequired
      );
  
  error_status_t
  ApiAddNotifyNetwork(
      [ in ] HNOTIFY_RPC hNotify,
      [ in ] HNETWORK_RPC hNetwork,
      [ in ] DWORD dwFilter,
      [ in ] DWORD dwNotifyKey,
      [ out ] DWORD *dwStateSequence
      );
  
  error_status_t
  ApiReAddNotifyNetwork(
      [ in ] HNOTIFY_RPC hNotify,
      [ in ] HNETWORK_RPC hNetwork,
      [ in ] DWORD dwFilter,
      [ in ] DWORD dwNotifyKey,
      [ in ] DWORD StateSequence
      );
  
  HNETINTERFACE_RPC
  ApiOpenNetInterface(
      [ in, string ] LPCWSTR lpszNetInterfaceName,
      [ out ] error_status_t *Status
      );
  
  error_status_t
  ApiCloseNetInterface(
      [ in, out ] HNETINTERFACE_RPC *NetInterface
      );
  
  error_status_t
  ApiGetNetInterfaceState(
      [ in ] HNETINTERFACE_RPC hNetInterface,
      [ out ] DWORD *State
      );
  
  error_status_t
  ApiGetNetInterface(
      [ in, string ] LPCWSTR lpszNodeName,
      [ in, string ] LPCWSTR lpszNetworkName,
      [ out, string ] LPWSTR *lppszInterfaceName
      );
  
  error_status_t
  ApiGetNetInterfaceId(
      [ in ] HNETINTERFACE_RPC hNetInterface,
      [ out, string ] LPWSTR *pGuid
      );
  
  error_status_t
  ApiNodeNetInterfaceControl(
      [ in ] HNETINTERFACE_RPC hNetInterface,
      [ in ] HNODE_RPC hNode,
      [ in ] DWORD dwControlCode,
      [ in, unique, size_is(nInBufferSize) ] UCHAR *lpInBuffer,
      [ in ] DWORD nInBufferSize,
      [ out, size_is(nOutBufferSize),
          length_is (*lpBytesReturned)] UCHAR *lpOutBuffer,
      [ in ] DWORD nOutBufferSize,
      [ out ] DWORD *lpBytesReturned,
      [ out ] DWORD *lpcbRequired
      );
  
  error_status_t
  ApiNetInterfaceControl(
      [ in ] HNETINTERFACE_RPC hNetInterface,
      [ in ] DWORD dwControlCode,
      [ in, unique, size_is(nInBufferSize) ] UCHAR *lpInBuffer,
      [ in ] DWORD nInBufferSize,
      [ out, size_is(nOutBufferSize),
          length_is (*lpBytesReturned)] UCHAR *lpOutBuffer,
      [ in ] DWORD nOutBufferSize,
      [ out ] DWORD *lpBytesReturned,
      [ out ] DWORD *lpcbRequired
      );
  
  error_status_t
  ApiAddNotifyNetInterface(
      [ in ] HNOTIFY_RPC hNotify,
      [ in ] HNETINTERFACE_RPC hNetInterface,
      [ in ] DWORD dwFilter,
      [ in ] DWORD dwNotifyKey,
      [ out ] DWORD *dwStateSequence
      );
  
  error_status_t
  ApiReAddNotifyNetInterface(
      [ in ] HNOTIFY_RPC hNotify,
      [ in ] HNETINTERFACE_RPC hNetInterface,
      [ in ] DWORD dwFilter,
      [ in ] DWORD dwNotifyKey,
      [ in ] DWORD StateSequence
      );
  
  error_status_t
  ApiCreateNodeEnum(
      [ in ] HNODE_RPC hNode,
      [ in ] DWORD dwType,
      [ out ] PENUM_LIST *ReturnEnum
      );    
  
  error_status_t
  ApiGetClusterVersion2(
      [ out ] WORD* lpwMajorVersion,
      [ out ] WORD* lpwMinorVersion,
      [ out ] WORD* lpwBuildNumber,
      [ out, string ] wchar_t * *lpszVendorId,
      [ out, string ] wchar_t * *lpszCSDVersion,
      [ out ] PCLUSTER_OPERATIONAL_VERSION_INFO *ppClusterOpVerInfo
      );
  
  error_status_t
  ApiCreateResTypeEnum(
      [ in, string ] LPCWSTR lpszTypeName,
      [ in ] DWORD dwType,
      [ out ] PENUM_LIST *ReturnEnum
      );
  
  error_status_t
  ApiBackupClusterDatabase(
      [ in, string ] LPCWSTR lpszPathName
      );
  
  error_status_t
  ApiNodeClusterControl(
      [ in ] HCLUSTER_RPC hCluster,
      [ in ] HNODE_RPC hHostNode,
      [ in ] DWORD dwControlCode,
      [ in, unique, size_is(nInBufferSize) ] UCHAR *lpInBuffer,
      [ in ] DWORD nInBufferSize,
      [ out, size_is(nOutBufferSize),
          length_is (*lpBytesReturned)] UCHAR *lpOutBuffer,
      [ in ] DWORD nOutBufferSize,
      [ out ] DWORD *lpBytesReturned,
      [ out ] DWORD *lpcbRequired
      );
  
  error_status_t
  ApiClusterControl(
      [ in ] HCLUSTER_RPC hCluster,
      [ in ] DWORD dwControlCode,
      [ in, unique, size_is(nInBufferSize) ] UCHAR *lpInBuffer,
      [ in ] DWORD nInBufferSize,
      [ out, size_is(nOutBufferSize),
          length_is (*lpBytesReturned)] UCHAR *lpOutBuffer,
      [ in ] DWORD nOutBufferSize,
      [ out ] DWORD *lpBytesReturned,
      [ out ] DWORD *lpcbRequired
      );
  
  error_status_t
  ApiUnblockGetNotifyCall(
      [ in ] HNOTIFY_RPC hNotify
      );
  
  typedef struct IDL_CLUSTER_SET_PASSWORD_STATUS {
      DWORD    NodeId;
      BOOLEAN  SetAttempted;
      DWORD    ReturnStatus;
  } IDL_CLUSTER_SET_PASSWORD_STATUS, *PIDL_CLUSTER_SET_PASSWORD_STATUS;
  
  typedef enum IDL_CLUSTER_SET_PASSWORD_FLAGS {
      IDL_CLUSTER_SET_PASSWORD_IGNORE_DOWN_NODES = 1
  } IDL_CLUSTER_SET_PASSWORD_FLAGS;
  
  error_status_t
  ApiSetServiceAccountPassword(
      [ in, string ] LPWSTR lpszNewPassword,
      [ in ]  IDL_CLUSTER_SET_PASSWORD_FLAGS dwFlags,
      [ out, size_is(ReturnStatusBufferSize),
          length_is(*SizeReturned) ] IDL_CLUSTER_SET_PASSWORD_STATUS
          ReturnStatusBufferPtr[*],
      [ in ] DWORD ReturnStatusBufferSize,
      [ out ] DWORD *SizeReturned,
      [ out ] DWORD *ExpectedBufferSize
      );
 }