/*** Autogenerated by WIDL 10.12 from include/vsmgmt.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __vsmgmt_h__
#define __vsmgmt_h__

/* Forward declarations */

#ifndef __IVssSnapshotMgmt_FWD_DEFINED__
#define __IVssSnapshotMgmt_FWD_DEFINED__
typedef interface IVssSnapshotMgmt IVssSnapshotMgmt;
#ifdef __cplusplus
interface IVssSnapshotMgmt;
#endif /* __cplusplus */
#endif

#ifndef __IVssSnapshotMgmt2_FWD_DEFINED__
#define __IVssSnapshotMgmt2_FWD_DEFINED__
typedef interface IVssSnapshotMgmt2 IVssSnapshotMgmt2;
#ifdef __cplusplus
interface IVssSnapshotMgmt2;
#endif /* __cplusplus */
#endif

#ifndef __IVssDifferentialSoftwareSnapshotMgmt_FWD_DEFINED__
#define __IVssDifferentialSoftwareSnapshotMgmt_FWD_DEFINED__
typedef interface IVssDifferentialSoftwareSnapshotMgmt IVssDifferentialSoftwareSnapshotMgmt;
#ifdef __cplusplus
interface IVssDifferentialSoftwareSnapshotMgmt;
#endif /* __cplusplus */
#endif

#ifndef __IVssDifferentialSoftwareSnapshotMgmt2_FWD_DEFINED__
#define __IVssDifferentialSoftwareSnapshotMgmt2_FWD_DEFINED__
typedef interface IVssDifferentialSoftwareSnapshotMgmt2 IVssDifferentialSoftwareSnapshotMgmt2;
#ifdef __cplusplus
interface IVssDifferentialSoftwareSnapshotMgmt2;
#endif /* __cplusplus */
#endif

#ifndef __IVssDifferentialSoftwareSnapshotMgmt3_FWD_DEFINED__
#define __IVssDifferentialSoftwareSnapshotMgmt3_FWD_DEFINED__
typedef interface IVssDifferentialSoftwareSnapshotMgmt3 IVssDifferentialSoftwareSnapshotMgmt3;
#ifdef __cplusplus
interface IVssDifferentialSoftwareSnapshotMgmt3;
#endif /* __cplusplus */
#endif

#ifndef __IVssEnumMgmtObject_FWD_DEFINED__
#define __IVssEnumMgmtObject_FWD_DEFINED__
typedef interface IVssEnumMgmtObject IVssEnumMgmtObject;
#ifdef __cplusplus
interface IVssEnumMgmtObject;
#endif /* __cplusplus */
#endif

#ifndef __VssSnapshotMgmt_FWD_DEFINED__
#define __VssSnapshotMgmt_FWD_DEFINED__
#ifdef __cplusplus
typedef class VssSnapshotMgmt VssSnapshotMgmt;
#else
typedef struct VssSnapshotMgmt VssSnapshotMgmt;
#endif /* defined __cplusplus */
#endif /* defined __VssSnapshotMgmt_FWD_DEFINED__ */

/* Headers for imported files */

#include <oaidl.h>
#include <ocidl.h>
#include <vss.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
typedef enum _VSS_MGMT_OBJECT_TYPE {
    VSS_MGMT_OBJECT_UNKNOWN = 0,
    VSS_MGMT_OBJECT_VOLUME = 1,
    VSS_MGMT_OBJECT_DIFF_VOLUME = 2,
    VSS_MGMT_OBJECT_DIFF_AREA = 3
} VSS_MGMT_OBJECT_TYPE;
typedef enum _VSS_MGMT_OBJECT_TYPE *PVSS_MGMT_OBJECT_TYPE;
#define VSS_ASSOC_NO_MAX_SPACE (-1)

#define VSS_ASSOC_REMOVE (0)

typedef struct _VSS_VOLUME_PROP {
    VSS_PWSZ m_pwszVolumeName;
    VSS_PWSZ m_pwszVolumeDisplayName;
} VSS_VOLUME_PROP;
typedef struct _VSS_VOLUME_PROP *PVSS_VOLUME_PROP;
typedef struct _VSS_DIFF_VOLUME_PROP {
    VSS_PWSZ m_pwszVolumeName;
    VSS_PWSZ m_pwszVolumeDisplayName;
    LONGLONG m_llVolumeFreeSpace;
    LONGLONG m_llVolumeTotalSpace;
} VSS_DIFF_VOLUME_PROP;
typedef struct _VSS_DIFF_VOLUME_PROP *PVSS_DIFF_VOLUME_PROP;
typedef struct _VSS_DIFF_AREA_PROP {
    VSS_PWSZ m_pwszVolumeName;
    VSS_PWSZ m_pwszDiffAreaVolumeName;
    LONGLONG m_llMaximumDiffSpace;
    LONGLONG m_llAllocatedDiffSpace;
    LONGLONG m_llUsedDiffSpace;
} VSS_DIFF_AREA_PROP;
typedef struct _VSS_DIFF_AREA_PROP *PVSS_DIFF_AREA_PROP;
typedef union __WIDL_vsmgmt_generated_name_00000021 {
    VSS_VOLUME_PROP Vol;
    VSS_DIFF_VOLUME_PROP DiffVol;
    VSS_DIFF_AREA_PROP DiffArea;
} VSS_MGMT_OBJECT_UNION;
typedef union __WIDL_vsmgmt_generated_name_00000021 *PVSS_MGMT_OBJECT_UNION;
typedef struct _VSS_MGMT_OBJECT_PROP {
    VSS_MGMT_OBJECT_TYPE Type;
    VSS_MGMT_OBJECT_UNION Obj;
} VSS_MGMT_OBJECT_PROP;
typedef struct _VSS_MGMT_OBJECT_PROP *PVSS_MGMT_OBJECT_PROP;
typedef enum _VSS_PROTECTION_LEVEL {
    VSS_PROTECTION_LEVEL_ORIGINAL_VOLUME = 0,
    VSS_PROTECTION_LEVEL_SNAPSHOT = 1
} VSS_PROTECTION_LEVEL;
typedef enum _VSS_PROTECTION_LEVEL *PVSS_PROTECTION_LEVEL;
typedef enum _VSS_PROTECTION_FAULT {
    VSS_PROTECTION_FAULT_NONE = 0,
    VSS_PROTECTION_FAULT_DIFF_AREA_MISSING = 1,
    VSS_PROTECTION_FAULT_IO_FAILURE_DURING_ONLINE = 2,
    VSS_PROTECTION_FAULT_META_DATA_CORRUPTION = 3,
    VSS_PROTECTION_FAULT_MEMORY_ALLOCATION_FAILURE = 4,
    VSS_PROTECTION_FAULT_MAPPED_MEMORY_FAILURE = 5,
    VSS_PROTECTION_FAULT_COW_READ_FAILURE = 6,
    VSS_PROTECTION_FAULT_COW_WRITE_FAILURE = 7,
    VSS_PROTECTION_FAULT_DIFF_AREA_FULL = 8,
    VSS_PROTECTION_FAULT_GROW_TOO_SLOW = 9,
    VSS_PROTECTION_FAULT_GROW_FAILED = 10,
    VSS_PROTECTION_FAULT_DESTROY_ALL_SNAPSHOTS = 11,
    VSS_PROTECTION_FAULT_FILE_SYSTEM_FAILURE = 12,
    VSS_PROTECTION_FAULT_IO_FAILURE = 13,
    VSS_PROTECTION_FAULT_DIFF_AREA_REMOVED = 14,
    VSS_PROTECTION_FAULT_EXTERNAL_WRITER_TO_DIFF_AREA = 15,
    VSS_PROTECTION_FAULT_MOUNT_DURING_CLUSTER_OFFLINE = 16
} VSS_PROTECTION_FAULT;
typedef enum _VSS_PROTECTION_FAULT *PVSS_PROTECTION_FAULT;
typedef struct _VSS_VOLUME_PROTECTION_INFO {
    VSS_PROTECTION_LEVEL m_protectionLevel;
    WINBOOL m_volumeIsOfflineForProtection;
    VSS_PROTECTION_FAULT m_protectionFault;
    LONG m_failureStatus;
    WINBOOL m_volumeHasUnusedDiffArea;
    DWORD m_reserved;
} VSS_VOLUME_PROTECTION_INFO;
typedef struct _VSS_VOLUME_PROTECTION_INFO *PVSS_VOLUME_PROTECTION_INFO;
#ifndef __IVssSnapshotMgmt_FWD_DEFINED__
#define __IVssSnapshotMgmt_FWD_DEFINED__
typedef interface IVssSnapshotMgmt IVssSnapshotMgmt;
#ifdef __cplusplus
interface IVssSnapshotMgmt;
#endif /* __cplusplus */
#endif

