/*** Autogenerated by WIDL 8.17 from include/vsprov.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 __vsprov_h__
#define __vsprov_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* Forward declarations */

#ifndef __IVssSoftwareSnapshotProvider_FWD_DEFINED__
#define __IVssSoftwareSnapshotProvider_FWD_DEFINED__
typedef interface IVssSoftwareSnapshotProvider IVssSoftwareSnapshotProvider;
#ifdef __cplusplus
interface IVssSoftwareSnapshotProvider;
#endif /* __cplusplus */
#endif

#ifndef __IVssProviderCreateSnapshotSet_FWD_DEFINED__
#define __IVssProviderCreateSnapshotSet_FWD_DEFINED__
typedef interface IVssProviderCreateSnapshotSet IVssProviderCreateSnapshotSet;
#ifdef __cplusplus
interface IVssProviderCreateSnapshotSet;
#endif /* __cplusplus */
#endif

#ifndef __IVssProviderNotifications_FWD_DEFINED__
#define __IVssProviderNotifications_FWD_DEFINED__
typedef interface IVssProviderNotifications IVssProviderNotifications;
#ifdef __cplusplus
interface IVssProviderNotifications;
#endif /* __cplusplus */
#endif

#ifndef __IVssHardwareSnapshotProvider_FWD_DEFINED__
#define __IVssHardwareSnapshotProvider_FWD_DEFINED__
typedef interface IVssHardwareSnapshotProvider IVssHardwareSnapshotProvider;
#ifdef __cplusplus
interface IVssHardwareSnapshotProvider;
#endif /* __cplusplus */
#endif

#ifndef __IVssHardwareSnapshotProviderEx_FWD_DEFINED__
#define __IVssHardwareSnapshotProviderEx_FWD_DEFINED__
typedef interface IVssHardwareSnapshotProviderEx IVssHardwareSnapshotProviderEx;
#ifdef __cplusplus
interface IVssHardwareSnapshotProviderEx;
#endif /* __cplusplus */
#endif

#ifndef __IVssFileShareSnapshotProvider_FWD_DEFINED__
#define __IVssFileShareSnapshotProvider_FWD_DEFINED__
typedef interface IVssFileShareSnapshotProvider IVssFileShareSnapshotProvider;
#ifdef __cplusplus
interface IVssFileShareSnapshotProvider;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

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

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
#ifndef __IVssSnapshotProvider_FWD_DEFINED__
#define __IVssSnapshotProvider_FWD_DEFINED__
typedef interface IVssSnapshotProvider IVssSnapshotProvider;
#ifdef __cplusplus
interface IVssSnapshotProvider;
#endif /* __cplusplus */
#endif

#ifndef __IVssProviderNotifications_FWD_DEFINED__
#define __IVssProviderNotifications_FWD_DEFINED__
typedef interface IVssProviderNotifications IVssProviderNotifications;
#ifdef __cplusplus
interface IVssProviderNotifications;
#endif /* __cplusplus */
#endif

typedef VSS_PWSZ *PVSS_PWSZ;
/*****************************************************************************
 * IVssSoftwareSnapshotProvider interface
 */
#ifndef __IVssSoftwareSnapshotProvider_INTERFACE_DEFINED__
#define __IVssSoftwareSnapshotProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssSoftwareSnapshotProvider, 0x609e123e, 0x2c5a, 0x44d3, 0x8f,0x01, 0x0b,0x1d,0x9a,0x47,0xd1,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("609e123e-2c5a-44d3-8f01-0b1d9a47d1ff")
IVssSoftwareSnapshotProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetContext(
        LONG lContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSnapshotProperties(
        VSS_ID SnapshotId,
        VSS_SNAPSHOT_PROP *pProp) = 0;

    virtual HRESULT STDMETHODCALLTYPE Query(
        VSS_ID QueriedObjectId,
        VSS_OBJECT_TYPE eQueriedObjectType,
        VSS_OBJECT_TYPE eReturnedObjectsType,
        IVssEnumObject **ppEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteSnapshots(
        VSS_ID SourceObjectId,
        VSS_OBJECT_TYPE eSourceObjectType,
        WINBOOL bForceDelete,
        LONG *plDeletedSnapshots,
        VSS_ID *pNondeletedSnapshotID) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeginPrepareSnapshot(
        VSS_ID SnapshotSetId,
        VSS_ID SnapshotId,
        VSS_PWSZ pwszVolumeName,
        LONG lNewContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsVolumeSupported(
        VSS_PWSZ pwszVolumeName,
        WINBOOL *pbSupportedByThisProvider) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsVolumeSnapshotted(
        VSS_PWSZ pwszVolumeName,
        WINBOOL *pbSnapshotsPresent,
        LONG *plSnapshotCompatibility) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSnapshotProperty(
        VSS_ID SnapshotId,
        VSS_SNAPSHOT_PROPERTY_ID eSnapshotPropertyId,
        VARIANT vProperty) = 0;

    virtual HRESULT STDMETHODCALLTYPE RevertToSnapshot(
        VSS_ID SnapshotId) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryRevertStatus(
        VSS_PWSZ pwszVolume,
        IVssAsync **ppAsync) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssSoftwareSnapshotProvider, 0x609e123e, 0x2c5a, 0x44d3, 0x8f,0x01, 0x0b,0x1d,0x9a,0x47,0xd1,0xff)
#endif
#else
typedef struct IVssSoftwareSnapshotProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVssSoftwareSnapshotProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *SetContext)(
        IVssSoftwareSnapshotProvider *This,
        LONG lContext);

    HRESULT (STDMETHODCALLTYPE *GetSnapshotProperties)(
        IVssSoftwareSnapshotProvider *This,
        VSS_ID SnapshotId,
        VSS_SNAPSHOT_PROP *pProp);

    HRESULT (STDMETHODCALLTYPE *Query)(
        IVssSoftwareSnapshotProvider *This,
        VSS_ID QueriedObjectId,
        VSS_OBJECT_TYPE eQueriedObjectType,
        VSS_OBJECT_TYPE eReturnedObjectsType,
        IVssEnumObject **ppEnum);

    HRESULT (STDMETHODCALLTYPE *DeleteSnapshots)(
        IVssSoftwareSnapshotProvider *This,
        VSS_ID SourceObjectId,
        VSS_OBJECT_TYPE eSourceObjectType,
        WINBOOL bForceDelete,
        LONG *plDeletedSnapshots,
        VSS_ID *pNondeletedSnapshotID);

    HRESULT (STDMETHODCALLTYPE *BeginPrepareSnapshot)(
        IVssSoftwareSnapshotProvider *This,
        VSS_ID SnapshotSetId,
        VSS_ID SnapshotId,
        VSS_PWSZ pwszVolumeName,
        LONG lNewContext);

    HRESULT (STDMETHODCALLTYPE *IsVolumeSupported)(
        IVssSoftwareSnapshotProvider *This,
        VSS_PWSZ pwszVolumeName,
        WINBOOL *pbSupportedByThisProvider);

    HRESULT (STDMETHODCALLTYPE *IsVolumeSnapshotted)(
        IVssSoftwareSnapshotProvider *This,
        VSS_PWSZ pwszVolumeName,
        WINBOOL *pbSnapshotsPresent,
        LONG *plSnapshotCompatibility);

    HRESULT (STDMETHODCALLTYPE *SetSnapshotProperty)(
        IVssSoftwareSnapshotProvider *This,
        VSS_ID SnapshotId,
        VSS_SNAPSHOT_PROPERTY_ID eSnapshotPropertyId,
        VARIANT vProperty);

    HRESULT (STDMETHODCALLTYPE *RevertToSnapshot)(
        IVssSoftwareSnapshotProvider *This,
        VSS_ID SnapshotId);

    HRESULT (STDMETHODCALLTYPE *QueryRevertStatus)(
        IVssSoftwareSnapshotProvider *This,
        VSS_PWSZ pwszVolume,
        IVssAsync **ppAsync);

    END_INTERFACE
} IVssSoftwareSnapshotProviderVtbl;

