/*++

Copyright (c) 1996  Microsoft Corporation

Module Name:

    api_rpc.idl

Abstract:

    Interface Description for Cluster API RPC interface

Author:

    John Vert (jvert) 11-Jan-1996

--*/

//
// Interface Attributes
//
[
uuid(b97db8b2-4c63-11cf-bff6-08002be23f2f),
version(2.0)
]
interface clusapi
{

import "wtypes.idl";



//
// Types
//
typedef [context_handle] void *HCLUSTER_RPC;
typedef [context_handle] void *HNOTIFY_RPC;
typedef [context_handle] void *HNODE_RPC;
typedef [context_handle] void *HGROUP_RPC;
typedef [context_handle] void *HNETWORK_RPC;
typedef [context_handle] void *HNETINTERFACE_RPC;
typedef [context_handle] void *HRES_RPC;
typedef [context_handle] void *HKEY_RPC;

//
// RPCable security structures (see winbase.h).
//

typedef struct _RPC_SECURITY_DESCRIPTOR {
    [ size_is( cbInSecurityDescriptor ), length_is( cbOutSecurityDescriptor ) ] UCHAR *lpSecurityDescriptor;
    DWORD cbInSecurityDescriptor;
    DWORD cbOutSecurityDescriptor;
} RPC_SECURITY_DESCRIPTOR, *PRPC_SECURITY_DESCRIPTOR;


typedef struct _RPC_SECURITY_ATTRIBUTES {
    DWORD nLength;
    RPC_SECURITY_DESCRIPTOR RpcSecurityDescriptor;
    BOOL bInheritHandle;
} RPC_SECURITY_ATTRIBUTES, *PRPC_SECURITY_ATTRIBUTES;


typedef struct _CLUSTER_OPERATIONAL_VERSION_INFO {
    DWORD 	dwSize;
    DWORD	dwClusterHighestVersion;
    DWORD	dwClusterLowestVersion;
    DWORD	dwFlags;
    DWORD	dwReserved;
}CLUSTER_OPERATIONAL_VERSION_INFO, *PCLUSTER_OPERATIONAL_VERSION_INFO;




//
// Routines and structures for dealing with the cluster
//
HCLUSTER_RPC
ApiOpenCluster(
    [ out ] error_status_t *Status
    );

error_status_t
ApiCloseCluster(
    [ in, out ] HCLUSTER_RPC *Cluster
    );

error_status_t
ApiSetClusterName(
    [ in ] LPCWSTR NewClusterName
    );

error_status_t
ApiGetClusterName(
    [ out ] LPWSTR *ClusterName,
    [ out ] 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 ] LPCWSTR  lpszDeviceName,
    [ in ] DWORD    dwMaxQuorumLogSize
    );

//
// Enumeration interface
//

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
    );

//
// Resource interface
//

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 ] DWORD dwLooksAlive,
    [ in ] DWORD dwIsAlive
    );

error_status_t
ApiDeleteResourceType(
    [ in, string ] LPCWSTR lpszTypeName
    );

//
// Registry interfaces
//
HKEY_RPC
ApiGetRootKey(
    [ in ] DWORD samDesired,
    [ out ] error_status_t *Status
    );

HKEY_RPC
ApiCreateKey(
    [ in ] HKEY_RPC hKey,
    [ in, string ] LPCWSTR lpSubKey,
    [ in ] DWORD dwOptions,
    [ in ] DWORD samDesired,
    [ in, unique ] PRPC_SECURITY_ATTRIBUTES lpSecurityAttributes,
    [ out ] LPDWORD lpdwDisposition,
    [ out ] error_status_t *Status
    );

HKEY_RPC
ApiOpenKey(
    [ in ] HKEY_RPC hKey,
    [ in, string ] LPCWSTR lpSubKey,
    [ in ] DWORD samDesired,
    [ out ] error_status_t *Status
    );

error_status_t
ApiEnumKey(
    [ in ] HKEY_RPC hKey,
    [ in ] DWORD dwIndex,
    [ out, string ] LPWSTR *KeyName,
    [ out ] FILETIME *lpftLastWriteTime
    );

error_status_t
ApiSetValue(
    [ in ] HKEY_RPC hKey,
    [ in, string ] LPCWSTR lpValueName,
    [ in ] DWORD dwType,
    [ in, size_is(cbData) ] const UCHAR *lpData,
    [ in ] DWORD cbData
    );

error_status_t
ApiDeleteValue(
    [ in ] HKEY_RPC hKey,
    [ in, string ] LPCWSTR lpValueName
    );

