403Webshell
Server IP : 209.209.40.120  /  Your IP : 216.73.217.112
Web Server : Microsoft-IIS/10.0
System : Windows NT NEWWWW 10.0 build 17763 (Windows Server 2019) i586
User : NEWWWW$ ( 0)
PHP Version : 8.3.30
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : OFF  |  Perl : OFF  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /Program Files (x86)/Windows Kits/10/Include/10.0.19041.0/um/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /Program Files (x86)/Windows Kits/10/Include/10.0.19041.0/um/Resapi.h
/*++

Copyright (c) Microsoft Corporation.  All rights reserved.

Module Name:

    resapi.h

Abstract:

    This module defines the interface exported by Windows Clusters resources.

Revision History:

--*/

#include <winapifamily.h>

#pragma region Desktop Family or FailoverCluster Package
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_PKG_CLUSTER)

#ifndef _RESAPI_DEFINES_
#define _RESAPI_DEFINES_

#if _MSC_VER > 1000
#pragma once
#endif

#include <windows.h>
#include <winsvc.h>
#include <clusapi.h>
#include <stdio.h>

#ifdef __cplusplus
extern "C" {
#endif

#define IN
#define OUT

//
// Definitions for entrypoints exported by a resource DLL.
//
#define STARTUP_ROUTINE "Startup"

#define CLRES_V1_FUNCTION_SIZE   sizeof(CLRES_V1_FUNCTIONS)
#define CLRES_VERSION_V1_00    0x100


#define CLRES_V1_FUNCTION_TABLE( _Name,                     \
                                 _Version,                  \
                                 _Prefix,                   \
                                 _Arbitrate,                \
                                 _Release,                  \
                                 _ResControl,               \
                                 _ResTypeControl            \
                                 )                          \
CLRES_FUNCTION_TABLE _Name = { CLRES_V1_FUNCTION_SIZE,      \
                               _Version,                    \
                               _Prefix##Open,               \
                               _Prefix##Close,              \
                               _Prefix##Online,             \
                               _Prefix##Offline,            \
                               _Prefix##Terminate,          \
                               _Prefix##LooksAlive,         \
                               _Prefix##IsAlive,            \
                               _Arbitrate,                  \
                               _Release,                    \
                               _ResControl,                 \
                               _ResTypeControl }


#if CLUSAPI_VERSION >= CLUSAPI_VERSION_WINDOWS8

#define STARTUP_EX_ROUTINE "StartupEx"

#define CLRES_V2_FUNCTION_SIZE   sizeof(CLRES_V2_FUNCTIONS)
#define CLRES_VERSION_V2_00    0x200
#define CLRES_V2_FUNCTION_TABLE_SET( _Name,                 \
                                     _Version,              \
                                     _Prefix,               \
                                     _Arbitrate,            \
                                     _Release,              \
                                     _ResControl,           \
                                     _ResTypeControl,       \
                                     _LooksAlive,           \
                                     _IsAlive,              \
                                     _Cancel                \
                                     )                      \
_Name.TableSize = CLRES_V2_FUNCTION_SIZE;                   \
_Name.Version = _Version;                                   \
_Name.V2Functions.Open = _Prefix##OpenV2;                   \
_Name.V2Functions.Close = _Prefix##Close;                   \
_Name.V2Functions.Online = _Prefix##OnlineV2;               \
_Name.V2Functions.Offline = _Prefix##OfflineV2;             \
_Name.V2Functions.Terminate = _Prefix##Terminate;           \
_Name.V2Functions.LooksAlive= _LooksAlive;                  \
_Name.V2Functions.IsAlive = _IsAlive;                       \
_Name.V2Functions.Arbitrate = _Arbitrate;                   \
_Name.V2Functions.Release = _Release;                       \
_Name.V2Functions.ResourceControl = _ResControl;            \
_Name.V2Functions.ResourceTypeControl = _ResTypeControl;    \
_Name.V2Functions.Cancel = _Cancel;


#define CLRES_V3_FUNCTION_SIZE    sizeof(CLRES_V3_FUNCTIONS)
#define CLRES_VERSION_V3_00    0x300
#define CLRES_V3_FUNCTION_TABLE_SET( _Name,                 \
                                     _Version,              \
                                     _Prefix,               \
                                     _Arbitrate,            \
                                     _Release,              \
                                     _BeginResourceControl,           \
                                     _BeginResourceTypeControl,       \
                                     _LooksAlive,           \
                                     _IsAlive,              \
                                     _Cancel               \
                                     )                      \
_Name.TableSize = CLRES_V3_FUNCTION_SIZE;                   \
_Name.Version = _Version;                                   \
_Name.V3Functions.Open = _Prefix##OpenV2;                   \
_Name.V3Functions.Close = _Prefix##Close;                   \
_Name.V3Functions.Online = _Prefix##OnlineV2;               \
_Name.V3Functions.Offline = _Prefix##OfflineV2;             \
_Name.V3Functions.Terminate = _Prefix##Terminate;           \
_Name.V3Functions.LooksAlive= _LooksAlive;                  \
_Name.V3Functions.IsAlive = _IsAlive;                       \
_Name.V3Functions.Arbitrate = _Arbitrate;                   \
_Name.V3Functions.Release = _Release;                       \
_Name.V3Functions.Cancel = _Cancel;                         \
_Name.V3Functions.BeginResourceControl= _BeginResourceControl; \
_Name.V3Functions.BeginResourceTypeControl= _BeginResourceTypeControl

#endif

#if CLUSAPI_VERSION >= CLUSAPI_VERSION_WINTHRESHOLD

#define CLRES_V4_FUNCTION_SIZE    sizeof(CLRES_V4_FUNCTIONS)
#define CLRES_VERSION_V4_00    0x400
#define CLRES_V4_FUNCTION_TABLE_SET( _Name, \
                                     _Version, \
                                     _Prefix, \
                                     _Arbitrate, \
                                     _Release, \
                                     _BeginResCtrl, \
                                     _BeginResTypeCtrl, \
                                     _LooksAlive, \
                                     _IsAlive, \
                                     _Cancel, \
                                     _BeginResCtrlAsUser, \
                                     _BeginResTypeCtrlAsUser \
                                     ) \
_Name.TableSize = CLRES_V4_FUNCTION_SIZE; \
_Name.Version = _Version; \
_Name.V4Functions.Open = _Prefix##OpenV2; \
_Name.V4Functions.Close = _Prefix##Close; \
_Name.V4Functions.Online = _Prefix##OnlineV2; \
_Name.V4Functions.Offline = _Prefix##OfflineV2; \
_Name.V4Functions.Terminate = _Prefix##Terminate; \
_Name.V4Functions.LooksAlive= _LooksAlive; \
_Name.V4Functions.IsAlive = _IsAlive; \
_Name.V4Functions.Arbitrate = _Arbitrate; \
_Name.V4Functions.Release = _Release; \
_Name.V4Functions.Cancel = _Cancel; \
_Name.V4Functions.BeginResourceControl= _BeginResCtrl; \
_Name.V4Functions.BeginResourceTypeControl= _BeginResTypeCtrl; \
_Name.V4Functions.BeginResourceControlAsUser= _BeginResCtrlAsUser; \
_Name.V4Functions.BeginResourceTypeControlAsUser= _BeginResTypeCtrlAsUser

#endif //CLUSAPI_VERSION >= CLUSAPI_VERSION_WINTHRESHOLD


#endif // ifndef _RESAPI_DEFINES_

#ifndef _RESAPI_
#define _RESAPI_

//
// Define a RESID
//

typedef PVOID RESID;

//
// Define a RESOURCE_HANDLE
//

typedef HANDLE   RESOURCE_HANDLE;

//
// Define the Resource Status structure.
//

#define ClusterResourceCannotComeOnlineOnThisNode ( CLUSTER_RESOURCE_STATE ) ( ClusterResourcePending - 1 )
#define ClusterResourceCannotComeOnlineOnAnyNode  ( CLUSTER_RESOURCE_STATE ) ( ClusterResourcePending - 2 )

typedef struct RESOURCE_STATUS {
    CLUSTER_RESOURCE_STATE  ResourceState;
    DWORD           CheckPoint;
    DWORD           WaitHint;
    HANDLE          EventHandle;
} RESOURCE_STATUS, *PRESOURCE_STATUS;


#if CLUSAPI_VERSION >= CLUSAPI_VERSION_WINDOWS8

// To be used with Control Code CLUSCTL_RESOURCE_TYPE_GET_LOCAL_NODE_UTILIZATION_INFO Only:
// Return with an array of NodeIntelligenceInfoElement(s)
struct NodeUtilizationInfoElement
{
    ULONGLONG Id;
    ULONGLONG AvailableMemory;
    ULONGLONG AvailableMemoryAfterReclamation;
};

// To be used with Control Code CLUSCTL_RESOURCE_GET_UTILIZATION_INFO Only:
// Return with an array of ResourceIntelligenceInfoElement(s)
struct ResourceUtilizationInfoElement
{
    ULONGLONG PhysicalNumaId;
    ULONGLONG CurrentMemory;
};

typedef enum VM_RESDLL_CONTEXT {
    VmResdllContextTurnOff =            0,
    VmResdllContextSave =               1,
    VmResdllContextShutdown =           2,
    VmResdllContextShutdownForce =      3,
    VmResdllContextLiveMigration =      4
} VM_RESDLL_CONTEXT, *PVM_RESDLL_CONTEXT;

typedef enum RESDLL_CONTEXT_OPERATION_TYPE {
    ResdllContextOperationTypeFailback,
    ResdllContextOperationTypeDrain,
    ResdllContextOperationTypeDrainFailure,
    ResdllContextOperationTypeEmbeddedFailure,
    ResdllContextOperationTypePreemption,
    ResdllContextOperationTypeNetworkDisconnect,
    ResdllContextOperationTypeNetworkDisconnectMoveRetry
} RESDLL_CONTEXT_OPERATION_TYPE, *PRESDLL_CONTEXT_OPERATION_TYPE;

#define CLUSCTL_GET_OPERATION_CONTEXT_PARAMS_VERSION_1  1

typedef struct GET_OPERATION_CONTEXT_PARAMS {
    DWORD                            Size;
    DWORD                            Version;
    RESDLL_CONTEXT_OPERATION_TYPE    Type;
    DWORD                            Priority;
} GET_OPERATION_CONTEXT_PARAMS, *PGET_OPERATION_CONTEXT_PARAMS;

#define CLUSRES_GET_OPERATION_CONTEXT_FLAGS       { CLUSRES_NAME_GET_OPERATION_CONTEXT_FLAGS,    NULL, CLUSPROP_FORMAT_DWORD, 0, 0, 0xFFFFFFFF, RESUTIL_PROPITEM_REQUIRED, 0 }
#define CLUSRES_NAME_GET_OPERATION_CONTEXT_FLAGS L"Flags"

#define RESOURCE_SPECIFIC_STATUS_PROP_ITEM       { CLUSREG_NAME_RES_STATUS,    NULL, CLUSPROP_FORMAT_SZ,                0, 0, 0, RESUTIL_PROPITEM_IN_MEMORY, 0 }
#define RESOURCE_SPECIFIC_DATA1_PROP_ITEM        { CLUSREG_NAME_RES_DATA1,     NULL, CLUSPROP_FORMAT_ULARGE_INTEGER,    0, 0, 0, RESUTIL_PROPITEM_READ_ONLY | RESUTIL_PROPITEM_IN_MEMORY, 0 }
#define RESOURCE_SPECIFIC_DATA2_PROP_ITEM        { CLUSREG_NAME_RES_DATA2,     NULL, CLUSPROP_FORMAT_ULARGE_INTEGER,    0, 0, 0, RESUTIL_PROPITEM_READ_ONLY | RESUTIL_PROPITEM_IN_MEMORY, 0 }

#define CLUSRESDLL_STATUS_OFFLINE_BUSY                           0x00000001
#define CLUSRESDLL_STATUS_OFFLINE_SOURCE_THROTTLED               0x00000002
#define CLUSRESDLL_STATUS_OFFLINE_DESTINATION_THROTTLED          0x00000004
#define CLUSRESDLL_STATUS_OFFLINE_DESTINATION_REJECTED           0x00000008
#define CLUSRESDLL_STATUS_INSUFFICIENT_MEMORY                    0x00000010
#define CLUSRESDLL_STATUS_INSUFFICIENT_PROCESSOR                 0x00000020
#define CLUSRESDLL_STATUS_INSUFFICIENT_OTHER_RESOURCES           0x00000040
#define CLUSRESDLL_STATUS_INVALID_PARAMETERS                     0x00000080
#define CLUSRESDLL_STATUS_NETWORK_NOT_AVAILABLE                  0x00000100

typedef struct RESOURCE_STATUS_EX {
    CLUSTER_RESOURCE_STATE      ResourceState;
    DWORD                       CheckPoint;
    HANDLE                      EventHandle;
    DWORD                       ApplicationSpecificErrorCode;
    DWORD                       Flags;
    DWORD                       WaitHint;
} RESOURCE_STATUS_EX, *PRESOURCE_STATUS_EX;

typedef
DWORD
(_stdcall *PSET_RESOURCE_STATUS_ROUTINE_EX) (
    IN RESOURCE_HANDLE ResourceHandle,
    IN PRESOURCE_STATUS_EX ResourceStatus
    );

#define ResUtilInitializeResourceStatusEx( _resource_status_ ) \
    ZeroMemory( _resource_status_, sizeof(RESOURCE_STATUS_EX) )

#endif

#define ResUtilInitializeResourceStatus( _resource_status_ ) \
    ZeroMemory( _resource_status_, sizeof(RESOURCE_STATUS) )

//
// Define Resource DLL callback method for updating the state of a resource.
//

typedef
DWORD
(_stdcall *PSET_RESOURCE_STATUS_ROUTINE) (
    IN RESOURCE_HANDLE ResourceHandle,
    IN PRESOURCE_STATUS ResourceStatus
    );