interface IVssSoftwareSnapshotProvider {
    CONST_VTBL IVssSoftwareSnapshotProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssSoftwareSnapshotProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssSoftwareSnapshotProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssSoftwareSnapshotProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IVssSoftwareSnapshotProvider methods ***/
#define IVssSoftwareSnapshotProvider_SetContext(This,lContext) (This)->lpVtbl->SetContext(This,lContext)
#define IVssSoftwareSnapshotProvider_GetSnapshotProperties(This,SnapshotId,pProp) (This)->lpVtbl->GetSnapshotProperties(This,SnapshotId,pProp)
#define IVssSoftwareSnapshotProvider_Query(This,QueriedObjectId,eQueriedObjectType,eReturnedObjectsType,ppEnum) (This)->lpVtbl->Query(This,QueriedObjectId,eQueriedObjectType,eReturnedObjectsType,ppEnum)
#define IVssSoftwareSnapshotProvider_DeleteSnapshots(This,SourceObjectId,eSourceObjectType,bForceDelete,plDeletedSnapshots,pNondeletedSnapshotID) (This)->lpVtbl->DeleteSnapshots(This,SourceObjectId,eSourceObjectType,bForceDelete,plDeletedSnapshots,pNondeletedSnapshotID)
#define IVssSoftwareSnapshotProvider_BeginPrepareSnapshot(This,SnapshotSetId,SnapshotId,pwszVolumeName,lNewContext) (This)->lpVtbl->BeginPrepareSnapshot(This,SnapshotSetId,SnapshotId,pwszVolumeName,lNewContext)
#define IVssSoftwareSnapshotProvider_IsVolumeSupported(This,pwszVolumeName,pbSupportedByThisProvider) (This)->lpVtbl->IsVolumeSupported(This,pwszVolumeName,pbSupportedByThisProvider)
#define IVssSoftwareSnapshotProvider_IsVolumeSnapshotted(This,pwszVolumeName,pbSnapshotsPresent,plSnapshotCompatibility) (This)->lpVtbl->IsVolumeSnapshotted(This,pwszVolumeName,pbSnapshotsPresent,plSnapshotCompatibility)
#define IVssSoftwareSnapshotProvider_SetSnapshotProperty(This,SnapshotId,eSnapshotPropertyId,vProperty) (This)->lpVtbl->SetSnapshotProperty(This,SnapshotId,eSnapshotPropertyId,vProperty)
#define IVssSoftwareSnapshotProvider_RevertToSnapshot(This,SnapshotId) (This)->lpVtbl->RevertToSnapshot(This,SnapshotId)
#define IVssSoftwareSnapshotProvider_QueryRevertStatus(This,pwszVolume,ppAsync) (This)->lpVtbl->QueryRevertStatus(This,pwszVolume,ppAsync)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVssSoftwareSnapshotProvider_QueryInterface(IVssSoftwareSnapshotProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVssSoftwareSnapshotProvider_AddRef(IVssSoftwareSnapshotProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVssSoftwareSnapshotProvider_Release(IVssSoftwareSnapshotProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssSoftwareSnapshotProvider methods ***/
static __WIDL_INLINE HRESULT IVssSoftwareSnapshotProvider_SetContext(IVssSoftwareSnapshotProvider* This,LONG lContext) {
    return This->lpVtbl->SetContext(This,lContext);
}
static __WIDL_INLINE HRESULT IVssSoftwareSnapshotProvider_GetSnapshotProperties(IVssSoftwareSnapshotProvider* This,VSS_ID SnapshotId,VSS_SNAPSHOT_PROP *pProp) {
    return This->lpVtbl->GetSnapshotProperties(This,SnapshotId,pProp);
}
static __WIDL_INLINE HRESULT IVssSoftwareSnapshotProvider_Query(IVssSoftwareSnapshotProvider* This,VSS_ID QueriedObjectId,VSS_OBJECT_TYPE eQueriedObjectType,VSS_OBJECT_TYPE eReturnedObjectsType,IVssEnumObject **ppEnum) {
    return This->lpVtbl->Query(This,QueriedObjectId,eQueriedObjectType,eReturnedObjectsType,ppEnum);
}
static __WIDL_INLINE HRESULT IVssSoftwareSnapshotProvider_DeleteSnapshots(IVssSoftwareSnapshotProvider* This,VSS_ID SourceObjectId,VSS_OBJECT_TYPE eSourceObjectType,WINBOOL bForceDelete,LONG *plDeletedSnapshots,VSS_ID *pNondeletedSnapshotID) {
    return This->lpVtbl->DeleteSnapshots(This,SourceObjectId,eSourceObjectType,bForceDelete,plDeletedSnapshots,pNondeletedSnapshotID);
}
static __WIDL_INLINE HRESULT IVssSoftwareSnapshotProvider_BeginPrepareSnapshot(IVssSoftwareSnapshotProvider* This,VSS_ID SnapshotSetId,VSS_ID SnapshotId,VSS_PWSZ pwszVolumeName,LONG lNewContext) {
    return This->lpVtbl->BeginPrepareSnapshot(This,SnapshotSetId,SnapshotId,pwszVolumeName,lNewContext);
}
static __WIDL_INLINE HRESULT IVssSoftwareSnapshotProvider_IsVolumeSupported(IVssSoftwareSnapshotProvider* This,VSS_PWSZ pwszVolumeName,WINBOOL *pbSupportedByThisProvider) {
    return This->lpVtbl->IsVolumeSupported(This,pwszVolumeName,pbSupportedByThisProvider);
}
static __WIDL_INLINE HRESULT IVssSoftwareSnapshotProvider_IsVolumeSnapshotted(IVssSoftwareSnapshotProvider* This,VSS_PWSZ pwszVolumeName,WINBOOL *pbSnapshotsPresent,LONG *plSnapshotCompatibility) {
    return This->lpVtbl->IsVolumeSnapshotted(This,pwszVolumeName,pbSnapshotsPresent,plSnapshotCompatibility);
}
static __WIDL_INLINE HRESULT IVssSoftwareSnapshotProvider_SetSnapshotProperty(IVssSoftwareSnapshotProvider* This,VSS_ID SnapshotId,VSS_SNAPSHOT_PROPERTY_ID eSnapshotPropertyId,VARIANT vProperty) {
    return This->lpVtbl->SetSnapshotProperty(This,SnapshotId,eSnapshotPropertyId,vProperty);
}
static __WIDL_INLINE HRESULT IVssSoftwareSnapshotProvider_RevertToSnapshot(IVssSoftwareSnapshotProvider* This,VSS_ID SnapshotId) {
    return This->lpVtbl->RevertToSnapshot(This,SnapshotId);
}
static __WIDL_INLINE HRESULT IVssSoftwareSnapshotProvider_QueryRevertStatus(IVssSoftwareSnapshotProvider* This,VSS_PWSZ pwszVolume,IVssAsync **ppAsync) {
    return This->lpVtbl->QueryRevertStatus(This,pwszVolume,ppAsync);
}
#endif
#endif

#endif


#endif  /* __IVssSoftwareSnapshotProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssProviderCreateSnapshotSet interface
 */
#ifndef __IVssProviderCreateSnapshotSet_INTERFACE_DEFINED__
#define __IVssProviderCreateSnapshotSet_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssProviderCreateSnapshotSet, 0x5f894e5b, 0x1e39, 0x4778, 0x8e,0x23, 0x9a,0xba,0xd9,0xf0,0xe0,0x8c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5f894e5b-1e39-4778-8e23-9abad9f0e08c")
IVssProviderCreateSnapshotSet : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE EndPrepareSnapshots(
        VSS_ID SnapshotSetId) = 0;