error_status_t
ApiQueryValue(
    [ in ] HKEY_RPC hKey,
    [ in, string ] LPCWSTR lpValueName,
    [ out ] DWORD *lpValueType,
    [ out, size_is(cbData) ] UCHAR *lpData,
    [ in ] DWORD cbData,
    [ out ] LPDWORD lpcbRequired
    );

error_status_t
ApiDeleteKey(
    [ in ] HKEY_RPC hKey,
    [ in, string ] LPCWSTR lpSubKey
    );

error_status_t
ApiEnumValue(
    [ in ] HKEY_RPC hKey,
    [ in ] DWORD dwIndex,
    [ out, string ] LPWSTR *lpValueName,
    [ out ] LPDWORD lpType,
    [ out, size_is(*lpcbData) ] UCHAR *lpData,
    [ in, out ] LPDWORD lpcbData,
    [ out ] LPDWORD 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
    );

//
// Group interface
//

HGROUP_RPC
ApiOpenGroup(
    [ in, string ] LPCWSTR 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 ] DWORD *State,
    [ out, string ] LPWSTR *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 ] DWORD dwType,
    [ out ] PENUM_LIST *ReturnEnum
    );

error_status_t
ApiSetGroupNodeList(
    [ in ] HGROUP_RPC hGroup,
    [ in, unique, size_is(cbListSize) ] UCHAR *lpNodeList,
    [ in ] DWORD cbListSize
    );

//
// Notify interface
//

HNOTIFY_RPC
ApiCreateNotify(
    [ out ] error_status_t *rpc_error
    );

error_status_t
ApiCloseNotify(
    [ in, out ] HNOTIFY_RPC *Notify
    );

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 Filter,
    [ 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 ] LPCWSTR lpszNodeName,
    [ out ] error_status_t *Status
    );

error_status_t
ApiCloseNode(
    [ in, out ] HNODE_RPC *Node
    );

error_status_t
ApiGetNodeState(
    [ in ] HNODE_RPC hNode,
    [ out ] DWORD *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
    );

//
// Resource/ResourceType IOCTL interface
//
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 ] 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
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
    );

//
// Group IOCTL interface
//
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
    );

//
// Node IOCTL interface
//
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
    );


//For eventlogging..this is only published in the idl interface for the eventlog
//service.  clusapi.dll doesnt export this functionality
error_status_t
ApiEvPropEvents(
    [in] DWORD  dwEventInfoSize,
    [in , size_is(dwEventInfoSize)] UCHAR *pPackedEventInfo
    );


//
// Network interfaces
//

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 ] DWORD NetworkCount,
    [ in, size_is(NetworkCount) ] LPWSTR NetworkIdList[*]
    );

//
// Network IOCTL interface
//
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
    );

//
// NetInterface interfaces
//

HNETWORK_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
    );

//
// NetInterface IOCTL interface
//
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
    );

//added for nt 5
//added for providing more complete cluster version
error_status_t
ApiGetClusterVersion2(
    [ out ] WORD *lpwMajorVersion,
    [ out ] WORD *lpwMinorVersion,
    [ out ] WORD *lpwBuildNumber,
    [ out, string ] LPWSTR *lpszVendorId,
    [ out, string ] LPWSTR *lpszCSDVersion,
    [ out ] PCLUSTER_OPERATIONAL_VERSION_INFO *ppClusterOpVerInfo
    );

// Added for enumerating nodes that supports a certain resource type
error_status_t
ApiCreateResTypeEnum(
    [ in, string ] LPCWSTR lpszTypeName,
    [ in ] DWORD dwType,
    [ out ] PENUM_LIST *ReturnEnum
    );

// Added for backing up the quorum log and checkpoint file to the specified directory
error_status_t
ApiBackupClusterDatabase(
    [ in, string ] LPCWSTR lpszPathName
    );

//
// Cluster ioctls
//
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
    );

//
//  Added for unblocking the get notify thread without freeing the context handles
//
error_status_t
ApiUnblockGetNotifyCall(
    [ in ] HNOTIFY_RPC hNotify
    );


//
// Added to enable change of the cluster service account password
//
// Structures IDL_CLUSTER_SET_PASSWORD_STATUS and IDL_CLUSTER_SET_PASSWORD_FLAGS
// are also defined in clusapi.h. The duplication is necessary since the two
// header files are completely independent. But the definitions of the two
// data structures must remain in sync.
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
    );

}