//
// Define Resource DLL callback method for notifying that a quorum
// resource DLL failed to hold the quorum resource.
//
typedef
VOID
(_stdcall *PQUORUM_RESOURCE_LOST) (
    IN RESOURCE_HANDLE Resource
    );

//
// Define Resource DLL callback method for logging events.
//
typedef enum LOG_LEVEL {
    LOG_INFORMATION,
    LOG_WARNING,
    LOG_ERROR,
    LOG_SEVERE
} LOG_LEVEL, *PLOG_LEVEL;

typedef
VOID
(_stdcall *PLOG_EVENT_ROUTINE) (
    IN RESOURCE_HANDLE ResourceHandle,
    IN LOG_LEVEL LogLevel,
    IN LPCWSTR FormatString,
    ...
    );

typedef
RESID
(_stdcall *POPEN_ROUTINE) (
    IN LPCWSTR ResourceName,
    IN HKEY ResourceKey,
    IN RESOURCE_HANDLE ResourceHandle
    );

typedef
VOID
(_stdcall *PCLOSE_ROUTINE) (
    IN RESID Resource
    );

typedef
DWORD
(_stdcall *PONLINE_ROUTINE) (
    IN RESID Resource,
    IN OUT LPHANDLE EventHandle
    );

typedef
DWORD
(_stdcall *POFFLINE_ROUTINE) (
    IN RESID Resource
    );

typedef
VOID
(_stdcall *PTERMINATE_ROUTINE) (
    IN RESID Resource
    );

typedef
BOOL
(_stdcall *PIS_ALIVE_ROUTINE) (
    IN RESID Resource
    );

typedef
BOOL
(_stdcall *PLOOKS_ALIVE_ROUTINE) (
    IN RESID Resource
    );

typedef
DWORD
(_stdcall *PARBITRATE_ROUTINE) (
    IN RESID Resource,
    IN PQUORUM_RESOURCE_LOST LostQuorumResource
    );

typedef
DWORD
(_stdcall *PRELEASE_ROUTINE) (
    IN RESID Resource
    );

typedef
DWORD
(_stdcall *PRESOURCE_CONTROL_ROUTINE) (
    IN RESID Resource,
    IN DWORD ControlCode,
    IN PVOID InBuffer,
    IN DWORD InBufferSize,
    OUT PVOID OutBuffer,
    IN DWORD OutBufferSize,
    OUT LPDWORD BytesReturned
    );

typedef
DWORD
(_stdcall *PRESOURCE_TYPE_CONTROL_ROUTINE) (
    IN LPCWSTR ResourceTypeName,
    IN DWORD ControlCode,
    IN PVOID InBuffer,
    IN DWORD InBufferSize,
    OUT PVOID OutBuffer,
    IN DWORD OutBufferSize,
    OUT LPDWORD BytesReturned
    );


#if CLUSAPI_VERSION >= CLUSAPI_VERSION_WINDOWS8

#define CLUS_RESDLL_OPEN_RECOVER_MONITOR_STATE 0x00000001

typedef
RESID
(_stdcall *POPEN_V2_ROUTINE) (
    _In_ LPCWSTR ResourceName,
    _In_ HKEY ResourceKey,
    _In_ RESOURCE_HANDLE ResourceHandle,
    _In_ DWORD OpenFlags
    );

#define CLUS_RESDLL_ONLINE_RECOVER_MONITOR_STATE          0x00000001
#define CLUS_RESDLL_ONLINE_IGNORE_RESOURCE_STATUS         0x00000002
#define CLUS_RESDLL_ONLINE_RETURN_TO_SOURCE_NODE_ON_ERROR 0x00000004
#define CLUS_RESDLL_ONLINE_RESTORE_ONLINE_STATE           0x00000008
#define CLUS_RESDLL_ONLINE_IGNORE_NETWORK_CONNECTIVITY    0x00000010

typedef
DWORD
(_stdcall *PONLINE_V2_ROUTINE) (
    _In_ RESID Resource,
    _Out_ LPHANDLE EventHandle,
    _In_ DWORD OnlineFlags,
    _In_reads_bytes_opt_(InBufferSize) PBYTE InBuffer,
    _In_ DWORD InBufferSize,
    _In_ DWORD Reserved /*Reserved*/

    );


#define CLUS_RESDLL_OFFLINE_IGNORE_RESOURCE_STATUS                    0x00000001
#define CLUS_RESDLL_OFFLINE_RETURN_TO_SOURCE_NODE_ON_ERROR            0x00000002
#define CLUS_RESDLL_OFFLINE_QUEUE_ENABLED                             0x00000004
#define CLUS_RESDLL_OFFLINE_RETURNING_TO_SOURCE_NODE_BECAUSE_OF_ERROR 0x00000008
#define CLUS_RESDLL_OFFLINE_DUE_TO_EMBEDDED_FAILURE                   0x00000010
#define CLUS_RESDLL_OFFLINE_IGNORE_NETWORK_CONNECTIVITY               0x00000020
#define CLUS_RESDLL_OFFLINE_DO_NOT_UPDATE_PERSISTENT_STATE            0x00000040

typedef
DWORD
(_stdcall *POFFLINE_V2_ROUTINE) (
    _In_ RESID Resource,
    _In_opt_ LPCWSTR DestinationNodeName,
    _In_ DWORD OfflineFlags,
    _In_reads_bytes_opt_(InBufferSize) PBYTE InBuffer,
    _In_ DWORD InBufferSize,
    _In_ DWORD Reserved /*Reserved*/
    );

typedef
DWORD
(_stdcall *PCANCEL_ROUTINE) (
    IN RESID Resource,
    IN DWORD CancelFlags_RESERVED /*RESERVED*/
    );

typedef INT64 PRESTYPE_CTL_CTX;
typedef INT64 PRES_CTL_CTX;

typedef
DWORD
(_stdcall *PBEGIN_RESCALL_ROUTINE)(
    IN RESID Resource,
    IN DWORD ControlCode,
    IN PVOID InBuffer,
    IN DWORD InBufferSize,
    OUT PVOID OutBuffer,
    IN DWORD OutBufferSize,
    OUT LPDWORD BytesReturned,
    IN PRES_CTL_CTX context,
    OUT PBOOL ReturnedAsynchronously
    );

typedef
DWORD
(_stdcall *PBEGIN_RESTYPECALL_ROUTINE)(
    IN LPCWSTR ResourceTypeName,
    IN DWORD ControlCode,
    IN PVOID InBuffer,
    IN DWORD InBufferSize,
    OUT PVOID OutBuffer,
    IN DWORD OutBufferSize,
    OUT LPDWORD BytesReturned,
    IN PRESTYPE_CTL_CTX context,
    OUT PBOOL ReturnedAsynchronously
    );
#endif

typedef enum _RESOURCE_EXIT_STATE {
    ResourceExitStateContinue,
    ResourceExitStateTerminate,
    ResourceExitStateMax
} RESOURCE_EXIT_STATE;

#if CLUSAPI_VERSION >= CLUSAPI_VERSION_WINTHRESHOLD

typedef
DWORD
(_stdcall *PBEGIN_RESCALL_AS_USER_ROUTINE)(
    IN RESID Resource,
    IN HANDLE TokenHandle,
    IN DWORD ControlCode,
    IN PVOID InBuffer,
    IN DWORD InBufferSize,
    OUT PVOID OutBuffer,
    IN DWORD OutBufferSize,
    OUT LPDWORD BytesReturned,
    IN PRES_CTL_CTX context,
    OUT PBOOL ReturnedAsynchronously
    );

typedef
DWORD
(_stdcall *PBEGIN_RESTYPECALL_AS_USER_ROUTINE)(
    IN LPCWSTR ResourceTypeName,
    IN HANDLE TokenHandle,
    IN DWORD ControlCode,
    IN PVOID InBuffer,
    IN DWORD InBufferSize,
    OUT PVOID OutBuffer,
    IN DWORD OutBufferSize,
    OUT LPDWORD BytesReturned,
    IN PRESTYPE_CTL_CTX context,
    OUT PBOOL ReturnedAsynchronously
    );

#define CLUS_RESDLL_OPEN_DONT_DELETE_TEMP_DISK 0x00000002

#define RESTYPE_MONITOR_SHUTTING_DOWN_NODE_STOP         0x00000001
#define RESTYPE_MONITOR_SHUTTING_DOWN_CLUSSVC_CRASH     0x00000002

#endif //CLUSAPI_VERSION >= CLUSAPI_VERSION_WINTHRESHOLD


//***************************************************************
//
// Define the Function Table Format
//
//***************************************************************

//
// Version 1 Resource DLL Interface definition
//
typedef struct CLRES_V1_FUNCTIONS {
    POPEN_ROUTINE Open;
    PCLOSE_ROUTINE Close;
    PONLINE_ROUTINE Online;
    POFFLINE_ROUTINE Offline;
    PTERMINATE_ROUTINE Terminate;
    PLOOKS_ALIVE_ROUTINE LooksAlive;
    PIS_ALIVE_ROUTINE IsAlive;
    PARBITRATE_ROUTINE Arbitrate;
    PRELEASE_ROUTINE Release;
    PRESOURCE_CONTROL_ROUTINE ResourceControl;
    PRESOURCE_TYPE_CONTROL_ROUTINE ResourceTypeControl;
} CLRES_V1_FUNCTIONS, *PCLRES_V1_FUNCTIONS;

//
// Version 2 Resource DLL Interface definition
//

#if CLUSAPI_VERSION >= CLUSAPI_VERSION_WINDOWS8


typedef struct CLRES_V2_FUNCTIONS {
    POPEN_V2_ROUTINE Open;
    PCLOSE_ROUTINE Close;
    PONLINE_V2_ROUTINE Online;
    POFFLINE_V2_ROUTINE Offline;
    PTERMINATE_ROUTINE Terminate;
    PLOOKS_ALIVE_ROUTINE LooksAlive;
    PIS_ALIVE_ROUTINE IsAlive;
    PARBITRATE_ROUTINE Arbitrate;
    PRELEASE_ROUTINE Release;
    PRESOURCE_CONTROL_ROUTINE ResourceControl;
    PRESOURCE_TYPE_CONTROL_ROUTINE ResourceTypeControl;
    PCANCEL_ROUTINE Cancel;
} CLRES_V2_FUNCTIONS, *PCLRES_V2_FUNCTIONS;

//
// Version 3 Resource DLL Interface definition
//

typedef struct CLRES_V3_FUNCTIONS {
    POPEN_V2_ROUTINE Open;
    PCLOSE_ROUTINE Close;
    PONLINE_V2_ROUTINE Online;
    POFFLINE_V2_ROUTINE Offline;
    PTERMINATE_ROUTINE Terminate;
    PLOOKS_ALIVE_ROUTINE LooksAlive;
    PIS_ALIVE_ROUTINE IsAlive;
    PARBITRATE_ROUTINE Arbitrate;
    PRELEASE_ROUTINE Release;
    PBEGIN_RESCALL_ROUTINE BeginResourceControl;
    PBEGIN_RESTYPECALL_ROUTINE BeginResourceTypeControl;
    PCANCEL_ROUTINE Cancel;
} CLRES_V3_FUNCTIONS, *PCLRES_V3_FUNCTIONS;
#endif

#if CLUSAPI_VERSION >= CLUSAPI_VERSION_WINTHRESHOLD
//
// Version 4 Resource DLL Interface definition
//

typedef struct CLRES_V4_FUNCTIONS {
    POPEN_V2_ROUTINE Open;
    PCLOSE_ROUTINE Close;
    PONLINE_V2_ROUTINE Online;
    POFFLINE_V2_ROUTINE Offline;
    PTERMINATE_ROUTINE Terminate;
    PLOOKS_ALIVE_ROUTINE LooksAlive;
    PIS_ALIVE_ROUTINE IsAlive;
    PARBITRATE_ROUTINE Arbitrate;
    PRELEASE_ROUTINE Release;
    PBEGIN_RESCALL_ROUTINE BeginResourceControl;
    PBEGIN_RESTYPECALL_ROUTINE BeginResourceTypeControl;
    PCANCEL_ROUTINE Cancel;
    PBEGIN_RESCALL_AS_USER_ROUTINE BeginResourceControlAsUser;
    PBEGIN_RESTYPECALL_AS_USER_ROUTINE BeginResourceTypeControlAsUser;
} CLRES_V4_FUNCTIONS, *PCLRES_V4_FUNCTIONS;

#endif //CLUSAPI_VERSION >= CLUSAPI_VERSION_WINTHRESHOLD

//
// Resource DLL Function Table definition
//
#if _MSC_VER >= 1200
#pragma warning(push)
#endif
#pragma warning( disable : 4201 ) // nonstandard extension used : nameless struct/union
typedef struct CLRES_FUNCTION_TABLE {
    DWORD   TableSize;
    DWORD   Version;
    union {
        CLRES_V1_FUNCTIONS V1Functions;
#if CLUSAPI_VERSION >= CLUSAPI_VERSION_WINDOWS8
        CLRES_V2_FUNCTIONS V2Functions;
        CLRES_V3_FUNCTIONS V3Functions;
#endif
#if CLUSAPI_VERSION >= CLUSAPI_VERSION_WINTHRESHOLD
        CLRES_V4_FUNCTIONS V4Functions;
#endif
    } DUMMYUNIONNAME;
} CLRES_FUNCTION_TABLE, *PCLRES_FUNCTION_TABLE;
#if _MSC_VER >= 1200
#pragma warning(pop)
#else
#pragma warning( default : 4201 ) // nonstandard extension used : nameless struct/union
#endif

//
// Define the Resource DLL Startup routine. This is the only routine
// that should be exported from a resource DLL.
//

//
// Calculate the byte offset of a field in a structure of type type.
//

#ifndef FIELD_OFFSET
#define FIELD_OFFSET(type, field)    ((LONG)&(((type *)0)->field))
#endif

//
// large ints need more space than what was originally allocated.
//
typedef struct RESUTIL_LARGEINT_DATA {
    LARGE_INTEGER   Default;
    LARGE_INTEGER   Minimum;
    LARGE_INTEGER   Maximum;
} RESUTIL_LARGEINT_DATA, *PRESUTIL_LARGEINT_DATA;