    virtual HRESULT STDMETHODCALLTYPE PreCommitSnapshots(
        VSS_ID SnapshotSetId) = 0;

    virtual HRESULT STDMETHODCALLTYPE CommitSnapshots(
        VSS_ID SnapshotSetId) = 0;

    virtual HRESULT STDMETHODCALLTYPE PostCommitSnapshots(
        VSS_ID SnapshotSetId,
        LONG lSnapshotsCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE PreFinalCommitSnapshots(
        VSS_ID SnapshotSetId) = 0;

    virtual HRESULT STDMETHODCALLTYPE PostFinalCommitSnapshots(
        VSS_ID SnapshotSetId) = 0;

    virtual HRESULT STDMETHODCALLTYPE AbortSnapshots(
        VSS_ID SnapshotSetId) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssProviderCreateSnapshotSet, 0x5f894e5b, 0x1e39, 0x4778, 0x8e,0x23, 0x9a,0xba,0xd9,0xf0,0xe0,0x8c)
#endif
#else
typedef struct IVssProviderCreateSnapshotSetVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVssProviderCreateSnapshotSet methods ***/
    HRESULT (STDMETHODCALLTYPE *EndPrepareSnapshots)(
        IVssProviderCreateSnapshotSet *This,
        VSS_ID SnapshotSetId);

    HRESULT (STDMETHODCALLTYPE *PreCommitSnapshots)(
        IVssProviderCreateSnapshotSet *This,
        VSS_ID SnapshotSetId);

    HRESULT (STDMETHODCALLTYPE *CommitSnapshots)(
        IVssProviderCreateSnapshotSet *This,
        VSS_ID SnapshotSetId);

    HRESULT (STDMETHODCALLTYPE *PostCommitSnapshots)(
        IVssProviderCreateSnapshotSet *This,
        VSS_ID SnapshotSetId,
        LONG lSnapshotsCount);

    HRESULT (STDMETHODCALLTYPE *PreFinalCommitSnapshots)(
        IVssProviderCreateSnapshotSet *This,
        VSS_ID SnapshotSetId);

    HRESULT (STDMETHODCALLTYPE *PostFinalCommitSnapshots)(
        IVssProviderCreateSnapshotSet *This,
        VSS_ID SnapshotSetId);

    HRESULT (STDMETHODCALLTYPE *AbortSnapshots)(
        IVssProviderCreateSnapshotSet *This,
        VSS_ID SnapshotSetId);

    END_INTERFACE
} IVssProviderCreateSnapshotSetVtbl;

interface IVssProviderCreateSnapshotSet {
    CONST_VTBL IVssProviderCreateSnapshotSetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssProviderCreateSnapshotSet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssProviderCreateSnapshotSet_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssProviderCreateSnapshotSet_Release(This) (This)->lpVtbl->Release(This)
/*** IVssProviderCreateSnapshotSet methods ***/
#define IVssProviderCreateSnapshotSet_EndPrepareSnapshots(This,SnapshotSetId) (This)->lpVtbl->EndPrepareSnapshots(This,SnapshotSetId)
#define IVssProviderCreateSnapshotSet_PreCommitSnapshots(This,SnapshotSetId) (This)->lpVtbl->PreCommitSnapshots(This,SnapshotSetId)
#define IVssProviderCreateSnapshotSet_CommitSnapshots(This,SnapshotSetId) (This)->lpVtbl->CommitSnapshots(This,SnapshotSetId)
#define IVssProviderCreateSnapshotSet_PostCommitSnapshots(This,SnapshotSetId,lSnapshotsCount) (This)->lpVtbl->PostCommitSnapshots(This,SnapshotSetId,lSnapshotsCount)
#define IVssProviderCreateSnapshotSet_PreFinalCommitSnapshots(This,SnapshotSetId) (This)->lpVtbl->PreFinalCommitSnapshots(This,SnapshotSetId)
#define IVssProviderCreateSnapshotSet_PostFinalCommitSnapshots(This,SnapshotSetId) (This)->lpVtbl->PostFinalCommitSnapshots(This,SnapshotSetId)
#define IVssProviderCreateSnapshotSet_AbortSnapshots(This,SnapshotSetId) (This)->lpVtbl->AbortSnapshots(This,SnapshotSetId)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVssProviderCreateSnapshotSet_QueryInterface(IVssProviderCreateSnapshotSet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVssProviderCreateSnapshotSet_AddRef(IVssProviderCreateSnapshotSet* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVssProviderCreateSnapshotSet_Release(IVssProviderCreateSnapshotSet* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssProviderCreateSnapshotSet methods ***/
static __WIDL_INLINE HRESULT IVssProviderCreateSnapshotSet_EndPrepareSnapshots(IVssProviderCreateSnapshotSet* This,VSS_ID SnapshotSetId) {
    return This->lpVtbl->EndPrepareSnapshots(This,SnapshotSetId);
}
static __WIDL_INLINE HRESULT IVssProviderCreateSnapshotSet_PreCommitSnapshots(IVssProviderCreateSnapshotSet* This,VSS_ID SnapshotSetId) {
    return This->lpVtbl->PreCommitSnapshots(This,SnapshotSetId);
}
static __WIDL_INLINE HRESULT IVssProviderCreateSnapshotSet_CommitSnapshots(IVssProviderCreateSnapshotSet* This,VSS_ID SnapshotSetId) {
    return This->lpVtbl->CommitSnapshots(This,SnapshotSetId);
}
static __WIDL_INLINE HRESULT IVssProviderCreateSnapshotSet_PostCommitSnapshots(IVssProviderCreateSnapshotSet* This,VSS_ID SnapshotSetId,LONG lSnapshotsCount) {
    return This->lpVtbl->PostCommitSnapshots(This,SnapshotSetId,lSnapshotsCount);
}
static __WIDL_INLINE HRESULT IVssProviderCreateSnapshotSet_PreFinalCommitSnapshots(IVssProviderCreateSnapshotSet* This,VSS_ID SnapshotSetId) {
    return This->lpVtbl->PreFinalCommitSnapshots(This,SnapshotSetId);
}
static __WIDL_INLINE HRESULT IVssProviderCreateSnapshotSet_PostFinalCommitSnapshots(IVssProviderCreateSnapshotSet* This,VSS_ID SnapshotSetId) {
    return This->lpVtbl->PostFinalCommitSnapshots(This,SnapshotSetId);
}
static __WIDL_INLINE HRESULT IVssProviderCreateSnapshotSet_AbortSnapshots(IVssProviderCreateSnapshotSet* This,VSS_ID SnapshotSetId) {
    return This->lpVtbl->AbortSnapshots(This,SnapshotSetId);
}
#endif
#endif

#endif


#endif  /* __IVssProviderCreateSnapshotSet_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssProviderNotifications interface
 */
#ifndef __IVssProviderNotifications_INTERFACE_DEFINED__
#define __IVssProviderNotifications_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssProviderNotifications, 0xe561901f, 0x03a5, 0x4afe, 0x86,0xd0, 0x72,0xba,0xee,0xce,0x70,0x04);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e561901f-03a5-4afe-86d0-72baeece7004")
IVssProviderNotifications : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnLoad(
        IUnknown *pCallback) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnUnload(
        WINBOOL bForceUnload) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssProviderNotifications, 0xe561901f, 0x03a5, 0x4afe, 0x86,0xd0, 0x72,0xba,0xee,0xce,0x70,0x04)