#ifndef __IVssDifferentialSoftwareSnapshotMgmt_FWD_DEFINED__
#define __IVssDifferentialSoftwareSnapshotMgmt_FWD_DEFINED__
typedef interface IVssDifferentialSoftwareSnapshotMgmt IVssDifferentialSoftwareSnapshotMgmt;
#ifdef __cplusplus
interface IVssDifferentialSoftwareSnapshotMgmt;
#endif /* __cplusplus */
#endif

#ifndef __IVssEnumMgmtObject_FWD_DEFINED__
#define __IVssEnumMgmtObject_FWD_DEFINED__
typedef interface IVssEnumMgmtObject IVssEnumMgmtObject;
#ifdef __cplusplus
interface IVssEnumMgmtObject;
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * IVssSnapshotMgmt interface
 */
#ifndef __IVssSnapshotMgmt_INTERFACE_DEFINED__
#define __IVssSnapshotMgmt_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssSnapshotMgmt, 0xfa7df749, 0x66e7, 0x4986, 0xa2,0x7f, 0xe2,0xf0,0x4a,0xe5,0x37,0x72);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fa7df749-66e7-4986-a27f-e2f04ae53772")
IVssSnapshotMgmt : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetProviderMgmtInterface(
        VSS_ID ProviderId,
        REFIID InterfaceId,
        IUnknown **ppItf) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryVolumesSupportedForSnapshots(
        VSS_ID ProviderId,
        LONG lContext,
        IVssEnumMgmtObject **ppEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE QuerySnapshotsByVolume(
        VSS_PWSZ pwszVolumeName,
        VSS_ID ProviderId,
        IVssEnumObject **ppEnum) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssSnapshotMgmt, 0xfa7df749, 0x66e7, 0x4986, 0xa2,0x7f, 0xe2,0xf0,0x4a,0xe5,0x37,0x72)
#endif
#else
typedef struct IVssSnapshotMgmtVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IVssSnapshotMgmt *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IVssSnapshotMgmt *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IVssSnapshotMgmt *This);

    /*** IVssSnapshotMgmt methods ***/
    HRESULT (STDMETHODCALLTYPE *GetProviderMgmtInterface)(
        IVssSnapshotMgmt *This,
        VSS_ID ProviderId,
        REFIID InterfaceId,
        IUnknown **ppItf);

    HRESULT (STDMETHODCALLTYPE *QueryVolumesSupportedForSnapshots)(
        IVssSnapshotMgmt *This,
        VSS_ID ProviderId,
        LONG lContext,
        IVssEnumMgmtObject **ppEnum);

    HRESULT (STDMETHODCALLTYPE *QuerySnapshotsByVolume)(
        IVssSnapshotMgmt *This,
        VSS_PWSZ pwszVolumeName,
        VSS_ID ProviderId,
        IVssEnumObject **ppEnum);

    END_INTERFACE
} IVssSnapshotMgmtVtbl;