typedef struct RESUTIL_ULARGEINT_DATA {
    ULARGE_INTEGER  Default;
    ULARGE_INTEGER  Minimum;
    ULARGE_INTEGER  Maximum;
} RESUTIL_ULARGEINT_DATA, *PRESUTIL_ULARGEINT_DATA;

typedef struct RESUTIL_FILETIME_DATA {
    FILETIME  Default;
    FILETIME  Minimum;
    FILETIME  Maximum;
} RESUTIL_FILETIME_DATA, *PRESUTIL_FILETIME_DATA;

//
// Property list structures and functions
//
typedef struct RESUTIL_PROPERTY_ITEM {
    LPWSTR  Name;               // Property name
    LPWSTR  KeyName;            // Name of value in cluster database
    DWORD   Format;             // Format: REG_SZ, REG_DWORD, etc.
    union {
        DWORD_PTR               DefaultPtr;
        DWORD                   Default;     // Default value
        LPVOID                  lpDefault;
        PRESUTIL_LARGEINT_DATA  LargeIntData;
        PRESUTIL_ULARGEINT_DATA ULargeIntData;
        PRESUTIL_FILETIME_DATA  FileTimeData;
    } DUMMYUNIONNAME;
    DWORD   Minimum;            // Minimum value
    DWORD   Maximum;            // Maximum value
    DWORD   Flags;              // Flags for this item
#define RESUTIL_PROPITEM_READ_ONLY    0x00000001  // Property is read-only
#define RESUTIL_PROPITEM_REQUIRED     0x00000002  // Property is required
#define RESUTIL_PROPITEM_SIGNED       0x00000004  // Numeric property is signed (defaults to unsigned)
#define RESUTIL_PROPITEM_IN_MEMORY    0x00000008  // Node-Local In-Memory Properties are not stored in Cluster Database

    DWORD   Offset;             // Byte offset to value in parameter block
                                //   Assumes MULTI_SZ and BINARY parameters
                                //   are LPWSTRs followed by DWORDs for length
} RESUTIL_PROPERTY_ITEM, *PRESUTIL_PROPERTY_ITEM;


typedef
DWORD
(_stdcall *PSTARTUP_ROUTINE) (
    IN LPCWSTR ResourceType,
    IN DWORD MinVersionSupported,
    IN DWORD MaxVersionSupported,
    IN PSET_RESOURCE_STATUS_ROUTINE SetResourceStatus,
    IN PLOG_EVENT_ROUTINE LogEvent,
    OUT PCLRES_FUNCTION_TABLE *FunctionTable
    );

#if CLUSAPI_VERSION >= CLUSAPI_VERSION_WINDOWS8

typedef enum _FAILURE_TYPE {
    FAILURE_TYPE_GENERAL            = 0,
    FAILURE_TYPE_EMBEDDED           = 1,
    FAILURE_TYPE_NETWORK_LOSS       = 2
} FAILURE_TYPE, *PFAILURE_TYPE;

typedef enum CLUSTER_RESOURCE_APPLICATION_STATE
{
    ClusterResourceApplicationStateUnknown = 1,
    ClusterResourceApplicationOSHeartBeat,
    ClusterResourceApplicationReady
} CLUSTER_RESOURCE_APPLICATION_STATE;

typedef
DWORD
(_stdcall *PSET_RESOURCE_LOCKED_MODE_ROUTINE) (
    _In_ RESOURCE_HANDLE ResourceHandle,
    _In_ BOOL LockedModeEnabled,
    _In_ DWORD LockedModeReason
);

typedef
DWORD
(_stdcall *PSIGNAL_FAILURE_ROUTINE) (
    _In_ RESOURCE_HANDLE ResourceHandle,
    _In_ FAILURE_TYPE FailureType,
    _In_ DWORD ApplicationSpecificErrorCode
);

typedef
DWORD
(_stdcall *PSET_RESOURCE_INMEMORY_NODELOCAL_PROPERTIES_ROUTINE) (
    _In_ RESOURCE_HANDLE ResourceHandle,
    _In_ unsigned char * propertyListBuffer,
    _In_ DWORD propertyListBufferSize
);

typedef
DWORD
(_stdcall *PEND_CONTROL_CALL) (
    _In_ const PRES_CTL_CTX context,
    _In_ DWORD status
);

typedef
DWORD
(_stdcall *PEND_TYPE_CONTROL_CALL) (
    _In_ const PRESTYPE_CTL_CTX context,
    _In_ DWORD status
);

typedef
DWORD
(_stdcall *PEXTEND_RES_CONTROL_CALL) (
    _In_ const PRES_CTL_CTX context,
    _In_ DWORD newTimeoutInMs
);

typedef
DWORD
(_stdcall *PEXTEND_RES_TYPE_CONTROL_CALL) (
    _In_ const PRESTYPE_CTL_CTX context,
    _In_ DWORD newTimeoutInMs
);

typedef
DWORD
(_stdcall *PRAISE_RES_TYPE_NOTIFICATION) (
    _In_ LPCWSTR ResourceType,
    _In_reads_bytes_(payloadSize) const PBYTE pPayload,
    _In_ DWORD payloadSize
);

typedef
DWORD
(_stdcall *PCHANGE_RESOURCE_PROCESS_FOR_DUMPS) (
    _In_ RESOURCE_HANDLE resource,
    _In_ LPCWSTR processName,
    _In_ DWORD processId,
    _In_ BOOL isAdd
    );
typedef
DWORD
(_stdcall *PCHANGE_RES_TYPE_PROCESS_FOR_DUMPS) (
    _In_ LPCWSTR resourceTypeName,
    _In_ LPCWSTR processName,
    _In_ DWORD processId,
    _In_ BOOL isAdd
    );

typedef
DWORD
(_stdcall *PSET_INTERNAL_STATE) (
    _In_ RESOURCE_HANDLE,
    _In_ CLUSTER_RESOURCE_APPLICATION_STATE stateType,
    _In_ BOOL active
    );

#define LOCKED_MODE_FLAGS_DONT_REMOVE_FROM_MOVE_QUEUE 0x00000001

typedef
DWORD
(_stdcall *PSET_RESOURCE_LOCKED_MODE_EX_ROUTINE) (
    _In_ RESOURCE_HANDLE ResourceHandle,
    _In_ BOOL LockedModeEnabled,
    _In_ DWORD LockedModeReason,
    _In_ DWORD LockedModeFlags
);

typedef struct CLRES_CALLBACK_FUNCTION_TABLE {
    PLOG_EVENT_ROUTINE                                                         LogEvent;
    PSET_RESOURCE_STATUS_ROUTINE_EX                                            SetResourceStatusEx;
    PSET_RESOURCE_LOCKED_MODE_ROUTINE                                          SetResourceLockedMode;
    PSIGNAL_FAILURE_ROUTINE                                                    SignalFailure;
    PSET_RESOURCE_INMEMORY_NODELOCAL_PROPERTIES_ROUTINE                        SetResourceInMemoryNodeLocalProperties;
    PEND_CONTROL_CALL                                                          EndControlCall;
    PEND_TYPE_CONTROL_CALL                                                     EndTypeControlCall;
    PEXTEND_RES_CONTROL_CALL                                                   ExtendControlCall;
    PEXTEND_RES_TYPE_CONTROL_CALL                                              ExtendTypeControlCall;
    PRAISE_RES_TYPE_NOTIFICATION                                               RaiseResTypeNotification;
    PCHANGE_RESOURCE_PROCESS_FOR_DUMPS                                         ChangeResourceProcessForDumps;
    PCHANGE_RES_TYPE_PROCESS_FOR_DUMPS                                         ChangeResTypeProcessForDumps;
    PSET_INTERNAL_STATE                                                        SetInternalState;
    PSET_RESOURCE_LOCKED_MODE_EX_ROUTINE                                       SetResourceLockedModeEx;
}CLRES_CALLBACK_FUNCTION_TABLE, *PCLRES_CALLBACK_FUNCTION_TABLE;

typedef
DWORD
(_stdcall *PSTARTUP_EX_ROUTINE) (
    IN LPCWSTR                            ResourceType,
    IN DWORD                              MinVersionSupported,
    IN DWORD                              MaxVersionSupported,
    IN PCLRES_CALLBACK_FUNCTION_TABLE     MonitorCallbackFunctions,
    OUT PCLRES_FUNCTION_TABLE *           ResourceDllInterfaceFunctions
    );

#endif
//
// Define layout of shared memory used for tracking Resource Monitor state.
//
typedef enum RESOURCE_MONITOR_STATE {
    RmonInitializing,
    RmonIdle,
    RmonStartingResource,
    RmonInitializingResource,
    RmonOnlineResource,
    RmonOfflineResource,
    RmonShutdownResource,
    RmonDeletingResource,
    RmonIsAlivePoll,
    RmonLooksAlivePoll,
    RmonArbitrateResource,
    RmonReleaseResource,
    RmonResourceControl,
    RmonResourceTypeControl,
    RmonTerminateResource,
    RmonDeadlocked
} RESOURCE_MONITOR_STATE;

typedef struct MONITOR_STATE {
    LARGE_INTEGER LastUpdate;
    RESOURCE_MONITOR_STATE State;
    HANDLE ActiveResource;
    BOOL   ResmonStop;
} MONITOR_STATE, *PMONITOR_STATE;

// used for packaging up post-upgrade state information
// note that in some error cases, the old version fields can be 0
typedef struct POST_UPGRADE_VERSION_INFO {
    DWORD newMajorVersion;
    DWORD newUpgradeVersion;
    DWORD oldMajorVersion;
    DWORD oldUpgradeVersion;
    DWORD reserved;
} POST_UPGRADE_VERSION_INFO, *PPOST_UPGRADE_VERSION_INFO;

// Cluster Health Fault Structs

#define CLUSTER_HEALTH_FAULT_PROPERTY_NAME L"ClusterHealth"

#define CLUSTER_HEALTH_FAULT_ARGS 7
#define CLUSTER_HEALTH_FAULT_ID 0
#define CLUSTER_HEALTH_FAULT_ERRORTYPE 1
#define CLUSTER_HEALTH_FAULT_ERRORCODE 2
#define CLUSTER_HEALTH_FAULT_DESCRIPTION 3
#define CLUSTER_HEALTH_FAULT_PROVIDER 4
#define CLUSTER_HEALTH_FAULT_FLAGS 5
#define CLUSTER_HEALTH_FAULT_RESERVED 6

#define CLUSTER_HEALTH_FAULT_ID_LABEL L"Id"
#define CLUSTER_HEALTH_FAULT_ERRORTYPE_LABEL L"ErrorType"
#define CLUSTER_HEALTH_FAULT_ERRORCODE_LABEL L"ErrorCode"
#define CLUSTER_HEALTH_FAULT_DESCRIPTION_LABEL L"Description"
#define CLUSTER_HEALTH_FAULT_PROVIDER_LABEL L"Provider"
#define CLUSTER_HEALTH_FAULT_FLAGS_LABEL L"Flags"
#define CLUSTER_HEALTH_FAULT_RESERVED_LABEL L"Reserved"

typedef struct _CLUSTER_HEALTH_FAULT{
    LPWSTR Id;
    DWORD ErrorType;
    DWORD ErrorCode;
    LPWSTR Description;
    LPWSTR Provider;
    DWORD Flags;
    DWORD Reserved;
} CLUSTER_HEALTH_FAULT, *PCLUSTER_HEALTH_FAULT;

typedef struct _CLUSTER_HEALTH_FAULT_ARRAY
{
    DWORD numFaults;
    CLUSTER_HEALTH_FAULT * faults;
} CLUSTER_HEALTH_FAULT_ARRAY, *PCLUSTER_HEALTH_FAULT_ARRAY;

//
//Health fault utility routines
//
DWORD
InitializeClusterHealthFault(
    _Inout_ CLUSTER_HEALTH_FAULT* clusterHealthFault
    );

DWORD
InitializeClusterHealthFaultArray(
    _Inout_ CLUSTER_HEALTH_FAULT_ARRAY* clusterHealthFaultArray
    );

DWORD
FreeClusterHealthFault(
    _Inout_ CLUSTER_HEALTH_FAULT* clusterHealthFault
    );

DWORD
FreeClusterHealthFaultArray(
    _Inout_ CLUSTER_HEALTH_FAULT_ARRAY* clusterHealthFaultArray
    );

DWORD
WINAPI
ClusGetClusterHealthFaults(
    _In_ HCLUSTER hCluster,
    _Out_ CLUSTER_HEALTH_FAULT_ARRAY* objects,
    _In_ DWORD flags);

DWORD
WINAPI
ClusRemoveClusterHealthFault(
    _In_ HCLUSTER hCluster,
    _In_ LPCWSTR id,
    _In_ DWORD flags
);

DWORD
WINAPI
ClusAddClusterHealthFault(
    _In_ HCLUSTER hCluster,
    _In_ CLUSTER_HEALTH_FAULT* failure,
    _In_ DWORD /*flags*/
);

//
// Resource Utility Routines
//

DWORD
WINAPI
ResUtilStartResourceService(
    IN LPCWSTR pszServiceName,
    OUT LPSC_HANDLE phServiceHandle
    );

typedef DWORD
(WINAPI * PRESUTIL_START_RESOURCE_SERVICE)(
    IN LPCWSTR pszServiceName,
    OUT LPSC_HANDLE phServiceHandle
    );

DWORD
WINAPI
ResUtilVerifyResourceService(
    IN LPCWSTR pszServiceName
    );

typedef DWORD
(WINAPI * PRESUTIL_VERIFY_RESOURCE_SERVICE)(
    IN LPCWSTR pszServiceName
    );

DWORD
WINAPI
ResUtilStopResourceService(
    IN LPCWSTR pszServiceName
    );

typedef DWORD
(WINAPI * PRESUTIL_STOP_RESOURCE_SERVICE)(
    IN LPCWSTR pszServiceName
    );

DWORD
WINAPI
ResUtilVerifyService(
    IN SC_HANDLE hServiceHandle
    );