#endif
#else
typedef struct IVssProviderNotificationsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVssProviderNotifications methods ***/
    HRESULT (STDMETHODCALLTYPE *OnLoad)(
        IVssProviderNotifications *This,
        IUnknown *pCallback);

    HRESULT (STDMETHODCALLTYPE *OnUnload)(
        IVssProviderNotifications *This,
        WINBOOL bForceUnload);

    END_INTERFACE
} IVssProviderNotificationsVtbl;

interface IVssProviderNotifications {
    CONST_VTBL IVssProviderNotificationsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssProviderNotifications_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssProviderNotifications_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssProviderNotifications_Release(This) (This)->lpVtbl->Release(This)
/*** IVssProviderNotifications methods ***/
#define IVssProviderNotifications_OnLoad(This,pCallback) (This)->lpVtbl->OnLoad(This,pCallback)
#define IVssProviderNotifications_OnUnload(This,bForceUnload) (This)->lpVtbl->OnUnload(This,bForceUnload)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVssProviderNotifications_QueryInterface(IVssProviderNotifications* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVssProviderNotifications_AddRef(IVssProviderNotifications* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVssProviderNotifications_Release(IVssProviderNotifications* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssProviderNotifications methods ***/
static __WIDL_INLINE HRESULT IVssProviderNotifications_OnLoad(IVssProviderNotifications* This,IUnknown *pCallback) {
    return This->lpVtbl->OnLoad(This,pCallback);
}
static __WIDL_INLINE HRESULT IVssProviderNotifications_OnUnload(IVssProviderNotifications* This,WINBOOL bForceUnload) {
    return This->lpVtbl->OnUnload(This,bForceUnload);
}
#endif
#endif

#endif


#endif  /* __IVssProviderNotifications_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssHardwareSnapshotProvider interface
 */
#ifndef __IVssHardwareSnapshotProvider_INTERFACE_DEFINED__
#define __IVssHardwareSnapshotProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssHardwareSnapshotProvider, 0x9593a157, 0x44e9, 0x4344, 0xbb,0xeb, 0x44,0xfb,0xf9,0xb0,0x6b,0x10);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9593a157-44e9-4344-bbeb-44fbf9b06b10")
IVssHardwareSnapshotProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AreLunsSupported(
        LONG lLunCount,
        LONG lContext,
        VSS_PWSZ *rgwszDevices,
        VDS_LUN_INFORMATION *pLunInformation,
        WINBOOL *pbIsSupported) = 0;

    virtual HRESULT STDMETHODCALLTYPE FillInLunInfo(
        VSS_PWSZ wszDeviceName,
        VDS_LUN_INFORMATION *pLunInfo,
        WINBOOL *pbIsSupported) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeginPrepareSnapshot(
        VSS_ID SnapshotSetId,
        VSS_ID SnapshotId,
        LONG lContext,
        LONG lLunCount,
        VSS_PWSZ *rgDeviceNames,
        VDS_LUN_INFORMATION *rgLunInformation) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTargetLuns(
        LONG lLunCount,
        VSS_PWSZ *rgDeviceNames,
        VDS_LUN_INFORMATION *rgSourceLuns,
        VDS_LUN_INFORMATION *rgDestinationLuns) = 0;

    virtual HRESULT STDMETHODCALLTYPE LocateLuns(
        LONG lLunCount,
        VDS_LUN_INFORMATION *rgSourceLuns) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnLunEmpty(
        VSS_PWSZ wszDeviceName,
        VDS_LUN_INFORMATION *pInformation) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssHardwareSnapshotProvider, 0x9593a157, 0x44e9, 0x4344, 0xbb,0xeb, 0x44,0xfb,0xf9,0xb0,0x6b,0x10)
#endif
#else
typedef struct IVssHardwareSnapshotProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVssHardwareSnapshotProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *AreLunsSupported)(
        IVssHardwareSnapshotProvider *This,
        LONG lLunCount,
        LONG lContext,
        VSS_PWSZ *rgwszDevices,
        VDS_LUN_INFORMATION *pLunInformation,
        WINBOOL *pbIsSupported);

    HRESULT (STDMETHODCALLTYPE *FillInLunInfo)(
        IVssHardwareSnapshotProvider *This,
        VSS_PWSZ wszDeviceName,
        VDS_LUN_INFORMATION *pLunInfo,
        WINBOOL *pbIsSupported);

    HRESULT (STDMETHODCALLTYPE *BeginPrepareSnapshot)(
        IVssHardwareSnapshotProvider *This,
        VSS_ID SnapshotSetId,
        VSS_ID SnapshotId,
        LONG lContext,
        LONG lLunCount,
        VSS_PWSZ *rgDeviceNames,
        VDS_LUN_INFORMATION *rgLunInformation);

    HRESULT (STDMETHODCALLTYPE *GetTargetLuns)(
        IVssHardwareSnapshotProvider *This,
        LONG lLunCount,
        VSS_PWSZ *rgDeviceNames,
        VDS_LUN_INFORMATION *rgSourceLuns,
        VDS_LUN_INFORMATION *rgDestinationLuns);

    HRESULT (STDMETHODCALLTYPE *LocateLuns)(
        IVssHardwareSnapshotProvider *This,
        LONG lLunCount,
        VDS_LUN_INFORMATION *rgSourceLuns);

    HRESULT (STDMETHODCALLTYPE *OnLunEmpty)(
        IVssHardwareSnapshotProvider *This,
        VSS_PWSZ wszDeviceName,
        VDS_LUN_INFORMATION *pInformation);

    END_INTERFACE
} IVssHardwareSnapshotProviderVtbl;