interface IVssSnapshotMgmt {
    CONST_VTBL IVssSnapshotMgmtVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssSnapshotMgmt_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssSnapshotMgmt_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssSnapshotMgmt_Release(This) (This)->lpVtbl->Release(This)
/*** IVssSnapshotMgmt methods ***/
#define IVssSnapshotMgmt_GetProviderMgmtInterface(This,ProviderId,InterfaceId,ppItf) (This)->lpVtbl->GetProviderMgmtInterface(This,ProviderId,InterfaceId,ppItf)
#define IVssSnapshotMgmt_QueryVolumesSupportedForSnapshots(This,ProviderId,lContext,ppEnum) (This)->lpVtbl->QueryVolumesSupportedForSnapshots(This,ProviderId,lContext,ppEnum)
#define IVssSnapshotMgmt_QuerySnapshotsByVolume(This,pwszVolumeName,ProviderId,ppEnum) (This)->lpVtbl->QuerySnapshotsByVolume(This,pwszVolumeName,ProviderId,ppEnum)
#else
/*** IUnknown methods ***/
static inline HRESULT IVssSnapshotMgmt_QueryInterface(IVssSnapshotMgmt* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IVssSnapshotMgmt_AddRef(IVssSnapshotMgmt* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IVssSnapshotMgmt_Release(IVssSnapshotMgmt* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssSnapshotMgmt methods ***/
static inline HRESULT IVssSnapshotMgmt_GetProviderMgmtInterface(IVssSnapshotMgmt* This,VSS_ID ProviderId,REFIID InterfaceId,IUnknown **ppItf) {
    return This->lpVtbl->GetProviderMgmtInterface(This,ProviderId,InterfaceId,ppItf);
}
static inline HRESULT IVssSnapshotMgmt_QueryVolumesSupportedForSnapshots(IVssSnapshotMgmt* This,VSS_ID ProviderId,LONG lContext,IVssEnumMgmtObject **ppEnum) {
    return This->lpVtbl->QueryVolumesSupportedForSnapshots(This,ProviderId,lContext,ppEnum);
}
static inline HRESULT IVssSnapshotMgmt_QuerySnapshotsByVolume(IVssSnapshotMgmt* This,VSS_PWSZ pwszVolumeName,VSS_ID ProviderId,IVssEnumObject **ppEnum) {
    return This->lpVtbl->QuerySnapshotsByVolume(This,pwszVolumeName,ProviderId,ppEnum);
}
#endif
#endif

#endif


#endif  /* __IVssSnapshotMgmt_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssSnapshotMgmt2 interface
 */
#ifndef __IVssSnapshotMgmt2_INTERFACE_DEFINED__
#define __IVssSnapshotMgmt2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssSnapshotMgmt2, 0x0f61ec39, 0xfe82, 0x45f2, 0xa3,0xf0, 0x76,0x8b,0x5d,0x42,0x71,0x02);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0f61ec39-fe82-45f2-a3f0-768b5d427102")
IVssSnapshotMgmt2 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetMinDiffAreaSize(
        LONGLONG *pllMinDiffAreaSize) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssSnapshotMgmt2, 0x0f61ec39, 0xfe82, 0x45f2, 0xa3,0xf0, 0x76,0x8b,0x5d,0x42,0x71,0x02)
#endif
#else
typedef struct IVssSnapshotMgmt2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IVssSnapshotMgmt2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IVssSnapshotMgmt2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IVssSnapshotMgmt2 *This);

    /*** IVssSnapshotMgmt2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetMinDiffAreaSize)(
        IVssSnapshotMgmt2 *This,
        LONGLONG *pllMinDiffAreaSize);

    END_INTERFACE
} IVssSnapshotMgmt2Vtbl;

interface IVssSnapshotMgmt2 {
    CONST_VTBL IVssSnapshotMgmt2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssSnapshotMgmt2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssSnapshotMgmt2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssSnapshotMgmt2_Release(This) (This)->lpVtbl->Release(This)
/*** IVssSnapshotMgmt2 methods ***/
#define IVssSnapshotMgmt2_GetMinDiffAreaSize(This,pllMinDiffAreaSize) (This)->lpVtbl->GetMinDiffAreaSize(This,pllMinDiffAreaSize)
#else
/*** IUnknown methods ***/
static inline HRESULT IVssSnapshotMgmt2_QueryInterface(IVssSnapshotMgmt2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IVssSnapshotMgmt2_AddRef(IVssSnapshotMgmt2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IVssSnapshotMgmt2_Release(IVssSnapshotMgmt2* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssSnapshotMgmt2 methods ***/
static inline HRESULT IVssSnapshotMgmt2_GetMinDiffAreaSize(IVssSnapshotMgmt2* This,LONGLONG *pllMinDiffAreaSize) {
    return This->lpVtbl->GetMinDiffAreaSize(This,pllMinDiffAreaSize);
}
#endif
#endif

#endif


#endif  /* __IVssSnapshotMgmt2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssDifferentialSoftwareSnapshotMgmt interface
 */
#ifndef __IVssDifferentialSoftwareSnapshotMgmt_INTERFACE_DEFINED__
#define __IVssDifferentialSoftwareSnapshotMgmt_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssDifferentialSoftwareSnapshotMgmt, 0x214a0f28, 0xb737, 0x4026, 0xb8,0x47, 0x4f,0x9e,0x37,0xd7,0x95,0x29);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("214a0f28-b737-4026-b847-4f9e37d79529")
IVssDifferentialSoftwareSnapshotMgmt : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AddDiffArea(
        VSS_PWSZ pwszVolumeName,
        VSS_PWSZ pwszDiffAreaVolumeName,
        LONGLONG llMaximumDiffSpace) = 0;

    virtual HRESULT STDMETHODCALLTYPE ChangeDiffAreaMaximumSize(
        VSS_PWSZ pwszVolumeName,
        VSS_PWSZ pwszDiffAreaVolumeName,
        LONGLONG llMaximumDiffSpace) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryVolumesSupportedForDiffAreas(
        VSS_PWSZ pwszOriginalVolumeName,
        IVssEnumMgmtObject **ppEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryDiffAreasForVolume(
        VSS_PWSZ pwszVolumeName,
        IVssEnumMgmtObject **ppEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryDiffAreasOnVolume(
        VSS_PWSZ pwszVolumeName,
        IVssEnumMgmtObject **ppEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryDiffAreasForSnapshot(
        VSS_ID SnapshotId,
        IVssEnumMgmtObject **ppEnum) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssDifferentialSoftwareSnapshotMgmt, 0x214a0f28, 0xb737, 0x4026, 0xb8,0x47, 0x4f,0x9e,0x37,0xd7,0x95,0x29)
#endif
#else
typedef struct IVssDifferentialSoftwareSnapshotMgmtVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IVssDifferentialSoftwareSnapshotMgmt *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IVssDifferentialSoftwareSnapshotMgmt *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IVssDifferentialSoftwareSnapshotMgmt *This);

    /*** IVssDifferentialSoftwareSnapshotMgmt methods ***/
    HRESULT (STDMETHODCALLTYPE *AddDiffArea)(
        IVssDifferentialSoftwareSnapshotMgmt *This,
        VSS_PWSZ pwszVolumeName,
        VSS_PWSZ pwszDiffAreaVolumeName,
        LONGLONG llMaximumDiffSpace);

    HRESULT (STDMETHODCALLTYPE *ChangeDiffAreaMaximumSize)(
        IVssDifferentialSoftwareSnapshotMgmt *This,
        VSS_PWSZ pwszVolumeName,
        VSS_PWSZ pwszDiffAreaVolumeName,
        LONGLONG llMaximumDiffSpace);

    HRESULT (STDMETHODCALLTYPE *QueryVolumesSupportedForDiffAreas)(
        IVssDifferentialSoftwareSnapshotMgmt *This,
        VSS_PWSZ pwszOriginalVolumeName,
        IVssEnumMgmtObject **ppEnum);

    HRESULT (STDMETHODCALLTYPE *QueryDiffAreasForVolume)(
        IVssDifferentialSoftwareSnapshotMgmt *This,
        VSS_PWSZ pwszVolumeName,
        IVssEnumMgmtObject **ppEnum);

    HRESULT (STDMETHODCALLTYPE *QueryDiffAreasOnVolume)(
        IVssDifferentialSoftwareSnapshotMgmt *This,
        VSS_PWSZ pwszVolumeName,
        IVssEnumMgmtObject **ppEnum);

    HRESULT (STDMETHODCALLTYPE *QueryDiffAreasForSnapshot)(
        IVssDifferentialSoftwareSnapshotMgmt *This,
        VSS_ID SnapshotId,
        IVssEnumMgmtObject **ppEnum);

    END_INTERFACE
} IVssDifferentialSoftwareSnapshotMgmtVtbl;

interface IVssDifferentialSoftwareSnapshotMgmt {
    CONST_VTBL IVssDifferentialSoftwareSnapshotMgmtVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssDifferentialSoftwareSnapshotMgmt_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssDifferentialSoftwareSnapshotMgmt_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssDifferentialSoftwareSnapshotMgmt_Release(This) (This)->lpVtbl->Release(This)
/*** IVssDifferentialSoftwareSnapshotMgmt methods ***/
#define IVssDifferentialSoftwareSnapshotMgmt_AddDiffArea(This,pwszVolumeName,pwszDiffAreaVolumeName,llMaximumDiffSpace) (This)->lpVtbl->AddDiffArea(This,pwszVolumeName,pwszDiffAreaVolumeName,llMaximumDiffSpace)
#define IVssDifferentialSoftwareSnapshotMgmt_ChangeDiffAreaMaximumSize(This,pwszVolumeName,pwszDiffAreaVolumeName,llMaximumDiffSpace) (This)->lpVtbl->ChangeDiffAreaMaximumSize(This,pwszVolumeName,pwszDiffAreaVolumeName,llMaximumDiffSpace)
#define IVssDifferentialSoftwareSnapshotMgmt_QueryVolumesSupportedForDiffAreas(This,pwszOriginalVolumeName,ppEnum) (This)->lpVtbl->QueryVolumesSupportedForDiffAreas(This,pwszOriginalVolumeName,ppEnum)
#define IVssDifferentialSoftwareSnapshotMgmt_QueryDiffAreasForVolume(This,pwszVolumeName,ppEnum) (This)->lpVtbl->QueryDiffAreasForVolume(This,pwszVolumeName,ppEnum)
#define IVssDifferentialSoftwareSnapshotMgmt_QueryDiffAreasOnVolume(This,pwszVolumeName,ppEnum) (This)->lpVtbl->QueryDiffAreasOnVolume(This,pwszVolumeName,ppEnum)
#define IVssDifferentialSoftwareSnapshotMgmt_QueryDiffAreasForSnapshot(This,SnapshotId,ppEnum) (This)->lpVtbl->QueryDiffAreasForSnapshot(This,SnapshotId,ppEnum)
#else
/*** IUnknown methods ***/
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt_QueryInterface(IVssDifferentialSoftwareSnapshotMgmt* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IVssDifferentialSoftwareSnapshotMgmt_AddRef(IVssDifferentialSoftwareSnapshotMgmt* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IVssDifferentialSoftwareSnapshotMgmt_Release(IVssDifferentialSoftwareSnapshotMgmt* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssDifferentialSoftwareSnapshotMgmt methods ***/
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt_AddDiffArea(IVssDifferentialSoftwareSnapshotMgmt* This,VSS_PWSZ pwszVolumeName,VSS_PWSZ pwszDiffAreaVolumeName,LONGLONG llMaximumDiffSpace) {
    return This->lpVtbl->AddDiffArea(This,pwszVolumeName,pwszDiffAreaVolumeName,llMaximumDiffSpace);
}
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt_ChangeDiffAreaMaximumSize(IVssDifferentialSoftwareSnapshotMgmt* This,VSS_PWSZ pwszVolumeName,VSS_PWSZ pwszDiffAreaVolumeName,LONGLONG llMaximumDiffSpace) {
    return This->lpVtbl->ChangeDiffAreaMaximumSize(This,pwszVolumeName,pwszDiffAreaVolumeName,llMaximumDiffSpace);
}
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt_QueryVolumesSupportedForDiffAreas(IVssDifferentialSoftwareSnapshotMgmt* This,VSS_PWSZ pwszOriginalVolumeName,IVssEnumMgmtObject **ppEnum) {
    return This->lpVtbl->QueryVolumesSupportedForDiffAreas(This,pwszOriginalVolumeName,ppEnum);
}
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt_QueryDiffAreasForVolume(IVssDifferentialSoftwareSnapshotMgmt* This,VSS_PWSZ pwszVolumeName,IVssEnumMgmtObject **ppEnum) {
    return This->lpVtbl->QueryDiffAreasForVolume(This,pwszVolumeName,ppEnum);
}
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt_QueryDiffAreasOnVolume(IVssDifferentialSoftwareSnapshotMgmt* This,VSS_PWSZ pwszVolumeName,IVssEnumMgmtObject **ppEnum) {
    return This->lpVtbl->QueryDiffAreasOnVolume(This,pwszVolumeName,ppEnum);
}
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt_QueryDiffAreasForSnapshot(IVssDifferentialSoftwareSnapshotMgmt* This,VSS_ID SnapshotId,IVssEnumMgmtObject **ppEnum) {
    return This->lpVtbl->QueryDiffAreasForSnapshot(This,SnapshotId,ppEnum);
}
#endif
#endif

#endif


#endif  /* __IVssDifferentialSoftwareSnapshotMgmt_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssDifferentialSoftwareSnapshotMgmt2 interface
 */
#ifndef __IVssDifferentialSoftwareSnapshotMgmt2_INTERFACE_DEFINED__
#define __IVssDifferentialSoftwareSnapshotMgmt2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssDifferentialSoftwareSnapshotMgmt2, 0x949d7353, 0x675f, 0x4275, 0x89,0x69, 0xf0,0x44,0xc6,0x27,0x78,0x15);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("949d7353-675f-4275-8969-f044c6277815")
IVssDifferentialSoftwareSnapshotMgmt2 : public IVssDifferentialSoftwareSnapshotMgmt
{
    virtual HRESULT STDMETHODCALLTYPE ChangeDiffAreaMaximumSizeEx(
        VSS_PWSZ pwszVolumeName,
        VSS_PWSZ pwszDiffAreaVolumeName,
        LONGLONG llMaximumDiffSpace,
        WINBOOL bVolatile) = 0;

    virtual HRESULT STDMETHODCALLTYPE MigrateDiffAreas(
        VSS_PWSZ pwszVolumeName,
        VSS_PWSZ pwszDiffAreaVolumeName,
        VSS_PWSZ pwszNewDiffAreaVolumeName) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryMigrationStatus(
        VSS_PWSZ pwszVolumeName,
        VSS_PWSZ pwszDiffAreaVolumeName,
        IVssAsync **ppAsync) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSnapshotPriority(
        VSS_ID idSnapshot,
        BYTE priority) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssDifferentialSoftwareSnapshotMgmt2, 0x949d7353, 0x675f, 0x4275, 0x89,0x69, 0xf0,0x44,0xc6,0x27,0x78,0x15)
#endif
#else
typedef struct IVssDifferentialSoftwareSnapshotMgmt2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IVssDifferentialSoftwareSnapshotMgmt2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IVssDifferentialSoftwareSnapshotMgmt2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IVssDifferentialSoftwareSnapshotMgmt2 *This);

    /*** IVssDifferentialSoftwareSnapshotMgmt methods ***/
    HRESULT (STDMETHODCALLTYPE *AddDiffArea)(
        IVssDifferentialSoftwareSnapshotMgmt2 *This,
        VSS_PWSZ pwszVolumeName,
        VSS_PWSZ pwszDiffAreaVolumeName,
        LONGLONG llMaximumDiffSpace);

    HRESULT (STDMETHODCALLTYPE *ChangeDiffAreaMaximumSize)(
        IVssDifferentialSoftwareSnapshotMgmt2 *This,
        VSS_PWSZ pwszVolumeName,
        VSS_PWSZ pwszDiffAreaVolumeName,
        LONGLONG llMaximumDiffSpace);

    HRESULT (STDMETHODCALLTYPE *QueryVolumesSupportedForDiffAreas)(
        IVssDifferentialSoftwareSnapshotMgmt2 *This,
        VSS_PWSZ pwszOriginalVolumeName,
        IVssEnumMgmtObject **ppEnum);

    HRESULT (STDMETHODCALLTYPE *QueryDiffAreasForVolume)(
        IVssDifferentialSoftwareSnapshotMgmt2 *This,
        VSS_PWSZ pwszVolumeName,
        IVssEnumMgmtObject **ppEnum);

    HRESULT (STDMETHODCALLTYPE *QueryDiffAreasOnVolume)(
        IVssDifferentialSoftwareSnapshotMgmt2 *This,
        VSS_PWSZ pwszVolumeName,
        IVssEnumMgmtObject **ppEnum);

    HRESULT (STDMETHODCALLTYPE *QueryDiffAreasForSnapshot)(
        IVssDifferentialSoftwareSnapshotMgmt2 *This,
        VSS_ID SnapshotId,
        IVssEnumMgmtObject **ppEnum);

    /*** IVssDifferentialSoftwareSnapshotMgmt2 methods ***/
    HRESULT (STDMETHODCALLTYPE *ChangeDiffAreaMaximumSizeEx)(
        IVssDifferentialSoftwareSnapshotMgmt2 *This,
        VSS_PWSZ pwszVolumeName,
        VSS_PWSZ pwszDiffAreaVolumeName,
        LONGLONG llMaximumDiffSpace,
        WINBOOL bVolatile);

    HRESULT (STDMETHODCALLTYPE *MigrateDiffAreas)(
        IVssDifferentialSoftwareSnapshotMgmt2 *This,
        VSS_PWSZ pwszVolumeName,
        VSS_PWSZ pwszDiffAreaVolumeName,
        VSS_PWSZ pwszNewDiffAreaVolumeName);

    HRESULT (STDMETHODCALLTYPE *QueryMigrationStatus)(
        IVssDifferentialSoftwareSnapshotMgmt2 *This,
        VSS_PWSZ pwszVolumeName,
        VSS_PWSZ pwszDiffAreaVolumeName,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *SetSnapshotPriority)(
        IVssDifferentialSoftwareSnapshotMgmt2 *This,
        VSS_ID idSnapshot,
        BYTE priority);

    END_INTERFACE
} IVssDifferentialSoftwareSnapshotMgmt2Vtbl;

interface IVssDifferentialSoftwareSnapshotMgmt2 {
    CONST_VTBL IVssDifferentialSoftwareSnapshotMgmt2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssDifferentialSoftwareSnapshotMgmt2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssDifferentialSoftwareSnapshotMgmt2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssDifferentialSoftwareSnapshotMgmt2_Release(This) (This)->lpVtbl->Release(This)
/*** IVssDifferentialSoftwareSnapshotMgmt methods ***/
#define IVssDifferentialSoftwareSnapshotMgmt2_AddDiffArea(This,pwszVolumeName,pwszDiffAreaVolumeName,llMaximumDiffSpace) (This)->lpVtbl->AddDiffArea(This,pwszVolumeName,pwszDiffAreaVolumeName,llMaximumDiffSpace)
#define IVssDifferentialSoftwareSnapshotMgmt2_ChangeDiffAreaMaximumSize(This,pwszVolumeName,pwszDiffAreaVolumeName,llMaximumDiffSpace) (This)->lpVtbl->ChangeDiffAreaMaximumSize(This,pwszVolumeName,pwszDiffAreaVolumeName,llMaximumDiffSpace)
#define IVssDifferentialSoftwareSnapshotMgmt2_QueryVolumesSupportedForDiffAreas(This,pwszOriginalVolumeName,ppEnum) (This)->lpVtbl->QueryVolumesSupportedForDiffAreas(This,pwszOriginalVolumeName,ppEnum)
#define IVssDifferentialSoftwareSnapshotMgmt2_QueryDiffAreasForVolume(This,pwszVolumeName,ppEnum) (This)->lpVtbl->QueryDiffAreasForVolume(This,pwszVolumeName,ppEnum)
#define IVssDifferentialSoftwareSnapshotMgmt2_QueryDiffAreasOnVolume(This,pwszVolumeName,ppEnum) (This)->lpVtbl->QueryDiffAreasOnVolume(This,pwszVolumeName,ppEnum)
#define IVssDifferentialSoftwareSnapshotMgmt2_QueryDiffAreasForSnapshot(This,SnapshotId,ppEnum) (This)->lpVtbl->QueryDiffAreasForSnapshot(This,SnapshotId,ppEnum)
/*** IVssDifferentialSoftwareSnapshotMgmt2 methods ***/
#define IVssDifferentialSoftwareSnapshotMgmt2_ChangeDiffAreaMaximumSizeEx(This,pwszVolumeName,pwszDiffAreaVolumeName,llMaximumDiffSpace,bVolatile) (This)->lpVtbl->ChangeDiffAreaMaximumSizeEx(This,pwszVolumeName,pwszDiffAreaVolumeName,llMaximumDiffSpace,bVolatile)
#define IVssDifferentialSoftwareSnapshotMgmt2_MigrateDiffAreas(This,pwszVolumeName,pwszDiffAreaVolumeName,pwszNewDiffAreaVolumeName) (This)->lpVtbl->MigrateDiffAreas(This,pwszVolumeName,pwszDiffAreaVolumeName,pwszNewDiffAreaVolumeName)
#define IVssDifferentialSoftwareSnapshotMgmt2_QueryMigrationStatus(This,pwszVolumeName,pwszDiffAreaVolumeName,ppAsync) (This)->lpVtbl->QueryMigrationStatus(This,pwszVolumeName,pwszDiffAreaVolumeName,ppAsync)
#define IVssDifferentialSoftwareSnapshotMgmt2_SetSnapshotPriority(This,idSnapshot,priority) (This)->lpVtbl->SetSnapshotPriority(This,idSnapshot,priority)
#else
/*** IUnknown methods ***/
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt2_QueryInterface(IVssDifferentialSoftwareSnapshotMgmt2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IVssDifferentialSoftwareSnapshotMgmt2_AddRef(IVssDifferentialSoftwareSnapshotMgmt2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IVssDifferentialSoftwareSnapshotMgmt2_Release(IVssDifferentialSoftwareSnapshotMgmt2* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssDifferentialSoftwareSnapshotMgmt methods ***/
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt2_AddDiffArea(IVssDifferentialSoftwareSnapshotMgmt2* This,VSS_PWSZ pwszVolumeName,VSS_PWSZ pwszDiffAreaVolumeName,LONGLONG llMaximumDiffSpace) {
    return This->lpVtbl->AddDiffArea(This,pwszVolumeName,pwszDiffAreaVolumeName,llMaximumDiffSpace);
}
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt2_ChangeDiffAreaMaximumSize(IVssDifferentialSoftwareSnapshotMgmt2* This,VSS_PWSZ pwszVolumeName,VSS_PWSZ pwszDiffAreaVolumeName,LONGLONG llMaximumDiffSpace) {
    return This->lpVtbl->ChangeDiffAreaMaximumSize(This,pwszVolumeName,pwszDiffAreaVolumeName,llMaximumDiffSpace);
}
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt2_QueryVolumesSupportedForDiffAreas(IVssDifferentialSoftwareSnapshotMgmt2* This,VSS_PWSZ pwszOriginalVolumeName,IVssEnumMgmtObject **ppEnum) {
    return This->lpVtbl->QueryVolumesSupportedForDiffAreas(This,pwszOriginalVolumeName,ppEnum);
}
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt2_QueryDiffAreasForVolume(IVssDifferentialSoftwareSnapshotMgmt2* This,VSS_PWSZ pwszVolumeName,IVssEnumMgmtObject **ppEnum) {
    return This->lpVtbl->QueryDiffAreasForVolume(This,pwszVolumeName,ppEnum);
}
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt2_QueryDiffAreasOnVolume(IVssDifferentialSoftwareSnapshotMgmt2* This,VSS_PWSZ pwszVolumeName,IVssEnumMgmtObject **ppEnum) {
    return This->lpVtbl->QueryDiffAreasOnVolume(This,pwszVolumeName,ppEnum);
}
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt2_QueryDiffAreasForSnapshot(IVssDifferentialSoftwareSnapshotMgmt2* This,VSS_ID SnapshotId,IVssEnumMgmtObject **ppEnum) {
    return This->lpVtbl->QueryDiffAreasForSnapshot(This,SnapshotId,ppEnum);
}
/*** IVssDifferentialSoftwareSnapshotMgmt2 methods ***/
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt2_ChangeDiffAreaMaximumSizeEx(IVssDifferentialSoftwareSnapshotMgmt2* This,VSS_PWSZ pwszVolumeName,VSS_PWSZ pwszDiffAreaVolumeName,LONGLONG llMaximumDiffSpace,WINBOOL bVolatile) {
    return This->lpVtbl->ChangeDiffAreaMaximumSizeEx(This,pwszVolumeName,pwszDiffAreaVolumeName,llMaximumDiffSpace,bVolatile);
}
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt2_MigrateDiffAreas(IVssDifferentialSoftwareSnapshotMgmt2* This,VSS_PWSZ pwszVolumeName,VSS_PWSZ pwszDiffAreaVolumeName,VSS_PWSZ pwszNewDiffAreaVolumeName) {
    return This->lpVtbl->MigrateDiffAreas(This,pwszVolumeName,pwszDiffAreaVolumeName,pwszNewDiffAreaVolumeName);
}
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt2_QueryMigrationStatus(IVssDifferentialSoftwareSnapshotMgmt2* This,VSS_PWSZ pwszVolumeName,VSS_PWSZ pwszDiffAreaVolumeName,IVssAsync **ppAsync) {
    return This->lpVtbl->QueryMigrationStatus(This,pwszVolumeName,pwszDiffAreaVolumeName,ppAsync);
}
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt2_SetSnapshotPriority(IVssDifferentialSoftwareSnapshotMgmt2* This,VSS_ID idSnapshot,BYTE priority) {
    return This->lpVtbl->SetSnapshotPriority(This,idSnapshot,priority);
}
#endif
#endif

#endif


#endif  /* __IVssDifferentialSoftwareSnapshotMgmt2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssDifferentialSoftwareSnapshotMgmt3 interface
 */
#ifndef __IVssDifferentialSoftwareSnapshotMgmt3_INTERFACE_DEFINED__
#define __IVssDifferentialSoftwareSnapshotMgmt3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssDifferentialSoftwareSnapshotMgmt3, 0x383f7e71, 0xa4c5, 0x401f, 0xb2,0x7f, 0xf8,0x26,0x28,0x9f,0x84,0x58);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("383f7e71-a4c5-401f-b27f-f826289f8458")
IVssDifferentialSoftwareSnapshotMgmt3 : public IVssDifferentialSoftwareSnapshotMgmt2
{
    virtual HRESULT STDMETHODCALLTYPE SetVolumeProtectLevel(
        VSS_PWSZ pwszVolumeName,
        VSS_PROTECTION_LEVEL protectionLevel) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVolumeProtectLevel(
        VSS_PWSZ pwszVolumeName,
        VSS_VOLUME_PROTECTION_INFO *protectionLevel) = 0;

    virtual HRESULT STDMETHODCALLTYPE ClearVolumeProtectFault(
        VSS_PWSZ pwszVolumeName) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteUnusedDiffAreas(
        VSS_PWSZ pwszDiffAreaVolumeName) = 0;

    virtual HRESULT STDMETHODCALLTYPE QuerySnapshotDeltaBitmap(
        VSS_ID idSnapshotOlder,
        VSS_ID idSnapshotYounger,
        ULONG *pcBlockSizePerBit,
        ULONG *pcBitmapLength,
        BYTE **ppbBitmap) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssDifferentialSoftwareSnapshotMgmt3, 0x383f7e71, 0xa4c5, 0x401f, 0xb2,0x7f, 0xf8,0x26,0x28,0x9f,0x84,0x58)
#endif
#else
typedef struct IVssDifferentialSoftwareSnapshotMgmt3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IVssDifferentialSoftwareSnapshotMgmt3 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IVssDifferentialSoftwareSnapshotMgmt3 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IVssDifferentialSoftwareSnapshotMgmt3 *This);

    /*** IVssDifferentialSoftwareSnapshotMgmt methods ***/
    HRESULT (STDMETHODCALLTYPE *AddDiffArea)(
        IVssDifferentialSoftwareSnapshotMgmt3 *This,
        VSS_PWSZ pwszVolumeName,
        VSS_PWSZ pwszDiffAreaVolumeName,
        LONGLONG llMaximumDiffSpace);

    HRESULT (STDMETHODCALLTYPE *ChangeDiffAreaMaximumSize)(
        IVssDifferentialSoftwareSnapshotMgmt3 *This,
        VSS_PWSZ pwszVolumeName,
        VSS_PWSZ pwszDiffAreaVolumeName,
        LONGLONG llMaximumDiffSpace);

    HRESULT (STDMETHODCALLTYPE *QueryVolumesSupportedForDiffAreas)(
        IVssDifferentialSoftwareSnapshotMgmt3 *This,
        VSS_PWSZ pwszOriginalVolumeName,
        IVssEnumMgmtObject **ppEnum);

    HRESULT (STDMETHODCALLTYPE *QueryDiffAreasForVolume)(
        IVssDifferentialSoftwareSnapshotMgmt3 *This,
        VSS_PWSZ pwszVolumeName,
        IVssEnumMgmtObject **ppEnum);

    HRESULT (STDMETHODCALLTYPE *QueryDiffAreasOnVolume)(
        IVssDifferentialSoftwareSnapshotMgmt3 *This,
        VSS_PWSZ pwszVolumeName,
        IVssEnumMgmtObject **ppEnum);

    HRESULT (STDMETHODCALLTYPE *QueryDiffAreasForSnapshot)(
        IVssDifferentialSoftwareSnapshotMgmt3 *This,
        VSS_ID SnapshotId,
        IVssEnumMgmtObject **ppEnum);

    /*** IVssDifferentialSoftwareSnapshotMgmt2 methods ***/
    HRESULT (STDMETHODCALLTYPE *ChangeDiffAreaMaximumSizeEx)(
        IVssDifferentialSoftwareSnapshotMgmt3 *This,
        VSS_PWSZ pwszVolumeName,
        VSS_PWSZ pwszDiffAreaVolumeName,
        LONGLONG llMaximumDiffSpace,
        WINBOOL bVolatile);

    HRESULT (STDMETHODCALLTYPE *MigrateDiffAreas)(
        IVssDifferentialSoftwareSnapshotMgmt3 *This,
        VSS_PWSZ pwszVolumeName,
        VSS_PWSZ pwszDiffAreaVolumeName,
        VSS_PWSZ pwszNewDiffAreaVolumeName);

    HRESULT (STDMETHODCALLTYPE *QueryMigrationStatus)(
        IVssDifferentialSoftwareSnapshotMgmt3 *This,
        VSS_PWSZ pwszVolumeName,
        VSS_PWSZ pwszDiffAreaVolumeName,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *SetSnapshotPriority)(
        IVssDifferentialSoftwareSnapshotMgmt3 *This,
        VSS_ID idSnapshot,
        BYTE priority);

    /*** IVssDifferentialSoftwareSnapshotMgmt3 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetVolumeProtectLevel)(
        IVssDifferentialSoftwareSnapshotMgmt3 *This,
        VSS_PWSZ pwszVolumeName,
        VSS_PROTECTION_LEVEL protectionLevel);

    HRESULT (STDMETHODCALLTYPE *GetVolumeProtectLevel)(
        IVssDifferentialSoftwareSnapshotMgmt3 *This,
        VSS_PWSZ pwszVolumeName,
        VSS_VOLUME_PROTECTION_INFO *protectionLevel);

    HRESULT (STDMETHODCALLTYPE *ClearVolumeProtectFault)(
        IVssDifferentialSoftwareSnapshotMgmt3 *This,
        VSS_PWSZ pwszVolumeName);

    HRESULT (STDMETHODCALLTYPE *DeleteUnusedDiffAreas)(
        IVssDifferentialSoftwareSnapshotMgmt3 *This,
        VSS_PWSZ pwszDiffAreaVolumeName);

    HRESULT (STDMETHODCALLTYPE *QuerySnapshotDeltaBitmap)(
        IVssDifferentialSoftwareSnapshotMgmt3 *This,
        VSS_ID idSnapshotOlder,
        VSS_ID idSnapshotYounger,
        ULONG *pcBlockSizePerBit,
        ULONG *pcBitmapLength,
        BYTE **ppbBitmap);

    END_INTERFACE
} IVssDifferentialSoftwareSnapshotMgmt3Vtbl;

interface IVssDifferentialSoftwareSnapshotMgmt3 {
    CONST_VTBL IVssDifferentialSoftwareSnapshotMgmt3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssDifferentialSoftwareSnapshotMgmt3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssDifferentialSoftwareSnapshotMgmt3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssDifferentialSoftwareSnapshotMgmt3_Release(This) (This)->lpVtbl->Release(This)
/*** IVssDifferentialSoftwareSnapshotMgmt methods ***/
#define IVssDifferentialSoftwareSnapshotMgmt3_AddDiffArea(This,pwszVolumeName,pwszDiffAreaVolumeName,llMaximumDiffSpace) (This)->lpVtbl->AddDiffArea(This,pwszVolumeName,pwszDiffAreaVolumeName,llMaximumDiffSpace)
#define IVssDifferentialSoftwareSnapshotMgmt3_ChangeDiffAreaMaximumSize(This,pwszVolumeName,pwszDiffAreaVolumeName,llMaximumDiffSpace) (This)->lpVtbl->ChangeDiffAreaMaximumSize(This,pwszVolumeName,pwszDiffAreaVolumeName,llMaximumDiffSpace)
#define IVssDifferentialSoftwareSnapshotMgmt3_QueryVolumesSupportedForDiffAreas(This,pwszOriginalVolumeName,ppEnum) (This)->lpVtbl->QueryVolumesSupportedForDiffAreas(This,pwszOriginalVolumeName,ppEnum)
#define IVssDifferentialSoftwareSnapshotMgmt3_QueryDiffAreasForVolume(This,pwszVolumeName,ppEnum) (This)->lpVtbl->QueryDiffAreasForVolume(This,pwszVolumeName,ppEnum)
#define IVssDifferentialSoftwareSnapshotMgmt3_QueryDiffAreasOnVolume(This,pwszVolumeName,ppEnum) (This)->lpVtbl->QueryDiffAreasOnVolume(This,pwszVolumeName,ppEnum)
#define IVssDifferentialSoftwareSnapshotMgmt3_QueryDiffAreasForSnapshot(This,SnapshotId,ppEnum) (This)->lpVtbl->QueryDiffAreasForSnapshot(This,SnapshotId,ppEnum)
/*** IVssDifferentialSoftwareSnapshotMgmt2 methods ***/
#define IVssDifferentialSoftwareSnapshotMgmt3_ChangeDiffAreaMaximumSizeEx(This,pwszVolumeName,pwszDiffAreaVolumeName,llMaximumDiffSpace,bVolatile) (This)->lpVtbl->ChangeDiffAreaMaximumSizeEx(This,pwszVolumeName,pwszDiffAreaVolumeName,llMaximumDiffSpace,bVolatile)
#define IVssDifferentialSoftwareSnapshotMgmt3_MigrateDiffAreas(This,pwszVolumeName,pwszDiffAreaVolumeName,pwszNewDiffAreaVolumeName) (This)->lpVtbl->MigrateDiffAreas(This,pwszVolumeName,pwszDiffAreaVolumeName,pwszNewDiffAreaVolumeName)
#define IVssDifferentialSoftwareSnapshotMgmt3_QueryMigrationStatus(This,pwszVolumeName,pwszDiffAreaVolumeName,ppAsync) (This)->lpVtbl->QueryMigrationStatus(This,pwszVolumeName,pwszDiffAreaVolumeName,ppAsync)
#define IVssDifferentialSoftwareSnapshotMgmt3_SetSnapshotPriority(This,idSnapshot,priority) (This)->lpVtbl->SetSnapshotPriority(This,idSnapshot,priority)
/*** IVssDifferentialSoftwareSnapshotMgmt3 methods ***/
#define IVssDifferentialSoftwareSnapshotMgmt3_SetVolumeProtectLevel(This,pwszVolumeName,protectionLevel) (This)->lpVtbl->SetVolumeProtectLevel(This,pwszVolumeName,protectionLevel)
#define IVssDifferentialSoftwareSnapshotMgmt3_GetVolumeProtectLevel(This,pwszVolumeName,protectionLevel) (This)->lpVtbl->GetVolumeProtectLevel(This,pwszVolumeName,protectionLevel)
#define IVssDifferentialSoftwareSnapshotMgmt3_ClearVolumeProtectFault(This,pwszVolumeName) (This)->lpVtbl->ClearVolumeProtectFault(This,pwszVolumeName)
#define IVssDifferentialSoftwareSnapshotMgmt3_DeleteUnusedDiffAreas(This,pwszDiffAreaVolumeName) (This)->lpVtbl->DeleteUnusedDiffAreas(This,pwszDiffAreaVolumeName)
#define IVssDifferentialSoftwareSnapshotMgmt3_QuerySnapshotDeltaBitmap(This,idSnapshotOlder,idSnapshotYounger,pcBlockSizePerBit,pcBitmapLength,ppbBitmap) (This)->lpVtbl->QuerySnapshotDeltaBitmap(This,idSnapshotOlder,idSnapshotYounger,pcBlockSizePerBit,pcBitmapLength,ppbBitmap)
#else
/*** IUnknown methods ***/
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt3_QueryInterface(IVssDifferentialSoftwareSnapshotMgmt3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IVssDifferentialSoftwareSnapshotMgmt3_AddRef(IVssDifferentialSoftwareSnapshotMgmt3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IVssDifferentialSoftwareSnapshotMgmt3_Release(IVssDifferentialSoftwareSnapshotMgmt3* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssDifferentialSoftwareSnapshotMgmt methods ***/
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt3_AddDiffArea(IVssDifferentialSoftwareSnapshotMgmt3* This,VSS_PWSZ pwszVolumeName,VSS_PWSZ pwszDiffAreaVolumeName,LONGLONG llMaximumDiffSpace) {
    return This->lpVtbl->AddDiffArea(This,pwszVolumeName,pwszDiffAreaVolumeName,llMaximumDiffSpace);
}
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt3_ChangeDiffAreaMaximumSize(IVssDifferentialSoftwareSnapshotMgmt3* This,VSS_PWSZ pwszVolumeName,VSS_PWSZ pwszDiffAreaVolumeName,LONGLONG llMaximumDiffSpace) {
    return This->lpVtbl->ChangeDiffAreaMaximumSize(This,pwszVolumeName,pwszDiffAreaVolumeName,llMaximumDiffSpace);
}
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt3_QueryVolumesSupportedForDiffAreas(IVssDifferentialSoftwareSnapshotMgmt3* This,VSS_PWSZ pwszOriginalVolumeName,IVssEnumMgmtObject **ppEnum) {
    return This->lpVtbl->QueryVolumesSupportedForDiffAreas(This,pwszOriginalVolumeName,ppEnum);
}
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt3_QueryDiffAreasForVolume(IVssDifferentialSoftwareSnapshotMgmt3* This,VSS_PWSZ pwszVolumeName,IVssEnumMgmtObject **ppEnum) {
    return This->lpVtbl->QueryDiffAreasForVolume(This,pwszVolumeName,ppEnum);
}
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt3_QueryDiffAreasOnVolume(IVssDifferentialSoftwareSnapshotMgmt3* This,VSS_PWSZ pwszVolumeName,IVssEnumMgmtObject **ppEnum) {
    return This->lpVtbl->QueryDiffAreasOnVolume(This,pwszVolumeName,ppEnum);
}
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt3_QueryDiffAreasForSnapshot(IVssDifferentialSoftwareSnapshotMgmt3* This,VSS_ID SnapshotId,IVssEnumMgmtObject **ppEnum) {
    return This->lpVtbl->QueryDiffAreasForSnapshot(This,SnapshotId,ppEnum);
}
/*** IVssDifferentialSoftwareSnapshotMgmt2 methods ***/
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt3_ChangeDiffAreaMaximumSizeEx(IVssDifferentialSoftwareSnapshotMgmt3* This,VSS_PWSZ pwszVolumeName,VSS_PWSZ pwszDiffAreaVolumeName,LONGLONG llMaximumDiffSpace,WINBOOL bVolatile) {
    return This->lpVtbl->ChangeDiffAreaMaximumSizeEx(This,pwszVolumeName,pwszDiffAreaVolumeName,llMaximumDiffSpace,bVolatile);
}
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt3_MigrateDiffAreas(IVssDifferentialSoftwareSnapshotMgmt3* This,VSS_PWSZ pwszVolumeName,VSS_PWSZ pwszDiffAreaVolumeName,VSS_PWSZ pwszNewDiffAreaVolumeName) {
    return This->lpVtbl->MigrateDiffAreas(This,pwszVolumeName,pwszDiffAreaVolumeName,pwszNewDiffAreaVolumeName);
}
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt3_QueryMigrationStatus(IVssDifferentialSoftwareSnapshotMgmt3* This,VSS_PWSZ pwszVolumeName,VSS_PWSZ pwszDiffAreaVolumeName,IVssAsync **ppAsync) {
    return This->lpVtbl->QueryMigrationStatus(This,pwszVolumeName,pwszDiffAreaVolumeName,ppAsync);
}
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt3_SetSnapshotPriority(IVssDifferentialSoftwareSnapshotMgmt3* This,VSS_ID idSnapshot,BYTE priority) {
    return This->lpVtbl->SetSnapshotPriority(This,idSnapshot,priority);
}
/*** IVssDifferentialSoftwareSnapshotMgmt3 methods ***/
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt3_SetVolumeProtectLevel(IVssDifferentialSoftwareSnapshotMgmt3* This,VSS_PWSZ pwszVolumeName,VSS_PROTECTION_LEVEL protectionLevel) {
    return This->lpVtbl->SetVolumeProtectLevel(This,pwszVolumeName,protectionLevel);
}
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt3_GetVolumeProtectLevel(IVssDifferentialSoftwareSnapshotMgmt3* This,VSS_PWSZ pwszVolumeName,VSS_VOLUME_PROTECTION_INFO *protectionLevel) {
    return This->lpVtbl->GetVolumeProtectLevel(This,pwszVolumeName,protectionLevel);
}
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt3_ClearVolumeProtectFault(IVssDifferentialSoftwareSnapshotMgmt3* This,VSS_PWSZ pwszVolumeName) {
    return This->lpVtbl->ClearVolumeProtectFault(This,pwszVolumeName);
}
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt3_DeleteUnusedDiffAreas(IVssDifferentialSoftwareSnapshotMgmt3* This,VSS_PWSZ pwszDiffAreaVolumeName) {
    return This->lpVtbl->DeleteUnusedDiffAreas(This,pwszDiffAreaVolumeName);
}
static inline HRESULT IVssDifferentialSoftwareSnapshotMgmt3_QuerySnapshotDeltaBitmap(IVssDifferentialSoftwareSnapshotMgmt3* This,VSS_ID idSnapshotOlder,VSS_ID idSnapshotYounger,ULONG *pcBlockSizePerBit,ULONG *pcBitmapLength,BYTE **ppbBitmap) {
    return This->lpVtbl->QuerySnapshotDeltaBitmap(This,idSnapshotOlder,idSnapshotYounger,pcBlockSizePerBit,pcBitmapLength,ppbBitmap);
}
#endif
#endif

#endif


#endif  /* __IVssDifferentialSoftwareSnapshotMgmt3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssEnumMgmtObject interface
 */
#ifndef __IVssEnumMgmtObject_INTERFACE_DEFINED__
#define __IVssEnumMgmtObject_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssEnumMgmtObject, 0x01954e6b, 0x9254, 0x4e6e, 0x80,0x8c, 0xc9,0xe0,0x5d,0x00,0x76,0x96);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("01954e6b-9254-4e6e-808c-c9e05d007696")
IVssEnumMgmtObject : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG celt,
        VSS_MGMT_OBJECT_PROP *rgelt,
        ULONG *pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IVssEnumMgmtObject **ppenum) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssEnumMgmtObject, 0x01954e6b, 0x9254, 0x4e6e, 0x80,0x8c, 0xc9,0xe0,0x5d,0x00,0x76,0x96)
#endif
#else
typedef struct IVssEnumMgmtObjectVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IVssEnumMgmtObject *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IVssEnumMgmtObject *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IVssEnumMgmtObject *This);

    /*** IVssEnumMgmtObject methods ***/
    HRESULT (STDMETHODCALLTYPE *Next)(
        IVssEnumMgmtObject *This,
        ULONG celt,
        VSS_MGMT_OBJECT_PROP *rgelt,
        ULONG *pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IVssEnumMgmtObject *This,
        ULONG celt);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IVssEnumMgmtObject *This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IVssEnumMgmtObject *This,
        IVssEnumMgmtObject **ppenum);

    END_INTERFACE
} IVssEnumMgmtObjectVtbl;

interface IVssEnumMgmtObject {
    CONST_VTBL IVssEnumMgmtObjectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssEnumMgmtObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssEnumMgmtObject_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssEnumMgmtObject_Release(This) (This)->lpVtbl->Release(This)
/*** IVssEnumMgmtObject methods ***/
#define IVssEnumMgmtObject_Next(This,celt,rgelt,pceltFetched) (This)->lpVtbl->Next(This,celt,rgelt,pceltFetched)
#define IVssEnumMgmtObject_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IVssEnumMgmtObject_Reset(This) (This)->lpVtbl->Reset(This)
#define IVssEnumMgmtObject_Clone(This,ppenum) (This)->lpVtbl->Clone(This,ppenum)
#else
/*** IUnknown methods ***/
static inline HRESULT IVssEnumMgmtObject_QueryInterface(IVssEnumMgmtObject* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IVssEnumMgmtObject_AddRef(IVssEnumMgmtObject* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IVssEnumMgmtObject_Release(IVssEnumMgmtObject* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssEnumMgmtObject methods ***/
static inline HRESULT IVssEnumMgmtObject_Next(IVssEnumMgmtObject* This,ULONG celt,VSS_MGMT_OBJECT_PROP *rgelt,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,rgelt,pceltFetched);
}
static inline HRESULT IVssEnumMgmtObject_Skip(IVssEnumMgmtObject* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static inline HRESULT IVssEnumMgmtObject_Reset(IVssEnumMgmtObject* This) {
    return This->lpVtbl->Reset(This);
}
static inline HRESULT IVssEnumMgmtObject_Clone(IVssEnumMgmtObject* This,IVssEnumMgmtObject **ppenum) {
    return This->lpVtbl->Clone(This,ppenum);
}
#endif
#endif

#endif


#endif  /* __IVssEnumMgmtObject_INTERFACE_DEFINED__ */

#ifndef __VSMGMT_LIBRARY_DEFINED__
#define __VSMGMT_LIBRARY_DEFINED__

DEFINE_GUID(LIBID_VSMGMT, 0x84015c41, 0x291d, 0x49e6, 0xbf,0x7f, 0xdd,0x40,0xae,0x93,0x63,0x2b);

/*****************************************************************************
 * VssSnapshotMgmt coclass
 */

DEFINE_GUID(CLSID_VssSnapshotMgmt, 0x0b5a2c52, 0x3eb9, 0x470a, 0x96,0xe2, 0x6c,0x6d,0x45,0x70,0xe4,0x0f);

#ifdef __cplusplus
class DECLSPEC_UUID("0b5a2c52-3eb9-470a-96e2-6c6d4570e40f") VssSnapshotMgmt;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(VssSnapshotMgmt, 0x0b5a2c52, 0x3eb9, 0x470a, 0x96,0xe2, 0x6c,0x6d,0x45,0x70,0xe4,0x0f)
#endif
#endif

#endif /* __VSMGMT_LIBRARY_DEFINED__ */
#endif /* WINAPI_PARTITION_DESKTOP */
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __vsmgmt_h__ */