typedef DWORD
(WINAPI * PRESUTIL_VERIFY_SERVICE)(
    IN SC_HANDLE hServiceHandle
    );

DWORD
WINAPI
ResUtilStopService(
    IN SC_HANDLE hServiceHandle
    );

typedef DWORD
(WINAPI * PRESUTIL_STOP_SERVICE)(
    IN SC_HANDLE hServiceHandle
    );

DWORD
WINAPI
ResUtilCreateDirectoryTree(
    IN LPCWSTR pszPath
    );

typedef DWORD
(WINAPI * PRESUTIL_CREATE_DIRECTORY_TREE)(
    IN LPCWSTR pszPath
    );

BOOL
WINAPI
ResUtilIsPathValid(
    IN LPCWSTR pszPath
    );

typedef BOOL
(WINAPI * PRESUTIL_IS_PATH_VALID)(
    IN LPCWSTR pszPath
    );

DWORD
WINAPI
ResUtilEnumProperties(
    _In_ const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    _Out_writes_bytes_to_(cbOutPropertiesSize, *pcbBytesReturned) LPWSTR pszOutProperties,
    _In_ DWORD cbOutPropertiesSize,
    _Out_ LPDWORD pcbBytesReturned,
    _Out_ LPDWORD pcbRequired
    );

typedef DWORD
(WINAPI * PRESUTIL_ENUM_PROPERTIES)(
    _In_ const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    _Out_writes_bytes_to_(cbOutPropertiesSize, *pcbBytesReturned) LPWSTR pszOutProperties,
    _In_ DWORD cbOutPropertiesSize,
    _Out_ LPDWORD pcbBytesReturned,
    _Out_ LPDWORD pcbRequired
    );

DWORD
WINAPI
ResUtilEnumPrivateProperties(
    _In_ HKEY hkeyClusterKey,
    _Out_writes_bytes_to_(cbOutPropertiesSize, *pcbBytesReturned) LPWSTR pszOutProperties,
    _In_ DWORD cbOutPropertiesSize,
    _Out_ LPDWORD pcbBytesReturned,
    _Out_ LPDWORD pcbRequired
    );

typedef DWORD
(WINAPI * PRESUTIL_ENUM_PRIVATE_PROPERTIES)(
    _In_ HKEY hkeyClusterKey,
    _Out_writes_bytes_to_(cbOutPropertiesSize, *pcbBytesReturned) LPWSTR pszOutProperties,
    _In_ DWORD cbOutPropertiesSize,
    _Out_ LPDWORD pcbBytesReturned,
    _Out_ LPDWORD pcbRequired
    );

DWORD
WINAPI
ResUtilGetProperties(
    _In_ HKEY hkeyClusterKey,
    _In_ const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    _Out_writes_bytes_to_(cbOutPropertyListSize, *pcbBytesReturned) PVOID pOutPropertyList,
    _In_ DWORD cbOutPropertyListSize,
    _Out_ LPDWORD pcbBytesReturned,
    _Out_ LPDWORD pcbRequired
    );

typedef DWORD
(WINAPI * PRESUTIL_GET_PROPERTIES)(
    _In_ HKEY hkeyClusterKey,
    _In_ const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    _Out_writes_bytes_to_(cbOutPropertyListSize, *pcbBytesReturned) PVOID pOutPropertyList,
    _In_ DWORD cbOutPropertyListSize,
    _Out_ LPDWORD pcbBytesReturned,
    _Out_ LPDWORD pcbRequired
    );

DWORD
WINAPI
ResUtilGetAllProperties(
    _In_ HKEY hkeyClusterKey,
    _In_ const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    _Out_writes_bytes_to_(cbOutPropertyListSize, *pcbBytesReturned) PVOID pOutPropertyList,
    _In_ DWORD cbOutPropertyListSize,
    _Out_ LPDWORD pcbBytesReturned,
    _Out_ LPDWORD pcbRequired
    );

typedef DWORD
(WINAPI * PRESUTIL_GET_ALL_PROPERTIES)(
    _In_ HKEY hkeyClusterKey,
    _In_ const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    _Out_writes_bytes_to_(cbOutPropertyListSize, *pcbBytesReturned) PVOID pOutPropertyList,
    _In_ DWORD cbOutPropertyListSize,
    _Out_ LPDWORD pcbBytesReturned,
    _Out_ LPDWORD pcbRequired
    );

DWORD
WINAPI
ResUtilGetPrivateProperties(
    _In_ HKEY hkeyClusterKey,
    _Out_writes_bytes_to_(cbOutPropertyListSize, *pcbBytesReturned) PVOID pOutPropertyList,
    _In_ DWORD cbOutPropertyListSize,
    _Out_ LPDWORD pcbBytesReturned,
    _Out_ LPDWORD pcbRequired
    );

typedef DWORD
(WINAPI * PRESUTIL_GET_PRIVATE_PROPERTIES)(
    _In_ HKEY hkeyClusterKey,
    _Out_writes_bytes_to_(cbOutPropertyListSize, *pcbBytesReturned) PVOID pOutPropertyList,
    _In_ DWORD cbOutPropertyListSize,
    _Out_ LPDWORD pcbBytesReturned,
    _Out_ LPDWORD pcbRequired
    );

DWORD
WINAPI
ResUtilGetPropertySize(
    IN HKEY hkeyClusterKey,
    IN const PRESUTIL_PROPERTY_ITEM pPropertyTableItem,
    IN OUT LPDWORD pcbOutPropertyListSize,
    IN OUT LPDWORD pnPropertyCount
    );

typedef DWORD
(WINAPI * PRESUTIL_GET_PROPERTY_SIZE)(
    IN HKEY hkeyClusterKey,
    IN const PRESUTIL_PROPERTY_ITEM pPropertyTableItem,
    IN OUT LPDWORD pcbOutPropertyListSize,
    IN OUT LPDWORD pnPropertyCount
    );

_Success_( return == ERROR_SUCCESS )
DWORD
WINAPI
ResUtilGetProperty(
    _In_ HKEY hkeyClusterKey,
    _In_ const PRESUTIL_PROPERTY_ITEM pPropertyTableItem,
    _Inout_ _At_(*pOutPropertyItem, _Pre_readable_byte_size_(*pcbOutPropertyItemSize) _Post_readable_byte_size_(*pcbOutPropertyItemSize)) PVOID *pOutPropertyItem,
    _Inout_ LPDWORD pcbOutPropertyItemSize
    );

typedef
_Success_( return == ERROR_SUCCESS )
DWORD
(WINAPI * PRESUTIL_GET_PROPERTY)(
    _In_ HKEY hkeyClusterKey,
    _In_ const PRESUTIL_PROPERTY_ITEM pPropertyTableItem,
    _Inout_ _At_(*pOutPropertyItem, _Pre_readable_byte_size_(*pcbOutPropertyItemSize) _Post_readable_byte_size_(*pcbOutPropertyItemSize)) PVOID *pOutPropertyItem,
    _Inout_ LPDWORD pcbOutPropertyItemSize
    );

DWORD
WINAPI
ResUtilVerifyPropertyTable(
    _In_ const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    _Reserved_ PVOID Reserved,
    _In_ BOOL bAllowUnknownProperties,
    _In_reads_bytes_(cbInPropertyListSize) const PVOID pInPropertyList,
    _In_ DWORD cbInPropertyListSize,
    _Out_opt_ LPBYTE pOutParams
    );

typedef DWORD
(WINAPI * PRESUTIL_VERIFY_PROPERTY_TABLE)(
    _In_ const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    _Reserved_ PVOID Reserved,
    _In_ BOOL bAllowUnknownProperties,
    _In_reads_bytes_(cbInPropertyListSize) const PVOID pInPropertyList,
    _In_ DWORD cbInPropertyListSize,
    _Out_opt_ LPBYTE pOutParams
    );

DWORD
WINAPI
ResUtilSetPropertyTable(
    _In_ HKEY hkeyClusterKey,
    _In_ const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    _Reserved_ PVOID Reserved,
    _In_ BOOL bAllowUnknownProperties,
    _In_reads_bytes_(cbInPropertyListSize) const PVOID pInPropertyList,
    _In_ DWORD cbInPropertyListSize,
    _Out_opt_ LPBYTE pOutParams
    );

typedef DWORD
(WINAPI * PRESUTIL_SET_PROPERTY_TABLE)(
    _In_ HKEY hkeyClusterKey,
    _In_ const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    _Reserved_ PVOID Reserved,
    _In_ BOOL bAllowUnknownProperties,
    _In_reads_bytes_(cbInPropertyListSize) const PVOID pInPropertyList,
    _In_ DWORD cbInPropertyListSize,
    _Out_opt_ LPBYTE pOutParams
    );

DWORD
WINAPI
ResUtilSetPropertyTableEx(
    IN HKEY hkeyClusterKey,
    IN const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    IN PVOID Reserved,
    IN BOOL bAllowUnknownProperties,
    IN const PVOID pInPropertyList,
    IN DWORD cbInPropertyListSize,
    IN BOOL bForceWrite,
    OUT OPTIONAL LPBYTE pOutParams
    );

typedef DWORD
(WINAPI * PRESUTIL_SET_PROPERTY_TABLE_EX)(
    IN HKEY hkeyClusterKey,
    IN const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    IN PVOID Reserved,
    IN BOOL bAllowUnknownProperties,
    IN const PVOID pInPropertyList,
    IN DWORD cbInPropertyListSize,
    IN BOOL bForceWrite,
    OUT OPTIONAL LPBYTE pOutParams
    );

DWORD
WINAPI
ResUtilSetPropertyParameterBlock(
    IN HKEY hkeyClusterKey,
    IN const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    IN PVOID Reserved,
    IN const LPBYTE pInParams,
    IN const PVOID pInPropertyList,
    IN DWORD cbInPropertyListSize,
    OUT OPTIONAL LPBYTE pOutParams
    );

typedef DWORD
(WINAPI * PRESUTIL_SET_PROPERTY_PARAMETER_BLOCK)(
    IN HKEY hkeyClusterKey,
    IN const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    IN PVOID Reserved,
    IN const LPBYTE pInParams,
    IN const PVOID pInPropertyList,
    IN DWORD cbInPropertyListSize,
    OUT OPTIONAL LPBYTE pOutParams
    );

DWORD
WINAPI
ResUtilSetPropertyParameterBlockEx(
    IN HKEY hkeyClusterKey,
    IN const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    IN PVOID Reserved,
    IN const LPBYTE pInParams,
    IN const PVOID pInPropertyList,
    IN DWORD cbInPropertyListSize,
    IN BOOL bForceWrite,
    OUT OPTIONAL LPBYTE pOutParams
    );

typedef DWORD
(WINAPI * PRESUTIL_SET_PROPERTY_PARAMETER_BLOCK_EX)(
    IN HKEY hkeyClusterKey,
    IN const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    IN PVOID Reserved,
    IN const LPBYTE pInParams,
    IN const PVOID pInPropertyList,
    IN DWORD cbInPropertyListSize,
    IN BOOL bForceWrite,
    OUT OPTIONAL LPBYTE pOutParams
    );

DWORD
WINAPI
ResUtilSetUnknownProperties(
    _In_ HKEY hkeyClusterKey,
    _In_ const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    _In_reads_bytes_(cbInPropertyListSize) const PVOID pInPropertyList,
    _In_ DWORD cbInPropertyListSize
    );

typedef DWORD
(WINAPI * PRESUTIL_SET_UNKNOWN_PROPERTIES)(
    _In_ HKEY hkeyClusterKey,
    _In_ const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    _In_reads_bytes_(cbInPropertyListSize) const PVOID pInPropertyList,
    _In_ DWORD cbInPropertyListSize
    );

DWORD
WINAPI
ResUtilGetPropertiesToParameterBlock(
    _In_ HKEY hkeyClusterKey,
    _In_ const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    _Inout_ LPBYTE pOutParams,
    _In_ BOOL bCheckForRequiredProperties,
    _Outptr_result_maybenull_ LPWSTR * pszNameOfPropInError
    );

typedef DWORD
(WINAPI * PRESUTIL_GET_PROPERTIES_TO_PARAMETER_BLOCK)(
    IN HKEY hkeyClusterKey,
    IN const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    OUT LPBYTE pOutParams,
    IN BOOL bCheckForRequiredProperties,
    OUT OPTIONAL LPWSTR * pszNameOfPropInError
    );

typedef DWORD
(WINAPI * PRESUTIL_GET_PROPERTIES_TO_PARAMETER_BLOCK)(
    IN HKEY hkeyClusterKey,
    IN const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    OUT LPBYTE pOutParams,
    IN BOOL bCheckForRequiredProperties,
    OUT OPTIONAL LPWSTR * pszNameOfPropInError
    );

DWORD
WINAPI
ResUtilPropertyListFromParameterBlock(
    _In_ const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    _Out_writes_bytes_to_opt_(*pcbOutPropertyListSize, *pcbBytesReturned ) PVOID  pOutPropertyList,
    _Inout_ LPDWORD pcbOutPropertyListSize,
    _In_ const LPBYTE pInParams,
    _Out_ LPDWORD pcbBytesReturned,
    _Out_ LPDWORD pcbRequired
    );

typedef DWORD
(WINAPI * PRESUTIL_PROPERTY_LIST_FROM_PARAMETER_BLOCK)(
    _In_ const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    _Out_writes_bytes_to_opt_(*pcbOutPropertyListSize, *pcbBytesReturned ) PVOID  pOutPropertyList,
    _Inout_ LPDWORD pcbOutPropertyListSize,
    _In_ const LPBYTE pInParams,
    _Out_ LPDWORD pcbBytesReturned,
    _Out_ LPDWORD pcbRequired
    );

DWORD
WINAPI
ResUtilDupParameterBlock(
    OUT LPBYTE pOutParams,
    IN const LPBYTE pInParams,
    IN const PRESUTIL_PROPERTY_ITEM pPropertyTable
    );