interface IVssHardwareSnapshotProvider {
    CONST_VTBL IVssHardwareSnapshotProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssHardwareSnapshotProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssHardwareSnapshotProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssHardwareSnapshotProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IVssHardwareSnapshotProvider methods ***/
#define IVssHardwareSnapshotProvider_AreLunsSupported(This,lLunCount,lContext,rgwszDevices,pLunInformation,pbIsSupported) (This)->lpVtbl->AreLunsSupported(This,lLunCount,lContext,rgwszDevices,pLunInformation,pbIsSupported)
#define IVssHardwareSnapshotProvider_FillInLunInfo(This,wszDeviceName,pLunInfo,pbIsSupported) (This)->lpVtbl->FillInLunInfo(This,wszDeviceName,pLunInfo,pbIsSupported)
#define IVssHardwareSnapshotProvider_BeginPrepareSnapshot(This,SnapshotSetId,SnapshotId,lContext,lLunCount,rgDeviceNames,rgLunInformation) (This)->lpVtbl->BeginPrepareSnapshot(This,SnapshotSetId,SnapshotId,lContext,lLunCount,rgDeviceNames,rgLunInformation)
#define IVssHardwareSnapshotProvider_GetTargetLuns(This,lLunCount,rgDeviceNames,rgSourceLuns,rgDestinationLuns) (This)->lpVtbl->GetTargetLuns(This,lLunCount,rgDeviceNames,rgSourceLuns,rgDestinationLuns)
#define IVssHardwareSnapshotProvider_LocateLuns(This,lLunCount,rgSourceLuns) (This)->lpVtbl->LocateLuns(This,lLunCount,rgSourceLuns)
#define IVssHardwareSnapshotProvider_OnLunEmpty(This,wszDeviceName,pInformation) (This)->lpVtbl->OnLunEmpty(This,wszDeviceName,pInformation)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVssHardwareSnapshotProvider_QueryInterface(IVssHardwareSnapshotProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVssHardwareSnapshotProvider_AddRef(IVssHardwareSnapshotProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVssHardwareSnapshotProvider_Release(IVssHardwareSnapshotProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssHardwareSnapshotProvider methods ***/
static __WIDL_INLINE HRESULT IVssHardwareSnapshotProvider_AreLunsSupported(IVssHardwareSnapshotProvider* This,LONG lLunCount,LONG lContext,VSS_PWSZ *rgwszDevices,VDS_LUN_INFORMATION *pLunInformation,WINBOOL *pbIsSupported) {
    return This->lpVtbl->AreLunsSupported(This,lLunCount,lContext,rgwszDevices,pLunInformation,pbIsSupported);
}
static __WIDL_INLINE HRESULT IVssHardwareSnapshotProvider_FillInLunInfo(IVssHardwareSnapshotProvider* This,VSS_PWSZ wszDeviceName,VDS_LUN_INFORMATION *pLunInfo,WINBOOL *pbIsSupported) {
    return This->lpVtbl->FillInLunInfo(This,wszDeviceName,pLunInfo,pbIsSupported);
}
static __WIDL_INLINE HRESULT IVssHardwareSnapshotProvider_BeginPrepareSnapshot(IVssHardwareSnapshotProvider* This,VSS_ID SnapshotSetId,VSS_ID SnapshotId,LONG lContext,LONG lLunCount,VSS_PWSZ *rgDeviceNames,VDS_LUN_INFORMATION *rgLunInformation) {
    return This->lpVtbl->BeginPrepareSnapshot(This,SnapshotSetId,SnapshotId,lContext,lLunCount,rgDeviceNames,rgLunInformation);
}
static __WIDL_INLINE HRESULT IVssHardwareSnapshotProvider_GetTargetLuns(IVssHardwareSnapshotProvider* This,LONG lLunCount,VSS_PWSZ *rgDeviceNames,VDS_LUN_INFORMATION *rgSourceLuns,VDS_LUN_INFORMATION *rgDestinationLuns) {
    return This->lpVtbl->GetTargetLuns(This,lLunCount,rgDeviceNames,rgSourceLuns,rgDestinationLuns);
}
static __WIDL_INLINE HRESULT IVssHardwareSnapshotProvider_LocateLuns(IVssHardwareSnapshotProvider* This,LONG lLunCount,VDS_LUN_INFORMATION *rgSourceLuns) {
    return This->lpVtbl->LocateLuns(This,lLunCount,rgSourceLuns);
}
static __WIDL_INLINE HRESULT IVssHardwareSnapshotProvider_OnLunEmpty(IVssHardwareSnapshotProvider* This,VSS_PWSZ wszDeviceName,VDS_LUN_INFORMATION *pInformation) {
    return This->lpVtbl->OnLunEmpty(This,wszDeviceName,pInformation);
}
#endif
#endif

#endif


#endif  /* __IVssHardwareSnapshotProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssHardwareSnapshotProviderEx interface
 */
#ifndef __IVssHardwareSnapshotProviderEx_INTERFACE_DEFINED__
#define __IVssHardwareSnapshotProviderEx_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssHardwareSnapshotProviderEx, 0x7f5ba925, 0xcdb1, 0x4d11, 0xa7,0x1f, 0x33,0x9e,0xb7,0xe7,0x09,0xfd);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7f5ba925-cdb1-4d11-a71f-339eb7e709fd")
IVssHardwareSnapshotProviderEx : public IVssHardwareSnapshotProvider
{
    virtual HRESULT STDMETHODCALLTYPE GetProviderCapabilities(
        ULONGLONG *pllOriginalCapabilityMask) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnLunStateChange(
        VDS_LUN_INFORMATION *pSnapshotLuns,
        VDS_LUN_INFORMATION *pOriginalLuns,
        DWORD dwCount,
        DWORD dwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE ResyncLuns(
        VDS_LUN_INFORMATION *pSourceLuns,
        VDS_LUN_INFORMATION *pTargetLuns,
        DWORD dwCount,
        IVssAsync **ppAsync) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnReuseLuns(
        VDS_LUN_INFORMATION *pSnapshotLuns,
        VDS_LUN_INFORMATION *pOriginalLuns,
        DWORD dwCount) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssHardwareSnapshotProviderEx, 0x7f5ba925, 0xcdb1, 0x4d11, 0xa7,0x1f, 0x33,0x9e,0xb7,0xe7,0x09,0xfd)
#endif
#else
typedef struct IVssHardwareSnapshotProviderExVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVssHardwareSnapshotProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *AreLunsSupported)(
        IVssHardwareSnapshotProviderEx *This,
        LONG lLunCount,
        LONG lContext,
        VSS_PWSZ *rgwszDevices,
        VDS_LUN_INFORMATION *pLunInformation,
        WINBOOL *pbIsSupported);

    HRESULT (STDMETHODCALLTYPE *FillInLunInfo)(
        IVssHardwareSnapshotProviderEx *This,
        VSS_PWSZ wszDeviceName,
        VDS_LUN_INFORMATION *pLunInfo,
        WINBOOL *pbIsSupported);

    HRESULT (STDMETHODCALLTYPE *BeginPrepareSnapshot)(
        IVssHardwareSnapshotProviderEx *This,
        VSS_ID SnapshotSetId,
        VSS_ID SnapshotId,
        LONG lContext,
        LONG lLunCount,
        VSS_PWSZ *rgDeviceNames,
        VDS_LUN_INFORMATION *rgLunInformation);

    HRESULT (STDMETHODCALLTYPE *GetTargetLuns)(
        IVssHardwareSnapshotProviderEx *This,
        LONG lLunCount,
        VSS_PWSZ *rgDeviceNames,
        VDS_LUN_INFORMATION *rgSourceLuns,
        VDS_LUN_INFORMATION *rgDestinationLuns);

    HRESULT (STDMETHODCALLTYPE *LocateLuns)(
        IVssHardwareSnapshotProviderEx *This,
        LONG lLunCount,
        VDS_LUN_INFORMATION *rgSourceLuns);

    HRESULT (STDMETHODCALLTYPE *OnLunEmpty)(
        IVssHardwareSnapshotProviderEx *This,
        VSS_PWSZ wszDeviceName,
        VDS_LUN_INFORMATION *pInformation);

    /*** IVssHardwareSnapshotProviderEx methods ***/
    HRESULT (STDMETHODCALLTYPE *GetProviderCapabilities)(
        IVssHardwareSnapshotProviderEx *This,
        ULONGLONG *pllOriginalCapabilityMask);

    HRESULT (STDMETHODCALLTYPE *OnLunStateChange)(
        IVssHardwareSnapshotProviderEx *This,
        VDS_LUN_INFORMATION *pSnapshotLuns,
        VDS_LUN_INFORMATION *pOriginalLuns,
        DWORD dwCount,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *ResyncLuns)(
        IVssHardwareSnapshotProviderEx *This,
        VDS_LUN_INFORMATION *pSourceLuns,
        VDS_LUN_INFORMATION *pTargetLuns,
        DWORD dwCount,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *OnReuseLuns)(
        IVssHardwareSnapshotProviderEx *This,
        VDS_LUN_INFORMATION *pSnapshotLuns,
        VDS_LUN_INFORMATION *pOriginalLuns,
        DWORD dwCount);

    END_INTERFACE
} IVssHardwareSnapshotProviderExVtbl;