typedef DWORD
(WINAPI * PRESUTIL_DUP_PARAMETER_BLOCK)(
    OUT LPBYTE pOutParams,
    IN const LPBYTE pInParams,
    IN const PRESUTIL_PROPERTY_ITEM pPropertyTable
    );

void
WINAPI
ResUtilFreeParameterBlock(
    IN OUT LPBYTE pOutParams,
    IN const LPBYTE pInParams,
    IN const PRESUTIL_PROPERTY_ITEM pPropertyTable
    );

typedef void
(WINAPI * PRESUTIL_FREE_PARAMETER_BLOCK)(
    IN OUT LPBYTE pOutParams,
    IN const LPBYTE pInParams,
    IN const PRESUTIL_PROPERTY_ITEM pPropertyTable
    );

DWORD
WINAPI
ResUtilAddUnknownProperties(
    IN HKEY hkeyClusterKey,
    IN const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    IN OUT PVOID pOutPropertyList,
    IN DWORD pcbOutPropertyListSize,
    IN OUT LPDWORD pcbBytesReturned,
    IN OUT LPDWORD pcbRequired
    );

typedef DWORD
(WINAPI * PRESUTIL_ADD_UNKNOWN_PROPERTIES)(
    IN HKEY hkeyClusterKey,
    IN const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    IN OUT PVOID pOutPropertyList,
    IN DWORD pcbOutPropertyListSize,
    IN OUT LPDWORD pcbBytesReturned,
    IN OUT LPDWORD pcbRequired
    );

DWORD
WINAPI
ResUtilSetPrivatePropertyList(
    _In_ HKEY hkeyClusterKey,
    _In_reads_bytes_(cbInPropertyListSize) const PVOID pInPropertyList,
    _In_ DWORD cbInPropertyListSize
    );

typedef DWORD
(WINAPI * PRESUTIL_SET_PRIVATE_PROPERTY_LIST)(
    _In_ HKEY hkeyClusterKey,
    _In_reads_bytes_(cbInPropertyListSize) const PVOID pInPropertyList,
    _In_ DWORD cbInPropertyListSize
    );

DWORD
WINAPI
ResUtilVerifyPrivatePropertyList(
    _In_reads_bytes_(cbInPropertyListSize) const PVOID pInPropertyList,
    _In_ DWORD cbInPropertyListSize
    );

typedef DWORD
(WINAPI * PRESUTIL_VERIFY_PRIVATE_PROPERTY_LIST)(
    _In_reads_bytes_(cbInPropertyListSize) const PVOID pInPropertyList,
    _In_ DWORD cbInPropertyListSize
    );

PWSTR
WINAPI
ResUtilDupString(
    IN LPCWSTR pszInString
    );

typedef PWSTR
(WINAPI * PRESUTIL_DUP_STRING)(
    IN LPCWSTR pszInString
    );

DWORD
WINAPI
ResUtilGetBinaryValue(
    _In_ HKEY hkeyClusterKey,
    _In_ LPCWSTR pszValueName,
    _Outptr_result_bytebuffer_to_maybenull_(*pcbOutValueSize, *pcbOutValueSize) LPBYTE *ppbOutValue,
    _Out_ LPDWORD pcbOutValueSize
    );

typedef DWORD
(WINAPI * PRESUTIL_GET_BINARY_VALUE)(
    _In_ HKEY hkeyClusterKey,
    _In_ LPCWSTR pszValueName,
    _Outptr_result_bytebuffer_to_maybenull_(*pcbOutValueSize, *pcbOutValueSize) LPBYTE *ppbOutValue,
    _Out_ LPDWORD pcbOutValueSize
    );

LPWSTR
WINAPI
ResUtilGetSzValue(
    IN HKEY hkeyClusterKey,
    IN LPCWSTR pszValueName
    );

typedef LPWSTR
(WINAPI * PRESUTIL_GET_SZ_VALUE)(
    IN HKEY hkeyClusterKey,
    IN LPCWSTR pszValueName
    );

LPWSTR
WINAPI
ResUtilGetExpandSzValue(
    IN HKEY hkeyClusterKey,
    IN LPCWSTR pszValueName,
    IN BOOL bExpand
    );

typedef LPWSTR
(WINAPI * PRESUTIL_GET_EXPAND_SZ_VALUE)(
    IN HKEY hkeyClusterKey,
    IN LPCWSTR pszValueName,
    IN BOOL bExpand
    );

FORCEINLINE
DWORD
WINAPI_INLINE
ResUtilGetMultiSzValue(
    _In_ HKEY hkeyClusterKey,
    _In_ LPCWSTR pszValueName,
    _Outptr_result_bytebuffer_to_maybenull_(*pcbOutValueSize, *pcbOutValueSize) LPWSTR *ppszOutValue,
    _Out_ LPDWORD pcbOutValueSize
    )
{
    return ResUtilGetBinaryValue( hkeyClusterKey, pszValueName, (LPBYTE *) ppszOutValue, pcbOutValueSize );
}

DWORD
WINAPI
ResUtilGetDwordValue(
    _In_ HKEY hkeyClusterKey,
    _In_ LPCWSTR pszValueName,
    _Out_ LPDWORD pdwOutValue,
    _In_ DWORD dwDefaultValue
    );

typedef DWORD
(WINAPI * PRESUTIL_GET_DWORD_VALUE)(
    _In_ HKEY hkeyClusterKey,
    _In_ LPCWSTR pszValueName,
    _Out_ LPDWORD pdwOutValue,
    _In_ DWORD dwDefaultValue
    );

DWORD
WINAPI
ResUtilGetQwordValue(
    _In_ HKEY hkeyClusterKey,
    _In_ LPCWSTR pszValueName,
    _Out_ PULONGLONG pqwOutValue,
    _In_ ULONGLONG qwDefaultValue
    );

typedef DWORD
(WINAPI * PRESUTIL_GET_QWORD_VALUE)(
    _In_ HKEY hkeyClusterKey,
    _In_ LPCWSTR pszValueName,
    _Out_ PULONGLONG pqwOutValue,
    _In_ ULONGLONG qwDefaultValue
    );

DWORD
WINAPI
ResUtilSetBinaryValue(
    _In_ HKEY hkeyClusterKey,
    _In_ LPCWSTR pszValueName,
    _In_reads_bytes_(cbNewValueSize) const LPBYTE pbNewValue,
    _In_ DWORD cbNewValueSize,
    _Inout_opt_ _At_(*ppbOutValue, _When_(*ppbOutValue != NULL, _Pre_readable_byte_size_(*pcbOutValueSize)) _Post_readable_byte_size_(*pcbOutValueSize))
            LPBYTE *ppbOutValue,
    _Inout_ LPDWORD pcbOutValueSize
    );

typedef DWORD
(WINAPI * PRESUTIL_SET_BINARY_VALUE)(
    _In_ HKEY hkeyClusterKey,
    _In_ LPCWSTR pszValueName,
    _In_reads_bytes_(cbNewValueSize) const LPBYTE pbNewValue,
    _In_ DWORD cbNewValueSize,
    _Inout_opt_ _At_(*ppbOutValue, _When_(*ppbOutValue != NULL, _Pre_readable_byte_size_(*pcbOutValueSize)) _Post_readable_byte_size_(*pcbOutValueSize))
            LPBYTE *ppbOutValue,
    _Inout_ LPDWORD pcbOutValueSize
    );

DWORD
WINAPI
ResUtilSetSzValue(
    _In_ HKEY hkeyClusterKey,
    _In_ LPCWSTR pszValueName,
    _In_ LPCWSTR pszNewValue,
    _Inout_opt_ LPWSTR *ppszOutString
    );

typedef DWORD
(WINAPI * PRESUTIL_SET_SZ_VALUE)(
    _In_ HKEY hkeyClusterKey,
    _In_ LPCWSTR pszValueName,
    _In_ LPCWSTR pszNewValue,
    _Inout_opt_ LPWSTR *ppszOutString
    );

DWORD
WINAPI
ResUtilSetExpandSzValue(
    _In_ HKEY hkeyClusterKey,
    _In_ LPCWSTR pszValueName,
    _In_ LPCWSTR pszNewValue,
    _Inout_opt_ LPWSTR *ppszOutString
    );

typedef DWORD
(WINAPI * PRESUTIL_SET_EXPAND_SZ_VALUE)(
    _In_ HKEY hkeyClusterKey,
    _In_ LPCWSTR pszValueName,
    _In_ LPCWSTR pszNewValue,
    _Inout_opt_ LPWSTR *ppszOutString
    );

DWORD
WINAPI
ResUtilSetMultiSzValue(
    _In_ HKEY hkeyClusterKey,
    _In_ LPCWSTR pszValueName,
    _In_reads_bytes_(cbNewValueSize) LPCWSTR pszNewValue,
    _In_ DWORD cbNewValueSize,
    _Outptr_opt_result_bytebuffer_to_(*pcbOutValueSize, *pcbOutValueSize) LPWSTR *ppszOutValue,
    _Inout_opt_ LPDWORD pcbOutValueSize
    );

typedef DWORD
(WINAPI * PRESUTIL_SET_MULTI_SZ_VALUE)(
    _In_ HKEY hkeyClusterKey,
    _In_ LPCWSTR pszValueName,
    _In_reads_bytes_(cbNewValueSize) LPCWSTR pszNewValue,
    _In_ DWORD cbNewValueSize,
    _Outptr_opt_result_bytebuffer_to_(*pcbOutValueSize, *pcbOutValueSize) LPWSTR *ppszOutValue,
    _Inout_opt_ LPDWORD pcbOutValueSize
    );

DWORD
WINAPI
ResUtilSetDwordValue(
    IN HKEY hkeyClusterKey,
    IN LPCWSTR pszValueName,
    IN DWORD dwNewValue,
    IN OUT LPDWORD pdwOutValue
    );

typedef DWORD
(WINAPI * PRESUTIL_SET_DWORD_VALUE)(
    IN HKEY hkeyClusterKey,
    IN LPCWSTR pszValueName,
    IN DWORD dwNewValue,
    IN OUT LPDWORD pdwOutValue
    );

DWORD
WINAPI
ResUtilSetQwordValue(
    _In_ HKEY hkeyClusterKey,
    _In_ LPCWSTR pszValueName,
    _In_ ULONGLONG qwNewValue,
    _Inout_opt_ PULONGLONG pqwOutValue
    );

typedef DWORD
(WINAPI * PRESUTIL_SET_QWORD_VALUE)(
    _In_ HKEY hkeyClusterKey,
    _In_ LPCWSTR pszValueName,
    _In_ ULONGLONG qwNewValue,
    _Inout_opt_ PULONGLONG pqwOutValue
    );

DWORD
WINAPI
ResUtilSetValueEx(
    _In_ HKEY hkeyClusterKey,
    _In_ LPCWSTR valueName,
    _In_ DWORD valueType,
    _In_reads_bytes_(valueSize) const LPBYTE valueData,
    _In_ DWORD valueSize,
    _In_ DWORD flags
    );

DWORD
WINAPI
ResUtilGetBinaryProperty(
    _Outptr_result_bytebuffer_(*pcbOutValueSize) LPBYTE *ppbOutValue,
    _Out_ LPDWORD pcbOutValueSize,
    _In_ const PCLUSPROP_BINARY pValueStruct,
    _In_reads_bytes_opt_( cbOldValueSize ) const LPBYTE pbOldValue,
    _In_ DWORD cbOldValueSize,
    _Inout_ _At_(*ppPropertyList, _Pre_readable_byte_size_(*pcbPropertyListSize) _Post_readable_byte_size_(*pcbPropertyListSize)) LPBYTE *ppPropertyList,
    _Inout_ LPDWORD pcbPropertyListSize
    );

typedef DWORD
(WINAPI * PRESUTIL_GET_BINARY_PROPERTY)(
    _Outptr_result_bytebuffer_(*pcbOutValueSize) LPBYTE *ppbOutValue,
    _Out_ LPDWORD pcbOutValueSize,
    _In_ const PCLUSPROP_BINARY pValueStruct,
    _In_reads_bytes_opt_( cbOldValueSize ) const LPBYTE pbOldValue,
    _In_ DWORD cbOldValueSize,
    _Inout_ _At_(*ppPropertyList, _Pre_readable_byte_size_(*pcbPropertyListSize) _Post_readable_byte_size_(*pcbPropertyListSize)) LPBYTE *ppPropertyList,
    _Inout_ LPDWORD pcbPropertyListSize
    );

DWORD
WINAPI
ResUtilGetSzProperty(
    _Outptr_ LPWSTR *ppszOutValue,
    _In_ const PCLUSPROP_SZ pValueStruct,
    _In_opt_ LPCWSTR pszOldValue,
    _Inout_ _At_(*ppPropertyList, _Pre_readable_byte_size_(*pcbPropertyListSize) _Post_readable_byte_size_(*pcbPropertyListSize)) LPBYTE *ppPropertyList,
    _Inout_ LPDWORD pcbPropertyListSize
    );

typedef DWORD
(WINAPI * PRESUTIL_GET_SZ_PROPERTY)(
    _Outptr_ LPWSTR *ppszOutValue,
    _In_ const PCLUSPROP_SZ pValueStruct,
    _In_opt_ LPCWSTR pszOldValue,
    _Inout_ _At_(*ppPropertyList, _Pre_readable_byte_size_(*pcbPropertyListSize) _Post_readable_byte_size_(*pcbPropertyListSize)) LPBYTE *ppPropertyList,
    _Inout_ LPDWORD pcbPropertyListSize
    );

DWORD
WINAPI
ResUtilGetMultiSzProperty(
    _Outptr_result_bytebuffer_(*pcbOutValueSize) LPWSTR *ppszOutValue,
    _Out_ LPDWORD pcbOutValueSize,
    _In_ const PCLUSPROP_SZ pValueStruct,
    _In_reads_bytes_opt_(cbOldValueSize) LPCWSTR pszOldValue,
    _In_ DWORD cbOldValueSize,
    _Inout_ _At_(*ppPropertyList, _Pre_readable_byte_size_(*pcbPropertyListSize) _Post_readable_byte_size_(*pcbPropertyListSize)) LPBYTE *ppPropertyList,
    _Inout_ LPDWORD pcbPropertyListSize
    );