interface IVssHardwareSnapshotProviderEx {
    CONST_VTBL IVssHardwareSnapshotProviderExVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssHardwareSnapshotProviderEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssHardwareSnapshotProviderEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssHardwareSnapshotProviderEx_Release(This) (This)->lpVtbl->Release(This)
/*** IVssHardwareSnapshotProvider methods ***/
#define IVssHardwareSnapshotProviderEx_AreLunsSupported(This,lLunCount,lContext,rgwszDevices,pLunInformation,pbIsSupported) (This)->lpVtbl->AreLunsSupported(This,lLunCount,lContext,rgwszDevices,pLunInformation,pbIsSupported)
#define IVssHardwareSnapshotProviderEx_FillInLunInfo(This,wszDeviceName,pLunInfo,pbIsSupported) (This)->lpVtbl->FillInLunInfo(This,wszDeviceName,pLunInfo,pbIsSupported)
#define IVssHardwareSnapshotProviderEx_BeginPrepareSnapshot(This,SnapshotSetId,SnapshotId,lContext,lLunCount,rgDeviceNames,rgLunInformation) (This)->lpVtbl->BeginPrepareSnapshot(This,SnapshotSetId,SnapshotId,lContext,lLunCount,rgDeviceNames,rgLunInformation)
#define IVssHardwareSnapshotProviderEx_GetTargetLuns(This,lLunCount,rgDeviceNames,rgSourceLuns,rgDestinationLuns) (This)->lpVtbl->GetTargetLuns(This,lLunCount,rgDeviceNames,rgSourceLuns,rgDestinationLuns)
#define IVssHardwareSnapshotProviderEx_LocateLuns(This,lLunCount,rgSourceLuns) (This)->lpVtbl->LocateLuns(This,lLunCount,rgSourceLuns)
#define IVssHardwareSnapshotProviderEx_OnLunEmpty(This,wszDeviceName,pInformation) (This)->lpVtbl->OnLunEmpty(This,wszDeviceName,pInformation)
/*** IVssHardwareSnapshotProviderEx methods ***/
#define IVssHardwareSnapshotProviderEx_GetProviderCapabilities(This,pllOriginalCapabilityMask) (This)->lpVtbl->GetProviderCapabilities(This,pllOriginalCapabilityMask)
#define IVssHardwareSnapshotProviderEx_OnLunStateChange(This,pSnapshotLuns,pOriginalLuns,dwCount,dwFlags) (This)->lpVtbl->OnLunStateChange(This,pSnapshotLuns,pOriginalLuns,dwCount,dwFlags)
#define IVssHardwareSnapshotProviderEx_ResyncLuns(This,pSourceLuns,pTargetLuns,dwCount,ppAsync) (This)->lpVtbl->ResyncLuns(This,pSourceLuns,pTargetLuns,dwCount,ppAsync)
#define IVssHardwareSnapshotProviderEx_OnReuseLuns(This,pSnapshotLuns,pOriginalLuns,dwCount) (This)->lpVtbl->OnReuseLuns(This,pSnapshotLuns,pOriginalLuns,dwCount)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVssHardwareSnapshotProviderEx_QueryInterface(IVssHardwareSnapshotProviderEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVssHardwareSnapshotProviderEx_AddRef(IVssHardwareSnapshotProviderEx* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVssHardwareSnapshotProviderEx_Release(IVssHardwareSnapshotProviderEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssHardwareSnapshotProvider methods ***/
static __WIDL_INLINE HRESULT IVssHardwareSnapshotProviderEx_AreLunsSupported(IVssHardwareSnapshotProviderEx* This,LONG lLunCount,LONG lContext,VSS_PWSZ *rgwszDevices,VDS_LUN_INFORMATION *pLunInformation,WINBOOL *pbIsSupported) {
    return This->lpVtbl->AreLunsSupported(This,lLunCount,lContext,rgwszDevices,pLunInformation,pbIsSupported);
}
static __WIDL_INLINE HRESULT IVssHardwareSnapshotProviderEx_FillInLunInfo(IVssHardwareSnapshotProviderEx* This,VSS_PWSZ wszDeviceName,VDS_LUN_INFORMATION *pLunInfo,WINBOOL *pbIsSupported) {
    return This->lpVtbl->FillInLunInfo(This,wszDeviceName,pLunInfo,pbIsSupported);
}
static __WIDL_INLINE HRESULT IVssHardwareSnapshotProviderEx_BeginPrepareSnapshot(IVssHardwareSnapshotProviderEx* This,VSS_ID SnapshotSetId,VSS_ID SnapshotId,LONG lContext,LONG lLunCount,VSS_PWSZ *rgDeviceNames,VDS_LUN_INFORMATION *rgLunInformation) {
    return This->lpVtbl->BeginPrepareSnapshot(This,SnapshotSetId,SnapshotId,lContext,lLunCount,rgDeviceNames,rgLunInformation);
}
static __WIDL_INLINE HRESULT IVssHardwareSnapshotProviderEx_GetTargetLuns(IVssHardwareSnapshotProviderEx* This,LONG lLunCount,VSS_PWSZ *rgDeviceNames,VDS_LUN_INFORMATION *rgSourceLuns,VDS_LUN_INFORMATION *rgDestinationLuns) {
    return This->lpVtbl->GetTargetLuns(This,lLunCount,rgDeviceNames,rgSourceLuns,rgDestinationLuns);
}
static __WIDL_INLINE HRESULT IVssHardwareSnapshotProviderEx_LocateLuns(IVssHardwareSnapshotProviderEx* This,LONG lLunCount,VDS_LUN_INFORMATION *rgSourceLuns) {
    return This->lpVtbl->LocateLuns(This,lLunCount,rgSourceLuns);
}
static __WIDL_INLINE HRESULT IVssHardwareSnapshotProviderEx_OnLunEmpty(IVssHardwareSnapshotProviderEx* This,VSS_PWSZ wszDeviceName,VDS_LUN_INFORMATION *pInformation) {
    return This->lpVtbl->OnLunEmpty(This,wszDeviceName,pInformation);
}
/*** IVssHardwareSnapshotProviderEx methods ***/
static __WIDL_INLINE HRESULT IVssHardwareSnapshotProviderEx_GetProviderCapabilities(IVssHardwareSnapshotProviderEx* This,ULONGLONG *pllOriginalCapabilityMask) {
    return This->lpVtbl->GetProviderCapabilities(This,pllOriginalCapabilityMask);
}
static __WIDL_INLINE HRESULT IVssHardwareSnapshotProviderEx_OnLunStateChange(IVssHardwareSnapshotProviderEx* This,VDS_LUN_INFORMATION *pSnapshotLuns,VDS_LUN_INFORMATION *pOriginalLuns,DWORD dwCount,DWORD dwFlags) {
    return This->lpVtbl->OnLunStateChange(This,pSnapshotLuns,pOriginalLuns,dwCount,dwFlags);
}
static __WIDL_INLINE HRESULT IVssHardwareSnapshotProviderEx_ResyncLuns(IVssHardwareSnapshotProviderEx* This,VDS_LUN_INFORMATION *pSourceLuns,VDS_LUN_INFORMATION *pTargetLuns,DWORD dwCount,IVssAsync **ppAsync) {
    return This->lpVtbl->ResyncLuns(This,pSourceLuns,pTargetLuns,dwCount,ppAsync);
}
static __WIDL_INLINE HRESULT IVssHardwareSnapshotProviderEx_OnReuseLuns(IVssHardwareSnapshotProviderEx* This,VDS_LUN_INFORMATION *pSnapshotLuns,VDS_LUN_INFORMATION *pOriginalLuns,DWORD dwCount) {
    return This->lpVtbl->OnReuseLuns(This,pSnapshotLuns,pOriginalLuns,dwCount);
}
#endif
#endif

#endif


#endif  /* __IVssHardwareSnapshotProviderEx_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssFileShareSnapshotProvider interface
 */
#ifndef __IVssFileShareSnapshotProvider_INTERFACE_DEFINED__
#define __IVssFileShareSnapshotProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssFileShareSnapshotProvider, 0xc8636060, 0x7c2e, 0x11df, 0x8c,0x4a, 0x08,0x00,0x20,0x0c,0x9a,0x66);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c8636060-7c2e-11df-8c4a-0800200c9a66")
IVssFileShareSnapshotProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetContext(
        LONG lContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSnapshotProperties(
        VSS_ID SnapshotId,
        VSS_SNAPSHOT_PROP *pProp) = 0;

    virtual HRESULT STDMETHODCALLTYPE Query(
        VSS_ID QueriedObjectId,
        VSS_OBJECT_TYPE eQueriedObjectType,
        VSS_OBJECT_TYPE eReturnedObjectsType,
        IVssEnumObject **ppEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteSnapshots(
        VSS_ID SourceObjectId,
        VSS_OBJECT_TYPE eSourceObjectType,
        WINBOOL bForceDelete,
        LONG *plDeletedSnapshots,
        VSS_ID *pNondeletedSnapshotID) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeginPrepareSnapshot(
        VSS_ID SnapshotSetId,
        VSS_ID SnapshotId,
        VSS_PWSZ pwszSharePath,
        LONG lNewContext,
        VSS_ID ProviderId) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsPathSupported(
        VSS_PWSZ pwszSharePath,
        WINBOOL *pbSupportedByThisProvider) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsPathSnapshotted(
        VSS_PWSZ pwszSharePath,
        WINBOOL *pbSnapshotsPresent,
        LONG *plSnapshotCompatibility) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSnapshotProperty(
        VSS_ID SnapshotId,
        VSS_SNAPSHOT_PROPERTY_ID eSnapshotPropertyId,
        VARIANT vProperty) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssFileShareSnapshotProvider, 0xc8636060, 0x7c2e, 0x11df, 0x8c,0x4a, 0x08,0x00,0x20,0x0c,0x9a,0x66)
#endif
#else
typedef struct IVssFileShareSnapshotProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVssFileShareSnapshotProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *SetContext)(
        IVssFileShareSnapshotProvider *This,
        LONG lContext);

    HRESULT (STDMETHODCALLTYPE *GetSnapshotProperties)(
        IVssFileShareSnapshotProvider *This,
        VSS_ID SnapshotId,
        VSS_SNAPSHOT_PROP *pProp);

    HRESULT (STDMETHODCALLTYPE *Query)(
        IVssFileShareSnapshotProvider *This,
        VSS_ID QueriedObjectId,
        VSS_OBJECT_TYPE eQueriedObjectType,
        VSS_OBJECT_TYPE eReturnedObjectsType,
        IVssEnumObject **ppEnum);

    HRESULT (STDMETHODCALLTYPE *DeleteSnapshots)(
        IVssFileShareSnapshotProvider *This,
        VSS_ID SourceObjectId,
        VSS_OBJECT_TYPE eSourceObjectType,
        WINBOOL bForceDelete,
        LONG *plDeletedSnapshots,
        VSS_ID *pNondeletedSnapshotID);

    HRESULT (STDMETHODCALLTYPE *BeginPrepareSnapshot)(
        IVssFileShareSnapshotProvider *This,
        VSS_ID SnapshotSetId,
        VSS_ID SnapshotId,
        VSS_PWSZ pwszSharePath,
        LONG lNewContext,
        VSS_ID ProviderId);

    HRESULT (STDMETHODCALLTYPE *IsPathSupported)(
        IVssFileShareSnapshotProvider *This,
        VSS_PWSZ pwszSharePath,
        WINBOOL *pbSupportedByThisProvider);

    HRESULT (STDMETHODCALLTYPE *IsPathSnapshotted)(
        IVssFileShareSnapshotProvider *This,
        VSS_PWSZ pwszSharePath,
        WINBOOL *pbSnapshotsPresent,
        LONG *plSnapshotCompatibility);