typedef DWORD
(WINAPI * PRESUTIL_GET_MULTI_SZ_PROPERTY)(
    _Outptr_result_bytebuffer_(*pcbOutValueSize) LPWSTR *ppszOutValue,
    _Out_ LPDWORD pcbOutValueSize,
    _In_ const PCLUSPROP_SZ pValueStruct,
    _In_reads_bytes_opt_(cbOldValueSize) LPCWSTR pszOldValue,
    _In_ DWORD cbOldValueSize,
    _Inout_ _At_(*ppPropertyList, _Pre_readable_byte_size_(*pcbPropertyListSize) _Post_readable_byte_size_(*pcbPropertyListSize)) LPBYTE *ppPropertyList,
    _Inout_ LPDWORD pcbPropertyListSize
    );

DWORD
WINAPI
ResUtilGetDwordProperty(
    OUT LPDWORD pdwOutValue,
    IN const PCLUSPROP_DWORD pValueStruct,
    IN DWORD dwOldValue,
    IN DWORD dwMinimum,
    IN DWORD dwMaximum,
    OUT LPBYTE * ppPropertyList,
    OUT LPDWORD pcbPropertyListSize
    );

typedef DWORD
(WINAPI * PRESUTIL_GET_DWORD_PROPERTY)(
    OUT LPDWORD pdwOutValue,
    IN const PCLUSPROP_DWORD pValueStruct,
    IN DWORD dwOldValue,
    IN DWORD dwMinimum,
    IN DWORD dwMaximum,
    OUT LPBYTE * ppPropertyList,
    OUT LPDWORD pcbPropertyListSize
    );

DWORD
WINAPI
ResUtilGetLongProperty(
    OUT LPLONG plOutValue,
    IN const PCLUSPROP_LONG pValueStruct,
    IN LONG lOldValue,
    IN LONG lMinimum,
    IN LONG lMaximum,
    OUT LPBYTE * ppPropertyList,
    OUT LPDWORD pcbPropertyListSize
    );

typedef DWORD
(WINAPI * PRESUTIL_GET_LONG_PROPERTY)(
    OUT LPLONG plOutValue,
    IN const PCLUSPROP_LONG pValueStruct,
    IN LONG lOldValue,
    IN LONG lMinimum,
    IN LONG lMaximum,
    OUT LPBYTE * ppPropertyList,
    OUT LPDWORD pcbPropertyListSize
    );

DWORD
WINAPI
ResUtilGetFileTimeProperty(
    OUT LPFILETIME pftOutValue,
    IN const PCLUSPROP_FILETIME pValueStruct,
    IN FILETIME ftOldValue,
    IN FILETIME ftMinimum,
    IN FILETIME ftMaximum,
    OUT LPBYTE * ppPropertyList,
    OUT LPDWORD pcbPropertyListSize
    );

typedef DWORD
(WINAPI * PRESUTIL_GET_FILETIME_PROPERTY)(
    OUT LPFILETIME pftOutValue,
    IN const PCLUSPROP_FILETIME pValueStruct,
    IN FILETIME ftOldValue,
    IN FILETIME ftMinimum,
    IN FILETIME ftMaximum,
    OUT LPBYTE * ppPropertyList,
    OUT LPDWORD pcbPropertyListSize
    );

LPVOID
WINAPI
ResUtilGetEnvironmentWithNetName(
    _In_ HRESOURCE hResource
    );

typedef LPVOID
(WINAPI * PRESUTIL_GET_ENVIRONMENT_WITH_NET_NAME)(
    _In_ HRESOURCE hResource
    );

DWORD
WINAPI
ResUtilFreeEnvironment(
    IN LPVOID lpEnvironment
    );

typedef DWORD
(WINAPI * PRESUTIL_FREE_ENVIRONMENT)(
    IN LPVOID lpEnvironment
    );

LPWSTR
WINAPI
ResUtilExpandEnvironmentStrings(
    IN LPCWSTR pszSrc
    );

typedef LPWSTR
(WINAPI * PRESUTIL_EXPAND_ENVIRONMENT_STRINGS)(
    IN LPCWSTR pszSrc
    );

DWORD
WINAPI
ResUtilSetResourceServiceEnvironment(
    IN LPCWSTR pszServiceName,
    IN HRESOURCE hResource,
    IN PLOG_EVENT_ROUTINE pfnLogEvent,
    IN RESOURCE_HANDLE hResourceHandle
    );

typedef DWORD
(WINAPI * PRESUTIL_SET_RESOURCE_SERVICE_ENVIRONMENT)(
    IN LPCWSTR pszServiceName,
    IN HRESOURCE hResource,
    IN PLOG_EVENT_ROUTINE pfnLogEvent,
    IN RESOURCE_HANDLE hResourceHandle
    );

DWORD
WINAPI
ResUtilRemoveResourceServiceEnvironment(
    IN  LPCWSTR             pszServiceName,
    IN  PLOG_EVENT_ROUTINE  pfnLogEvent,
    IN  RESOURCE_HANDLE     hResourceHandle
    );

typedef DWORD
(WINAPI * PRESUTIL_REMOVE_RESOURCE_SERVICE_ENVIRONMENT)(
    IN  LPCWSTR             pszServiceName,
    IN  PLOG_EVENT_ROUTINE  pfnLogEvent,
    IN  RESOURCE_HANDLE     hResourceHandle
    );

DWORD
WINAPI
ResUtilSetResourceServiceStartParameters(
    IN LPCWSTR pszServiceName,
    IN SC_HANDLE schSCMHandle,
    IN OUT LPSC_HANDLE phService,
    IN PLOG_EVENT_ROUTINE pfnLogEvent,
    IN RESOURCE_HANDLE hResourceHandle
    );

typedef DWORD
(WINAPI * PRESUTIL_SET_RESOURCE_SERVICE_START_PARAMETERS)(
    IN LPCWSTR pszServiceName,
    IN SC_HANDLE schSCMHandle,
    IN OUT LPSC_HANDLE phService,
    IN PLOG_EVENT_ROUTINE pfnLogEvent,
    IN RESOURCE_HANDLE hResourceHandle
    );

DWORD
WINAPI
ResUtilFindSzProperty(
    _In_reads_bytes_(cbPropertyListSize) const PVOID pPropertyList,
    _In_ DWORD cbPropertyListSize,
    _In_ LPCWSTR pszPropertyName,
    _Outptr_opt_ LPWSTR *pszPropertyValue
    );

typedef DWORD
(WINAPI * PRESUTIL_FIND_SZ_PROPERTY)(
    _In_reads_bytes_(cbPropertyListSize) const PVOID pPropertyList,
    _In_ DWORD cbPropertyListSize,
    _In_ LPCWSTR pszPropertyName,
    _Outptr_opt_ LPWSTR *pszPropertyValue
    );

DWORD
WINAPI
ResUtilFindExpandSzProperty(
    _In_reads_bytes_(cbPropertyListSize) const PVOID pPropertyList,
    _In_ DWORD cbPropertyListSize,
    _In_ LPCWSTR pszPropertyName,
    _Outptr_opt_ LPWSTR *pszPropertyValue
    );

typedef DWORD
(WINAPI * PRESUTIL_FIND_EXPAND_SZ_PROPERTY)(
    _In_reads_bytes_(cbPropertyListSize) const PVOID pPropertyList,
    _In_ DWORD cbPropertyListSize,
    _In_ LPCWSTR pszPropertyName,
    _Outptr_opt_ LPWSTR *pszPropertyValue
    );

DWORD
WINAPI
ResUtilFindExpandedSzProperty(
    _In_reads_bytes_(cbPropertyListSize) const PVOID pPropertyList,
    _In_ DWORD cbPropertyListSize,
    _In_ LPCWSTR pszPropertyName,
    _Outptr_opt_ LPWSTR *pszPropertyValue
    );

typedef DWORD
(WINAPI * PRESUTIL_FIND_EXPANDED_SZ_PROPERTY)(
    _In_reads_bytes_(cbPropertyListSize) const PVOID pPropertyList,
    _In_ DWORD cbPropertyListSize,
    _In_ LPCWSTR pszPropertyName,
    _Outptr_opt_ LPWSTR *pszPropertyValue
    );

DWORD
WINAPI
ResUtilFindDwordProperty(
    _In_reads_bytes_(cbPropertyListSize) const PVOID pPropertyList,
    _In_ DWORD cbPropertyListSize,
    _In_ LPCWSTR pszPropertyName,
    _Out_ LPDWORD pdwPropertyValue
    );

typedef DWORD
(WINAPI * PRESUTIL_FIND_DWORD_PROPERTY)(
    _In_reads_bytes_(cbPropertyListSize) const PVOID pPropertyList,
    _In_ DWORD cbPropertyListSize,
    _In_ LPCWSTR pszPropertyName,
    _Out_ LPDWORD pdwPropertyValue
    );

DWORD
WINAPI
ResUtilFindBinaryProperty(
    _In_reads_bytes_(cbPropertyListSize) const PVOID pPropertyList,
    _In_ DWORD cbPropertyListSize,
    _In_ LPCWSTR pszPropertyName,
    _Outptr_opt_result_bytebuffer_to_(*pcbPropertyValueSize, *pcbPropertyValueSize) LPBYTE *pbPropertyValue,
    _Out_opt_ LPDWORD pcbPropertyValueSize
    );

typedef DWORD
(WINAPI * PRESUTIL_FIND_BINARY_PROPERTY)(
    _In_reads_bytes_(cbPropertyListSize) const PVOID pPropertyList,
    _In_ DWORD cbPropertyListSize,
    _In_ LPCWSTR pszPropertyName,
    _Outptr_opt_result_bytebuffer_to_(*pcbPropertyValueSize, *pcbPropertyValueSize) LPBYTE *pbPropertyValue,
    _Out_opt_ LPDWORD pcbPropertyValueSize
    );

DWORD
WINAPI
ResUtilFindMultiSzProperty(
    _In_reads_bytes_(cbPropertyListSize) const PVOID pPropertyList,
    _In_ DWORD cbPropertyListSize,
    _In_ LPCWSTR pszPropertyName,
    _Outptr_result_bytebuffer_to_(*pcbPropertyValueSize, *pcbPropertyValueSize) LPWSTR *pszPropertyValue,
    _Out_ LPDWORD pcbPropertyValueSize
    );

typedef DWORD
(WINAPI * PRESUTIL_FIND_MULTI_SZ_PROPERTY)(
    _In_reads_bytes_(cbPropertyListSize) const PVOID pPropertyList,
    _In_ DWORD cbPropertyListSize,
    _In_ LPCWSTR pszPropertyName,
    _Outptr_result_bytebuffer_to_(*pcbPropertyValueSize, *pcbPropertyValueSize) LPWSTR *pszPropertyValue,
    _Out_ LPDWORD pcbPropertyValueSize
    );

DWORD
WINAPI
ResUtilFindLongProperty(
    _In_reads_bytes_(cbPropertyListSize) const PVOID pPropertyList,
    _In_ DWORD cbPropertyListSize,
    _In_ LPCWSTR pszPropertyName,
    _Out_ LPLONG plPropertyValue
    );

typedef DWORD
(WINAPI * PRESUTIL_FIND_LONG_PROPERTY)(
    _In_reads_bytes_(cbPropertyListSize) const PVOID pPropertyList,
    _In_ DWORD cbPropertyListSize,
    _In_ LPCWSTR pszPropertyName,
    _Out_ LPLONG plPropertyValue
    );

DWORD
WINAPI
ResUtilFindULargeIntegerProperty(
    _In_reads_bytes_(cbPropertyListSize) const PVOID pPropertyList,
    _In_ DWORD cbPropertyListSize,
    _In_ LPCWSTR pszPropertyName,
    _Out_ ULONGLONG *plPropertyValue
    );

typedef DWORD
(WINAPI * PRESUTIL_FIND_ULARGEINTEGER_PROPERTY)(
    _In_reads_bytes_(cbPropertyListSize) const PVOID pPropertyList,
    _In_ DWORD cbPropertyListSize,
    _In_ LPCWSTR pszPropertyName,
    _Out_ ULONGLONG *plPropertyValue
    );

DWORD
WINAPI
ResUtilFindFileTimeProperty(
    _In_reads_bytes_(cbPropertyListSize) const PVOID pPropertyList,
    _In_ DWORD cbPropertyListSize,
    _In_ LPCWSTR pszPropertyName,
    _Out_ LPFILETIME pftPropertyValue
    );

typedef DWORD
(WINAPI * PRESUTIL_FIND_FILETIME_PROPERTY)(
    _In_reads_bytes_(cbPropertyListSize) const PVOID pPropertyList,
    _In_ DWORD cbPropertyListSize,
    _In_ LPCWSTR pszPropertyName,
    _Out_ LPFILETIME pftPropertyValue
    );


//
// Common worker thread routines that allow a pending operation to
// be cancelled with CORRECT synchronization.
//
typedef struct CLUS_WORKER {
    HANDLE hThread;
    BOOL Terminate;
} CLUS_WORKER, *PCLUS_WORKER;

typedef DWORD (WINAPI *PWORKER_START_ROUTINE)(
    PCLUS_WORKER pWorker,
    LPVOID lpThreadParameter
    );

DWORD
WINAPI
ClusWorkerCreate(
    OUT PCLUS_WORKER lpWorker,
    IN PWORKER_START_ROUTINE lpStartAddress,
    IN PVOID lpParameter
    );

typedef DWORD
(WINAPI * PCLUSAPI_CLUS_WORKER_CREATE)(
    OUT PCLUS_WORKER lpWorker,
    IN PWORKER_START_ROUTINE lpStartAddress,
    IN PVOID lpParameter
    );

BOOL
WINAPI
ClusWorkerCheckTerminate(
    IN PCLUS_WORKER lpWorker
    );

typedef BOOL
(WINAPI * PCLUSAPIClusWorkerCheckTerminate)(
    IN PCLUS_WORKER lpWorker
    );

VOID
WINAPI
ClusWorkerTerminate(
    _In_ PCLUS_WORKER lpWorker
    );

typedef VOID
(WINAPI * PCLUSAPI_CLUS_WORKER_TERMINATE)(
    _In_ PCLUS_WORKER lpWorker
    );

DWORD
WINAPI
ClusWorkerTerminateEx(
    _Inout_ PCLUS_WORKER ClusWorker,
    _In_ DWORD TimeoutInMilliseconds,
    _In_ BOOL WaitOnly
    );

DWORD
ClusWorkersTerminate(
    _Inout_updates_(ClusWorkersCount) PCLUS_WORKER * ClusWorkers,
    _In_ size_t const ClusWorkersCount,
    _In_ DWORD TimeoutInMilliseconds,
    _In_ BOOL WaitOnly
    );

//Define enumerate resource callback function. This gets called for each resource enumerated
//by ResUtilEnumResources
typedef   DWORD (*LPRESOURCE_CALLBACK)( HRESOURCE, HRESOURCE , PVOID );
typedef   DWORD (*LPRESOURCE_CALLBACK_EX)( HCLUSTER, HRESOURCE, HRESOURCE , PVOID );
typedef   DWORD (*LPGROUP_CALLBACK_EX)( HCLUSTER, HGROUP, HGROUP , PVOID );
typedef   DWORD (*LPNODE_CALLBACK)( HCLUSTER, HNODE, CLUSTER_NODE_STATE, PVOID );


BOOL
WINAPI
ResUtilResourcesEqual(
    IN HRESOURCE    hSelf,
    IN HRESOURCE    hResource
    );


typedef BOOL
(WINAPI * PRESUTIL_RESOURCES_EQUAL)(
    IN HRESOURCE    hSelf,
    IN HRESOURCE    hResource
    );


BOOL
WINAPI
ResUtilResourceTypesEqual(
    IN LPCWSTR      lpszResourceTypeName,
    IN HRESOURCE    hResource
    );


typedef BOOL
(WINAPI * PRESUTIL_RESOURCE_TYPES_EQUAL)(
    IN LPCWSTR      lpszResourceTypeName,
    IN HRESOURCE    hResource
    );

BOOL
WINAPI
ResUtilIsResourceClassEqual(
    IN PCLUS_RESOURCE_CLASS_INFO    prci,
    IN HRESOURCE                    hResource
    );

typedef BOOL
(WINAPI * PRESUTIL_IS_RESOURCE_CLASS_EQUAL)(
    IN PCLUS_RESOURCE_CLASS_INFO    prci,
    IN HRESOURCE                    hResource
    );

DWORD
WINAPI
ResUtilEnumResources(
    IN HRESOURCE            hSelf,
    IN LPCWSTR              lpszResTypeName,
    IN LPRESOURCE_CALLBACK  pResCallBack,
    IN PVOID                pParameter
    );

typedef DWORD
(WINAPI * PRESUTIL_ENUM_RESOURCES)(
    IN HRESOURCE            hSelf,
    IN LPCWSTR              lpszResTypeName,
    IN LPRESOURCE_CALLBACK  pResCallBack,
    IN PVOID                pParameter
    );

DWORD
WINAPI
ResUtilEnumResourcesEx(
    IN HCLUSTER                 hCluster,
    IN HRESOURCE                hSelf,
    IN LPCWSTR                  lpszResTypeName,
    IN LPRESOURCE_CALLBACK_EX   pResCallBack,
    IN PVOID                    pParameter
    );

typedef DWORD
(WINAPI * PRESUTIL_ENUM_RESOURCES_EX)(
    IN HCLUSTER                 hCluster,
    IN HRESOURCE                hSelf,
    IN LPCWSTR                  lpszResTypeName,
    IN LPRESOURCE_CALLBACK_EX   pResCallBack,
    IN PVOID                    pParameter
    );

HRESOURCE
WINAPI
ResUtilGetResourceDependency(
    IN HANDLE       hSelf,
    IN LPCWSTR      lpszResourceType
    );

typedef HRESOURCE
(WINAPI * PRESUTIL_GET_RESOURCE_DEPENDENCY)(
    IN HANDLE       hSelf,
    IN LPCWSTR      lpszResourceType
    );

HRESOURCE
WINAPI
ResUtilGetResourceDependencyByName(
    IN HCLUSTER hCluster,
    IN HANDLE   hSelf,
    IN LPCWSTR  lpszResourceType,
    IN BOOL     bRecurse
    );

typedef HRESOURCE
(WINAPI * PRESUTIL_GET_RESOURCE_DEPENDENCY_BY_NAME)(
    IN HCLUSTER hCluster,
    IN HANDLE   hSelf,
    IN LPCWSTR  lpszResourceType,
    IN BOOL     bRecurse
    );

HRESOURCE
WINAPI
ResUtilGetResourceDependencyByClass(
    IN HCLUSTER                     hCluster,
    IN HANDLE                       hSelf,
    IN PCLUS_RESOURCE_CLASS_INFO    prci,
    IN BOOL                         bRecurse
    );

typedef HRESOURCE
(WINAPI * PRESUTIL_GET_RESOURCE_DEPENDENCY_BY_CLASS)(
    IN HCLUSTER                     hCluster,
    IN HANDLE                       hSelf,
    IN PCLUS_RESOURCE_CLASS_INFO    prci,
    IN BOOL                         bRecurse
    );

HRESOURCE
WINAPI
ResUtilGetResourceNameDependency(
    IN LPCWSTR      lpszResourceName,
    IN LPCWSTR      lpszResourceType
    );

typedef HRESOURCE
(WINAPI * PRESUTIL_GET_RESOURCE_NAME_DEPENDENCY)(
    IN LPCWSTR      lpszResourceName,
    IN LPCWSTR      lpszResourceType
    );

_Success_( return == ERROR_SUCCESS )
DWORD
WINAPI
ResUtilGetResourceDependentIPAddressProps(
    _In_ HRESOURCE hResource,
    _Out_writes_to_(*pcchAddress, *pcchAddress) LPWSTR pszAddress,
    _Inout_ DWORD *pcchAddress,
    _Out_writes_to_(*pcchSubnetMask, *pcchSubnetMask) LPWSTR pszSubnetMask,
    _Inout_ DWORD *pcchSubnetMask,
    _Out_writes_to_(*pcchNetwork, *pcchNetwork) LPWSTR pszNetwork,
    _Inout_ DWORD *pcchNetwork
    );

typedef
_Success_( return == ERROR_SUCCESS )
DWORD
(WINAPI * PRESUTIL_GET_RESOURCE_DEPENDENTIP_ADDRESS_PROPS)(
    _In_ HRESOURCE hResource,
    _Out_writes_to_(*pcchAddress, *pcchAddress) LPWSTR pszAddress,
    _Inout_ DWORD *pcchAddress,
    _Out_writes_to_(*pcchSubnetMask, *pcchSubnetMask) LPWSTR pszSubnetMask,
    _Inout_ DWORD *pcchSubnetMask,
    _Out_writes_to_(*pcchNetwork, *pcchNetwork) LPWSTR pszNetwork,
    _Inout_ DWORD *pcchNetwork
    );

_Success_( return == ERROR_SUCCESS )
DWORD
WINAPI
ResUtilFindDependentDiskResourceDriveLetter(
    _In_ HCLUSTER hCluster,              // handle to cluster
    _In_ HRESOURCE hResource,            // handle to resource to query for dependencies
    _Out_writes_to_(*pcchDriveLetter, *pcchDriveLetter) LPWSTR pszDriveLetter,       // buffer to store drive letter (ex. "X:\0")
    _Inout_ DWORD * pcchDriveLetter      // IN size of the pszDriveLetter buffer, OUT size of buffer required
    );

typedef
_Success_( return == ERROR_SUCCESS ) DWORD
(WINAPI * PRESUTIL_FIND_DEPENDENT_DISK_RESOURCE_DRIVE_LETTER)(
    _In_ HCLUSTER hCluster,              // handle to cluster
    _In_ HRESOURCE hResource,            // handle to resource to query for dependencies
    _Out_writes_to_(*pcchDriveLetter, *pcchDriveLetter) LPWSTR pszDriveLetter,       // buffer to store drive letter (ex. "X:\0")
    _Inout_ DWORD *pcchDriveLetter       // IN size of the pszDriveLetter buffer, OUT size of buffer required
    );

DWORD
WINAPI
ResUtilTerminateServiceProcessFromResDll(
    _In_ DWORD dwServicePid,
    _In_ BOOL bOffline,
    _Out_ PDWORD pdwResourceState,
    _In_ PLOG_EVENT_ROUTINE pfnLogEvent,
    _In_ RESOURCE_HANDLE hResourceHandle
    );

typedef DWORD
(WINAPI * PRESUTIL_TERMINATE_SERVICE_PROCESS_FROM_RES_DLL)(
    _In_ DWORD dwServicePid,
    _In_ BOOL bOffline,
    _Out_ PDWORD pdwResourceState,
    _In_ PLOG_EVENT_ROUTINE pfnLogEvent,
    _In_ RESOURCE_HANDLE hResourceHandle
    );

DWORD
WINAPI
ResUtilGetPropertyFormats(
    _In_ const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    _Out_writes_bytes_to_(cbPropertyFormatListSize, *pcbBytesReturned) PVOID pOutPropertyFormatList,
    _In_ DWORD cbPropertyFormatListSize,
    _Out_ LPDWORD pcbBytesReturned,
    _Out_ LPDWORD pcbRequired
    );

typedef DWORD
(WINAPI * PRESUTIL_GET_PROPERTY_FORMATS)(
    _In_ const PRESUTIL_PROPERTY_ITEM pPropertyTable,
    _Out_writes_bytes_to_(cbPropertyFormatListSize, *pcbBytesReturned) PVOID pOutPropertyFormatList,
    _In_ DWORD cbPropertyFormatListSize,
    _Out_ LPDWORD pcbBytesReturned,
    _Out_ LPDWORD pcbRequired
    );


DWORD
WINAPI
ResUtilGetCoreClusterResources(
    _In_ HCLUSTER hCluster,
    _Out_ HRESOURCE *phClusterNameResource,
    _Out_ HRESOURCE *phClusterIPAddressResource,
    _Out_ HRESOURCE *phClusterQuorumResource
    );


typedef DWORD
(WINAPI * PRESUTIL_GET_CORE_CLUSTER_RESOURCES)(
    _In_ HCLUSTER hCluster,
    _Out_ HRESOURCE *phClusterNameResource,
    _Out_ HRESOURCE *phClusterIPAddressResource,
    _Out_ HRESOURCE *phClusterQuorumResource
    );

DWORD
WINAPI
ResUtilGetResourceName(
    _In_ HRESOURCE hResource,
    _Out_writes_to_(*pcchResourceNameInOut, *pcchResourceNameInOut) PWSTR pszResourceName,
    _Inout_ DWORD *pcchResourceNameInOut
    );

typedef DWORD
(WINAPI * PRESUTIL_GET_RESOURCE_NAME)(
    _In_ HRESOURCE hResource,
    _Out_writes_to_(*pcchResourceNameInOut, *pcchResourceNameInOut) PWSTR pszResourceName,
    _Inout_ DWORD *pcchResourceNameInOut
    );

typedef enum _CLUSTER_ROLE {
    ClusterRoleDHCP,
    ClusterRoleDTC,
    ClusterRoleFileServer,
    ClusterRoleGenericApplication,
    ClusterRoleGenericScript,
    ClusterRoleGenericService,
    ClusterRoleISCSINameServer,             // Maps to CLUS_RESTYPE_NAME_ISNS
    ClusterRoleMSMQ,
    ClusterRoleNFS,
    ClusterRolePrintServer,
    ClusterRoleStandAloneNamespaceServer,   // FileShare with bit set
    ClusterRoleVolumeShadowCopyServiceTask,
    ClusterRoleWINS,
    ClusterRoleTaskScheduler,
    ClusterRoleNetworkFileSystem,
    ClusterRoleDFSReplicatedFolder,
    ClusterRoleDistributedFileSystem,
    ClusterRoleDistributedNetworkName,
    ClusterRoleFileShare,
    ClusterRoleFileShareWitness,
    ClusterRoleHardDisk,
    ClusterRoleIPAddress,
    ClusterRoleIPV6Address,
    ClusterRoleIPV6TunnelAddress,
    ClusterRoleISCSITargetServer,
    ClusterRoleNetworkName,
    ClusterRolePhysicalDisk,                // Same as ClusterRoleHardDisk
    ClusterRoleSODAFileServer,
    ClusterRoleStoragePool,
    ClusterRoleVirtualMachine,
    ClusterRoleVirtualMachineConfiguration,
    ClusterRoleVirtualMachineReplicaBroker
} CLUSTER_ROLE;

typedef enum _CLUSTER_ROLE_STATE {
    ClusterRoleUnknown = -1,
    ClusterRoleClustered,
    ClusterRoleUnclustered
} CLUSTER_ROLE_STATE;

_Success_(return >= 0) // != ClusterRoleUnknown
CLUSTER_ROLE_STATE
WINAPI
ResUtilGetClusterRoleState(
    _In_ HCLUSTER       hCluster,
    _In_ CLUSTER_ROLE   eClusterRole
    );

// TODO: should we implement versioning here like ClusApi - maybe overkill for now.
BOOL
WINAPI
ClusterIsPathOnSharedVolume(
    _In_ LPCWSTR lpszPathName
);

typedef BOOL
(WINAPI * PCLUSTER_IS_PATH_ON_SHARED_VOLUME)(
    _In_ LPCWSTR lpszPathName
    );

BOOL
WINAPI
ClusterGetVolumePathName(
    _In_   LPCWSTR lpszFileName,
    _Out_  LPWSTR lpszVolumePathName,
    _In_   DWORD cchBufferLength
    );

typedef BOOL
(WINAPI * PCLUSTER_GET_VOLUME_PATH_NAME)(
    _In_   LPCWSTR lpszFileName,
    _Out_  LPWSTR lpszVolumePathName,
    _In_   DWORD cchBufferLength
    );