    HRESULT (STDMETHODCALLTYPE *SetSnapshotProperty)(
        IVssFileShareSnapshotProvider *This,
        VSS_ID SnapshotId,
        VSS_SNAPSHOT_PROPERTY_ID eSnapshotPropertyId,
        VARIANT vProperty);

    END_INTERFACE
} IVssFileShareSnapshotProviderVtbl;

interface IVssFileShareSnapshotProvider {
    CONST_VTBL IVssFileShareSnapshotProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssFileShareSnapshotProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssFileShareSnapshotProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssFileShareSnapshotProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IVssFileShareSnapshotProvider methods ***/
#define IVssFileShareSnapshotProvider_SetContext(This,lContext) (This)->lpVtbl->SetContext(This,lContext)
#define IVssFileShareSnapshotProvider_GetSnapshotProperties(This,SnapshotId,pProp) (This)->lpVtbl->GetSnapshotProperties(This,SnapshotId,pProp)
#define IVssFileShareSnapshotProvider_Query(This,QueriedObjectId,eQueriedObjectType,eReturnedObjectsType,ppEnum) (This)->lpVtbl->Query(This,QueriedObjectId,eQueriedObjectType,eReturnedObjectsType,ppEnum)
#define IVssFileShareSnapshotProvider_DeleteSnapshots(This,SourceObjectId,eSourceObjectType,bForceDelete,plDeletedSnapshots,pNondeletedSnapshotID) (This)->lpVtbl->DeleteSnapshots(This,SourceObjectId,eSourceObjectType,bForceDelete,plDeletedSnapshots,pNondeletedSnapshotID)
#define IVssFileShareSnapshotProvider_BeginPrepareSnapshot(This,SnapshotSetId,SnapshotId,pwszSharePath,lNewContext,ProviderId) (This)->lpVtbl->BeginPrepareSnapshot(This,SnapshotSetId,SnapshotId,pwszSharePath,lNewContext,ProviderId)
#define IVssFileShareSnapshotProvider_IsPathSupported(This,pwszSharePath,pbSupportedByThisProvider) (This)->lpVtbl->IsPathSupported(This,pwszSharePath,pbSupportedByThisProvider)
#define IVssFileShareSnapshotProvider_IsPathSnapshotted(This,pwszSharePath,pbSnapshotsPresent,plSnapshotCompatibility) (This)->lpVtbl->IsPathSnapshotted(This,pwszSharePath,pbSnapshotsPresent,plSnapshotCompatibility)
#define IVssFileShareSnapshotProvider_SetSnapshotProperty(This,SnapshotId,eSnapshotPropertyId,vProperty) (This)->lpVtbl->SetSnapshotProperty(This,SnapshotId,eSnapshotPropertyId,vProperty)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVssFileShareSnapshotProvider_QueryInterface(IVssFileShareSnapshotProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVssFileShareSnapshotProvider_AddRef(IVssFileShareSnapshotProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVssFileShareSnapshotProvider_Release(IVssFileShareSnapshotProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssFileShareSnapshotProvider methods ***/
static __WIDL_INLINE HRESULT IVssFileShareSnapshotProvider_SetContext(IVssFileShareSnapshotProvider* This,LONG lContext) {
    return This->lpVtbl->SetContext(This,lContext);
}
static __WIDL_INLINE HRESULT IVssFileShareSnapshotProvider_GetSnapshotProperties(IVssFileShareSnapshotProvider* This,VSS_ID SnapshotId,VSS_SNAPSHOT_PROP *pProp) {
    return This->lpVtbl->GetSnapshotProperties(This,SnapshotId,pProp);
}
static __WIDL_INLINE HRESULT IVssFileShareSnapshotProvider_Query(IVssFileShareSnapshotProvider* This,VSS_ID QueriedObjectId,VSS_OBJECT_TYPE eQueriedObjectType,VSS_OBJECT_TYPE eReturnedObjectsType,IVssEnumObject **ppEnum) {
    return This->lpVtbl->Query(This,QueriedObjectId,eQueriedObjectType,eReturnedObjectsType,ppEnum);
}
static __WIDL_INLINE HRESULT IVssFileShareSnapshotProvider_DeleteSnapshots(IVssFileShareSnapshotProvider* This,VSS_ID SourceObjectId,VSS_OBJECT_TYPE eSourceObjectType,WINBOOL bForceDelete,LONG *plDeletedSnapshots,VSS_ID *pNondeletedSnapshotID) {
    return This->lpVtbl->DeleteSnapshots(This,SourceObjectId,eSourceObjectType,bForceDelete,plDeletedSnapshots,pNondeletedSnapshotID);
}
static __WIDL_INLINE HRESULT IVssFileShareSnapshotProvider_BeginPrepareSnapshot(IVssFileShareSnapshotProvider* This,VSS_ID SnapshotSetId,VSS_ID SnapshotId,VSS_PWSZ pwszSharePath,LONG lNewContext,VSS_ID ProviderId) {
    return This->lpVtbl->BeginPrepareSnapshot(This,SnapshotSetId,SnapshotId,pwszSharePath,lNewContext,ProviderId);
}
static __WIDL_INLINE HRESULT IVssFileShareSnapshotProvider_IsPathSupported(IVssFileShareSnapshotProvider* This,VSS_PWSZ pwszSharePath,WINBOOL *pbSupportedByThisProvider) {
    return This->lpVtbl->IsPathSupported(This,pwszSharePath,pbSupportedByThisProvider);
}
static __WIDL_INLINE HRESULT IVssFileShareSnapshotProvider_IsPathSnapshotted(IVssFileShareSnapshotProvider* This,VSS_PWSZ pwszSharePath,WINBOOL *pbSnapshotsPresent,LONG *plSnapshotCompatibility) {
    return This->lpVtbl->IsPathSnapshotted(This,pwszSharePath,pbSnapshotsPresent,plSnapshotCompatibility);
}
static __WIDL_INLINE HRESULT IVssFileShareSnapshotProvider_SetSnapshotProperty(IVssFileShareSnapshotProvider* This,VSS_ID SnapshotId,VSS_SNAPSHOT_PROPERTY_ID eSnapshotPropertyId,VARIANT vProperty) {
    return This->lpVtbl->SetSnapshotProperty(This,SnapshotId,eSnapshotPropertyId,vProperty);
}
#endif
#endif

#endif


#endif  /* __IVssFileShareSnapshotProvider_INTERFACE_DEFINED__ */

#ifndef __VSSProvider_LIBRARY_DEFINED__
#define __VSSProvider_LIBRARY_DEFINED__

DEFINE_GUID(LIBID_VSSProvider, 0x73c8b4c1, 0x6e9d, 0x4fc2, 0xb3,0x04, 0x03,0x0e,0xc7,0x63,0xfe,0x81);

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

ULONG           __RPC_USER VARIANT_UserSize     (ULONG *, ULONG, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserMarshal  (ULONG *, unsigned char *, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserUnmarshal(ULONG *, unsigned char *, VARIANT *);
void            __RPC_USER VARIANT_UserFree     (ULONG *, VARIANT *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __vsprov_h__ */