BOOL
WINAPI
ClusterGetVolumeNameForVolumeMountPoint(
    _In_   LPCWSTR lpszVolumeMountPoint,
    _Out_  LPWSTR lpszVolumeName,
    _In_   DWORD cchBufferLength
    );

typedef BOOL
(WINAPI * PCLUSTER_GET_VOLUME_NAME_FOR_VOLUME_MOUNT_POINT)(
    _In_   LPCWSTR lpszVolumeMountPoint,
    _Out_  LPWSTR lpszVolumeName,
    _In_   DWORD cchBufferLength
    );

DWORD
WINAPI
ClusterPrepareSharedVolumeForBackup(
    _In_ LPCWSTR lpszFileName,
    _Out_ LPWSTR lpszVolumePathName,
    _Inout_ LPDWORD lpcchVolumePathName,
    _Out_ LPWSTR lpszVolumeName,
    _Inout_ LPDWORD lpcchVolumeName
    );

typedef DWORD
(WINAPI * PCLUSTER_PREPARE_SHARED_VOLUME_FOR_BACKUP)(
    _In_ LPCWSTR lpszFileName,
    _Out_ LPWSTR lpszVolumePathName,
    _Inout_ LPDWORD lpcchVolumePathName,
    _Out_ LPWSTR lpszVolumeName,
    _Inout_ LPDWORD lpcchVolumeName
    );

DWORD
WINAPI
ClusterClearBackupStateForSharedVolume(
    _In_ LPCWSTR lpszVolumePathName
    );

typedef DWORD
(WINAPI * PCLUSTER_CLEAR_BACKUP_STATE_FOR_SHARED_VOLUME)(
    _In_ LPCWSTR lpszVolumePathName
    );

// Begin updates to ResUtil functions that accept access level
#if ( CLUSAPI_VERSION >= CLUSAPI_VERSION_WINDOWS8 )
DWORD
WINAPI
ResUtilSetResourceServiceStartParametersEx(
    IN      LPCWSTR             pszServiceName,
    IN      SC_HANDLE           schSCMHandle,
    IN OUT  LPSC_HANDLE         phService,
    IN      DWORD               dwDesiredAccess,
    IN      PLOG_EVENT_ROUTINE  pfnLogEvent,
    IN      RESOURCE_HANDLE     hResourceHandle
    );

typedef DWORD
(WINAPI * PRESUTIL_SET_RESOURCE_SERVICE_START_PARAMETERS_EX)(
    IN      LPCWSTR             pszServiceName,
    IN      SC_HANDLE           schSCMHandle,
    IN OUT  LPSC_HANDLE         phService,
    IN      DWORD               dwDesiredAccess,
    IN      PLOG_EVENT_ROUTINE  pfnLogEvent,
    IN      RESOURCE_HANDLE     hResourceHandle
    );

DWORD
WINAPI
ResUtilEnumResourcesEx2(
    IN HCLUSTER                 hCluster,
    IN HRESOURCE                hSelf,
    IN LPCWSTR                  lpszResTypeName,
    IN LPRESOURCE_CALLBACK_EX   pResCallBack,
    IN PVOID                    pParameter,
    IN DWORD                    dwDesiredAccess
    );

typedef DWORD
(WINAPI * PRESUTIL_ENUM_RESOURCES_EX2)(
    IN HCLUSTER                 hCluster,
    IN HRESOURCE                hSelf,
    IN LPCWSTR                  lpszResTypeName,
    IN LPRESOURCE_CALLBACK_EX   pResCallBack,
    IN PVOID                    pParameter,
    IN DWORD                    dwDesiredAccess
    );

HRESOURCE
WINAPI
ResUtilGetResourceDependencyEx(
    IN HANDLE       hSelf,
    IN LPCWSTR      lpszResourceType,
    IN DWORD        dwDesiredAccess
    );

typedef HRESOURCE
(WINAPI * PRESUTIL_GET_RESOURCE_DEPENDENCY_EX)(
    IN HANDLE       hSelf,
    IN LPCWSTR      lpszResourceType,
    IN DWORD        dwDesiredAccess
    );

HRESOURCE
WINAPI
ResUtilGetResourceDependencyByNameEx(
    IN HCLUSTER hCluster,
    IN HANDLE   hSelf,
    IN LPCWSTR  lpszResourceType,
    IN BOOL     bRecurse,
    IN DWORD    dwDesiredAccess
    );

typedef HRESOURCE
(WINAPI * PRESUTIL_GET_RESOURCE_DEPENDENCY_BY_NAME_EX)(
    IN HCLUSTER hCluster,
    IN HANDLE   hSelf,
    IN LPCWSTR  lpszResourceType,
    IN BOOL     bRecurse,
    IN DWORD    dwDesiredAccess
    );

HRESOURCE
WINAPI
ResUtilGetResourceDependencyByClassEx(
    IN HCLUSTER                     hCluster,
    IN HANDLE                       hSelf,
    IN PCLUS_RESOURCE_CLASS_INFO    prci,
    IN BOOL                         bRecurse,
    IN DWORD                        dwDesiredAccess
    );

typedef HRESOURCE
(WINAPI * PRESUTIL_GET_RESOURCE_DEPENDENCY_BY_CLASS_EX)(
    IN HCLUSTER                     hCluster,
    IN HANDLE                       hSelf,
    IN PCLUS_RESOURCE_CLASS_INFO    prci,
    IN BOOL                         bRecurse,
    IN DWORD                        dwDesiredAccess
    );

HRESOURCE
WINAPI
ResUtilGetResourceNameDependencyEx(
    IN LPCWSTR      lpszResourceName,
    IN LPCWSTR      lpszResourceType,
    IN DWORD        dwDesiredAccess
    );

typedef HRESOURCE
(WINAPI * PRESUTIL_GET_RESOURCE_NAME_DEPENDENCY_EX)(
    IN LPCWSTR      lpszResourceName,
    IN LPCWSTR      lpszResourceType,
    IN DWORD        dwDesiredAccess
    );

DWORD
WINAPI
ResUtilGetCoreClusterResourcesEx(
    _In_        HCLUSTER    hClusterIn,
    _Out_opt_   HRESOURCE  *phClusterNameResourceOut,
    _Out_opt_   HRESOURCE  *phClusterQuorumResourceOut,
    _In_        DWORD       dwDesiredAccess
    );

typedef DWORD
(WINAPI * PRESUTIL_GET_CORE_CLUSTER_RESOURCES_EX)(
    _In_  HCLUSTER    hClusterIn,
    _Out_ HRESOURCE *phClusterNameResourceOut,
    _Out_ HRESOURCE *phClusterIPAddressResourceOut,
    _Out_ HRESOURCE *phClusterQuorumResourceOut,
    _In_   DWORD       dwDesiredAccess
    );

#define CLUS_CREATE_CRYPT_CONTAINER_NOT_FOUND       0x0001

typedef struct _HCLUSCRYPTPROVIDER *HCLUSCRYPTPROVIDER;

HCLUSCRYPTPROVIDER
WINAPI
OpenClusterCryptProvider(
    _In_ LPCWSTR lpszResource,
    _In_ LPCTSTR lpszProvider,
    _In_ DWORD dwType,
    _In_ DWORD dwFlags
    );

typedef HCLUSCRYPTPROVIDER
(WINAPI * POPEN_CLUSTER_CRYPT_PROVIDER)(
    _In_ LPCWSTR lpszResource,
    _In_ LPCTSTR lpszProvider,
    _In_ DWORD dwType,
    _In_ DWORD dwFlags
    );

HCLUSCRYPTPROVIDER
WINAPI
OpenClusterCryptProviderEx(
    _In_ LPCWSTR lpszResource,
    _In_ LPCWSTR lpszKeyname,
    _In_ LPCTSTR lpszProvider,
    _In_ DWORD dwType,
    _In_ DWORD dwFlags
    );

typedef HCLUSCRYPTPROVIDER
(WINAPI * POPEN_CLUSTER_CRYPT_PROVIDEREX)(
    _In_ LPCWSTR lpszResource,
    _In_ LPCWSTR lpszKeyname,
    _In_ LPCTSTR lpszProvider,
    _In_ DWORD dwType,
    _In_ DWORD dwFlags
    );

DWORD
WINAPI
CloseClusterCryptProvider(
    _In_ HCLUSCRYPTPROVIDER hClusCryptProvider
    );

typedef DWORD
(WINAPI * PCLOSE_CLUSTER_CRYPT_PROVIDER)(
    _In_ HCLUSCRYPTPROVIDER hClusCryptProvider
    );

DWORD
WINAPI
ClusterEncrypt(
    _In_ HCLUSCRYPTPROVIDER hClusCryptProvider,
    _In_reads_(cbData) PBYTE pData,
    _In_ DWORD cbData,
    _Outptr_result_bytebuffer_(*pcbData) PBYTE* ppData,
    _Out_ PDWORD pcbData
    );

typedef DWORD
(WINAPI * PCLUSTER_ENCRYPT)(
    _In_ HCLUSCRYPTPROVIDER hClusCryptProvider,
    _In_reads_(cbData) PBYTE pData,
    _In_ DWORD cbData,
    _Outptr_result_bytebuffer_(*pcbData) PBYTE* ppData,
    _Out_ PDWORD pcbData
    );

DWORD
WINAPI
ClusterDecrypt(
    _In_ HCLUSCRYPTPROVIDER hClusCryptProvider,
    _In_reads_(cbData) PBYTE pCryptInput,
    _In_ DWORD cbCryptInput,
    _Outptr_result_bytebuffer_(*pcbCryptOutput) PBYTE* ppCryptOutput,
    _Out_ PDWORD pcbCryptOutput
    );

typedef DWORD
(WINAPI * PCLUSTER_DECRYPT)(
    _In_ HCLUSCRYPTPROVIDER hClusCryptProvider,
    _In_reads_(cbData) PBYTE pCryptInput,
    _In_ DWORD cbCryptInput,
    _Outptr_result_bytebuffer_(*pcbCryptOutput) PBYTE* ppCryptOutput,
    _Out_ PDWORD pcbCryptOutput
    );

DWORD
WINAPI
FreeClusterCrypt(
    _In_ PVOID pCryptInfo
    );

typedef DWORD
(WINAPI * PFREE_CLUSTER_CRYPT)(
    _In_ PVOID pCryptInfo
    );


#endif // ( CLUSAPI_VERSION >= CLUSAPI_VERSION_WINDOWS8 )

typedef struct _PaxosTagCStruct {
    unsigned __int64 __padding__PaxosTagVtable; //0

    unsigned __int64 __padding__NextEpochVtable; //8
    unsigned __int64 __padding__NextEpoch_DateTimeVtable; //16
    unsigned __int64 NextEpoch_DateTime_ticks; //24
    int NextEpoch_Value;//32
    DWORD __padding__BoundryNextEpoch;

    unsigned __int64 __padding__EpochVtable;//40
    unsigned __int64 __padding__Epoch_DateTimeVtable;//48
    unsigned __int64 Epoch_DateTime_ticks;//56
    int Epoch_Value;//64
    DWORD __padding__BoundryEpoch;//68

    int Sequence;//80
    DWORD __padding__BoundrySequence;//84
} PaxosTagCStruct, *PPaxosTagCStruct;


typedef struct _WitnessTagUpdateHelper
{
    int Version;
    PaxosTagCStruct paxosToSet;
    PaxosTagCStruct paxosToValidate;
}WitnessTagUpdateHelper;

typedef struct _WitnessTagHelper
{
    int Version;
    PaxosTagCStruct paxosToValidate;
}WitnessTagHelper;

BOOL ResUtilPaxosComparer(const PaxosTagCStruct *const left, const PaxosTagCStruct * const right);

BOOL ResUtilLeftPaxosIsLessThanRight(const PaxosTagCStruct *const left, const PaxosTagCStruct * const right);

DWORD ResUtilsDeleteKeyTree(HKEY key, LPCWSTR keyName, BOOL treatNoKeyAsError);

DWORD
WINAPI
ResUtilGroupsEqual(
    IN HGROUP    hSelf,
    IN HGROUP    hGroup,
    OUT BOOL*    pEqual
    );

DWORD
WINAPI
ResUtilEnumGroups(
    IN HCLUSTER             hCluster,
    IN HGROUP               hSelf,
    IN LPGROUP_CALLBACK_EX  pResCallBack,
    IN PVOID                pParameter
    );

DWORD
WINAPI
ResUtilEnumGroupsEx(
    IN HCLUSTER                 hCluster,
    IN HGROUP               hSelf,
    IN CLUSGROUP_TYPE           groupType,
    IN LPGROUP_CALLBACK_EX      pResCallBack,
    IN PVOID                    pParameter
    );


DWORD
WINAPI
ResUtilDupGroup(IN HGROUP group, OUT HGROUP *copy);

DWORD
WINAPI
ResUtilGetClusterGroupType(IN HGROUP hGroup, OUT CLUSGROUP_TYPE * groupType);

HGROUP
WINAPI
ResUtilGetCoreGroup(IN HCLUSTER hCluster);

DWORD
WINAPI
ResUtilResourceDepEnum(
    IN HRESOURCE                hSelf,
    IN DWORD                    enumType,
    IN LPRESOURCE_CALLBACK_EX   pResCallBack,
    IN PVOID                    pParameter
    );
DWORD
WINAPI
ResUtilDupResource(IN HRESOURCE group, OUT HRESOURCE *copy);

DWORD
WINAPI
ResUtilGetClusterId( IN HCLUSTER hCluster,OUT GUID *guid );


DWORD
WINAPI
ResUtilNodeEnum(
    IN HCLUSTER             hCluster,
    IN LPNODE_CALLBACK      pNodeCallBack,
    IN PVOID                pParameter
    );

#ifdef __cplusplus
}
#endif


#endif // ifdef _RESAPI_DEFINES_


#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_PKG_CLUSTER) */
#pragma endregion

Youez - 2016 - github.com/yon3zu
LinuXploit