/*** Autogenerated by WIDL 8.5 from include/vsbackup.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 __vsbackup_h__
#define __vsbackup_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 __IVssWMComponent_FWD_DEFINED__
#define __IVssWMComponent_FWD_DEFINED__
typedef interface IVssWMComponent IVssWMComponent;
#ifdef __cplusplus
interface IVssWMComponent;
#endif /* __cplusplus */
#endif

#ifndef __IVssExamineWriterMetadata_FWD_DEFINED__
#define __IVssExamineWriterMetadata_FWD_DEFINED__
typedef interface IVssExamineWriterMetadata IVssExamineWriterMetadata;
#ifdef __cplusplus
interface IVssExamineWriterMetadata;
#endif /* __cplusplus */
#endif

#ifndef __IVssExamineWriterMetadataEx_FWD_DEFINED__
#define __IVssExamineWriterMetadataEx_FWD_DEFINED__
typedef interface IVssExamineWriterMetadataEx IVssExamineWriterMetadataEx;
#ifdef __cplusplus
interface IVssExamineWriterMetadataEx;
#endif /* __cplusplus */
#endif

#ifndef __IVssExamineWriterMetadataEx2_FWD_DEFINED__
#define __IVssExamineWriterMetadataEx2_FWD_DEFINED__
typedef interface IVssExamineWriterMetadataEx2 IVssExamineWriterMetadataEx2;
#ifdef __cplusplus
interface IVssExamineWriterMetadataEx2;
#endif /* __cplusplus */
#endif

#ifndef __IVssWriterComponentsExt_FWD_DEFINED__
#define __IVssWriterComponentsExt_FWD_DEFINED__
typedef interface IVssWriterComponentsExt IVssWriterComponentsExt;
#ifdef __cplusplus
interface IVssWriterComponentsExt;
#endif /* __cplusplus */
#endif

#ifndef __IVssBackupComponents_FWD_DEFINED__
#define __IVssBackupComponents_FWD_DEFINED__
typedef interface IVssBackupComponents IVssBackupComponents;
#ifdef __cplusplus
interface IVssBackupComponents;
#endif /* __cplusplus */
#endif

#ifndef __IVssBackupComponentsEx_FWD_DEFINED__
#define __IVssBackupComponentsEx_FWD_DEFINED__
typedef interface IVssBackupComponentsEx IVssBackupComponentsEx;
#ifdef __cplusplus
interface IVssBackupComponentsEx;
#endif /* __cplusplus */
#endif

#ifndef __IVssBackupComponentsEx2_FWD_DEFINED__
#define __IVssBackupComponentsEx2_FWD_DEFINED__
typedef interface IVssBackupComponentsEx2 IVssBackupComponentsEx2;
#ifdef __cplusplus
interface IVssBackupComponentsEx2;
#endif /* __cplusplus */
#endif

#ifndef __IVssBackupComponentsEx3_FWD_DEFINED__
#define __IVssBackupComponentsEx3_FWD_DEFINED__
typedef interface IVssBackupComponentsEx3 IVssBackupComponentsEx3;
#ifdef __cplusplus
interface IVssBackupComponentsEx3;
#endif /* __cplusplus */
#endif

#ifndef __IVssBackupComponentsEx4_FWD_DEFINED__
#define __IVssBackupComponentsEx4_FWD_DEFINED__
typedef interface IVssBackupComponentsEx4 IVssBackupComponentsEx4;
#ifdef __cplusplus
interface IVssBackupComponentsEx4;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

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

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
typedef struct _VSS_COMPONENTINFO {
    VSS_COMPONENT_TYPE type;
    BSTR bstrLogicalPath;
    BSTR bstrComponentName;
    BSTR bstrCaption;
    BYTE *pbIcon;
    UINT cbIcon;
    boolean bRestoreMetadata;
    boolean bNotifyOnBackupComplete;
    boolean bSelectable;
    boolean bSelectableForRestore;
    DWORD dwComponentFlags;
    UINT cFileCount;
    UINT cDatabases;
    UINT cLogFiles;
    UINT cDependencies;
} VSS_COMPONENTINFO;
typedef const VSS_COMPONENTINFO *PVSSCOMPONENTINFO;
/*****************************************************************************
 * IVssWMComponent interface
 */
#ifndef __IVssWMComponent_INTERFACE_DEFINED__
#define __IVssWMComponent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssWMComponent, 0x00000000, 0x0000, 0x0000, 0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00000000-0000-0000-0000-000000000000")
IVssWMComponent : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetComponentInfo(
        PVSSCOMPONENTINFO *ppInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE FreeComponentInfo(
        PVSSCOMPONENTINFO pInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFile(
        UINT iFile,
        IVssWMFiledesc **ppFiledesc) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDatabaseFile(
        UINT iDBFile,
        IVssWMFiledesc **ppFiledesc) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDatabaseLogFile(
        UINT iDbLogFile,
        IVssWMFiledesc **ppFiledesc) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDependency(
        UINT iDependency,
        IVssWMDependency **ppDependency) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssWMComponent, 0x00000000, 0x0000, 0x0000, 0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00)
#endif
#else
typedef struct IVssWMComponentVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVssWMComponent methods ***/
    HRESULT (STDMETHODCALLTYPE *GetComponentInfo)(
        IVssWMComponent *This,
        PVSSCOMPONENTINFO *ppInfo);

    HRESULT (STDMETHODCALLTYPE *FreeComponentInfo)(
        IVssWMComponent *This,
        PVSSCOMPONENTINFO pInfo);

    HRESULT (STDMETHODCALLTYPE *GetFile)(
        IVssWMComponent *This,
        UINT iFile,
        IVssWMFiledesc **ppFiledesc);

    HRESULT (STDMETHODCALLTYPE *GetDatabaseFile)(
        IVssWMComponent *This,
        UINT iDBFile,
        IVssWMFiledesc **ppFiledesc);

    HRESULT (STDMETHODCALLTYPE *GetDatabaseLogFile)(
        IVssWMComponent *This,
        UINT iDbLogFile,
        IVssWMFiledesc **ppFiledesc);

    HRESULT (STDMETHODCALLTYPE *GetDependency)(
        IVssWMComponent *This,
        UINT iDependency,
        IVssWMDependency **ppDependency);

    END_INTERFACE
} IVssWMComponentVtbl;

interface IVssWMComponent {
    CONST_VTBL IVssWMComponentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssWMComponent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssWMComponent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssWMComponent_Release(This) (This)->lpVtbl->Release(This)
/*** IVssWMComponent methods ***/
#define IVssWMComponent_GetComponentInfo(This,ppInfo) (This)->lpVtbl->GetComponentInfo(This,ppInfo)
#define IVssWMComponent_FreeComponentInfo(This,pInfo) (This)->lpVtbl->FreeComponentInfo(This,pInfo)
#define IVssWMComponent_GetFile(This,iFile,ppFiledesc) (This)->lpVtbl->GetFile(This,iFile,ppFiledesc)
#define IVssWMComponent_GetDatabaseFile(This,iDBFile,ppFiledesc) (This)->lpVtbl->GetDatabaseFile(This,iDBFile,ppFiledesc)
#define IVssWMComponent_GetDatabaseLogFile(This,iDbLogFile,ppFiledesc) (This)->lpVtbl->GetDatabaseLogFile(This,iDbLogFile,ppFiledesc)
#define IVssWMComponent_GetDependency(This,iDependency,ppDependency) (This)->lpVtbl->GetDependency(This,iDependency,ppDependency)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVssWMComponent_QueryInterface(IVssWMComponent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVssWMComponent_AddRef(IVssWMComponent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVssWMComponent_Release(IVssWMComponent* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssWMComponent methods ***/
static __WIDL_INLINE HRESULT IVssWMComponent_GetComponentInfo(IVssWMComponent* This,PVSSCOMPONENTINFO *ppInfo) {
    return This->lpVtbl->GetComponentInfo(This,ppInfo);
}
static __WIDL_INLINE HRESULT IVssWMComponent_FreeComponentInfo(IVssWMComponent* This,PVSSCOMPONENTINFO pInfo) {
    return This->lpVtbl->FreeComponentInfo(This,pInfo);
}
static __WIDL_INLINE HRESULT IVssWMComponent_GetFile(IVssWMComponent* This,UINT iFile,IVssWMFiledesc **ppFiledesc) {
    return This->lpVtbl->GetFile(This,iFile,ppFiledesc);
}
static __WIDL_INLINE HRESULT IVssWMComponent_GetDatabaseFile(IVssWMComponent* This,UINT iDBFile,IVssWMFiledesc **ppFiledesc) {
    return This->lpVtbl->GetDatabaseFile(This,iDBFile,ppFiledesc);
}
static __WIDL_INLINE HRESULT IVssWMComponent_GetDatabaseLogFile(IVssWMComponent* This,UINT iDbLogFile,IVssWMFiledesc **ppFiledesc) {
    return This->lpVtbl->GetDatabaseLogFile(This,iDbLogFile,ppFiledesc);
}
static __WIDL_INLINE HRESULT IVssWMComponent_GetDependency(IVssWMComponent* This,UINT iDependency,IVssWMDependency **ppDependency) {
    return This->lpVtbl->GetDependency(This,iDependency,ppDependency);
}
#endif
#endif

#endif


#endif  /* __IVssWMComponent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssExamineWriterMetadata interface
 */
#ifndef __IVssExamineWriterMetadata_INTERFACE_DEFINED__
#define __IVssExamineWriterMetadata_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssExamineWriterMetadata, 0x902fcf7f, 0xb7fd, 0x42f8, 0x81,0xf1, 0xb2,0xe4,0x00,0xb1,0xe5,0xbd);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("902fcf7f-b7fd-42f8-81f1-b2e400b1e5bd")
IVssExamineWriterMetadata : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetIdentity(
        VSS_ID *pidInstance,
        VSS_ID *pidWriter,
        BSTR *pbstrWriterName,
        VSS_USAGE_TYPE *pUsage,
        VSS_SOURCE_TYPE *pSource) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFileCounts(
        UINT *pcIncludeFiles,
        UINT *pcExcludeFiles,
        UINT *pcComponents) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIncludeFile(
        UINT iFile,
        IVssWMFiledesc **ppFiledesc) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetExcludeFile(
        UINT iFile,
        IVssWMFiledesc **ppFiledesc) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetComponent(
        UINT iComponent,
        IVssWMComponent **ppComponent) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRestoreMethod(
        VSS_RESTOREMETHOD_ENUM *pMethod,
        BSTR *pbstrService,
        BSTR *pbstrUserProcedure,
        VSS_WRITERRESTORE_ENUM *pwriterRestore,
        boolean *pbRebootRequired,
        UINT *pcMappings) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAlternateLocationMapping(
        UINT iMapping,
        IVssWMFiledesc **ppFiledesc) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBackupSchema(
        DWORD *pdwSchemaMask) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDocument(
        IXMLDOMDocument **pDoc) = 0;

    virtual HRESULT STDMETHODCALLTYPE SaveAsXML(
        BSTR *pbstrXML) = 0;

    virtual HRESULT STDMETHODCALLTYPE LoadFromXML(
        BSTR bstrXML) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssExamineWriterMetadata, 0x902fcf7f, 0xb7fd, 0x42f8, 0x81,0xf1, 0xb2,0xe4,0x00,0xb1,0xe5,0xbd)
#endif
#else
typedef struct IVssExamineWriterMetadataVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVssExamineWriterMetadata methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIdentity)(
        IVssExamineWriterMetadata *This,
        VSS_ID *pidInstance,
        VSS_ID *pidWriter,
        BSTR *pbstrWriterName,
        VSS_USAGE_TYPE *pUsage,
        VSS_SOURCE_TYPE *pSource);

    HRESULT (STDMETHODCALLTYPE *GetFileCounts)(
        IVssExamineWriterMetadata *This,
        UINT *pcIncludeFiles,
        UINT *pcExcludeFiles,
        UINT *pcComponents);

    HRESULT (STDMETHODCALLTYPE *GetIncludeFile)(
        IVssExamineWriterMetadata *This,
        UINT iFile,
        IVssWMFiledesc **ppFiledesc);

    HRESULT (STDMETHODCALLTYPE *GetExcludeFile)(
        IVssExamineWriterMetadata *This,
        UINT iFile,
        IVssWMFiledesc **ppFiledesc);

    HRESULT (STDMETHODCALLTYPE *GetComponent)(
        IVssExamineWriterMetadata *This,
        UINT iComponent,
        IVssWMComponent **ppComponent);

    HRESULT (STDMETHODCALLTYPE *GetRestoreMethod)(
        IVssExamineWriterMetadata *This,
        VSS_RESTOREMETHOD_ENUM *pMethod,
        BSTR *pbstrService,
        BSTR *pbstrUserProcedure,
        VSS_WRITERRESTORE_ENUM *pwriterRestore,
        boolean *pbRebootRequired,
        UINT *pcMappings);

    HRESULT (STDMETHODCALLTYPE *GetAlternateLocationMapping)(
        IVssExamineWriterMetadata *This,
        UINT iMapping,
        IVssWMFiledesc **ppFiledesc);

    HRESULT (STDMETHODCALLTYPE *GetBackupSchema)(
        IVssExamineWriterMetadata *This,
        DWORD *pdwSchemaMask);

    HRESULT (STDMETHODCALLTYPE *GetDocument)(
        IVssExamineWriterMetadata *This,
        IXMLDOMDocument **pDoc);

    HRESULT (STDMETHODCALLTYPE *SaveAsXML)(
        IVssExamineWriterMetadata *This,
        BSTR *pbstrXML);

    HRESULT (STDMETHODCALLTYPE *LoadFromXML)(
        IVssExamineWriterMetadata *This,
        BSTR bstrXML);

    END_INTERFACE
} IVssExamineWriterMetadataVtbl;

interface IVssExamineWriterMetadata {
    CONST_VTBL IVssExamineWriterMetadataVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssExamineWriterMetadata_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssExamineWriterMetadata_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssExamineWriterMetadata_Release(This) (This)->lpVtbl->Release(This)
/*** IVssExamineWriterMetadata methods ***/
#define IVssExamineWriterMetadata_GetIdentity(This,pidInstance,pidWriter,pbstrWriterName,pUsage,pSource) (This)->lpVtbl->GetIdentity(This,pidInstance,pidWriter,pbstrWriterName,pUsage,pSource)
#define IVssExamineWriterMetadata_GetFileCounts(This,pcIncludeFiles,pcExcludeFiles,pcComponents) (This)->lpVtbl->GetFileCounts(This,pcIncludeFiles,pcExcludeFiles,pcComponents)
#define IVssExamineWriterMetadata_GetIncludeFile(This,iFile,ppFiledesc) (This)->lpVtbl->GetIncludeFile(This,iFile,ppFiledesc)
#define IVssExamineWriterMetadata_GetExcludeFile(This,iFile,ppFiledesc) (This)->lpVtbl->GetExcludeFile(This,iFile,ppFiledesc)
#define IVssExamineWriterMetadata_GetComponent(This,iComponent,ppComponent) (This)->lpVtbl->GetComponent(This,iComponent,ppComponent)
#define IVssExamineWriterMetadata_GetRestoreMethod(This,pMethod,pbstrService,pbstrUserProcedure,pwriterRestore,pbRebootRequired,pcMappings) (This)->lpVtbl->GetRestoreMethod(This,pMethod,pbstrService,pbstrUserProcedure,pwriterRestore,pbRebootRequired,pcMappings)
#define IVssExamineWriterMetadata_GetAlternateLocationMapping(This,iMapping,ppFiledesc) (This)->lpVtbl->GetAlternateLocationMapping(This,iMapping,ppFiledesc)
#define IVssExamineWriterMetadata_GetBackupSchema(This,pdwSchemaMask) (This)->lpVtbl->GetBackupSchema(This,pdwSchemaMask)
#define IVssExamineWriterMetadata_GetDocument(This,pDoc) (This)->lpVtbl->GetDocument(This,pDoc)
#define IVssExamineWriterMetadata_SaveAsXML(This,pbstrXML) (This)->lpVtbl->SaveAsXML(This,pbstrXML)
#define IVssExamineWriterMetadata_LoadFromXML(This,bstrXML) (This)->lpVtbl->LoadFromXML(This,bstrXML)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVssExamineWriterMetadata_QueryInterface(IVssExamineWriterMetadata* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVssExamineWriterMetadata_AddRef(IVssExamineWriterMetadata* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVssExamineWriterMetadata_Release(IVssExamineWriterMetadata* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssExamineWriterMetadata methods ***/
static __WIDL_INLINE HRESULT IVssExamineWriterMetadata_GetIdentity(IVssExamineWriterMetadata* This,VSS_ID *pidInstance,VSS_ID *pidWriter,BSTR *pbstrWriterName,VSS_USAGE_TYPE *pUsage,VSS_SOURCE_TYPE *pSource) {
    return This->lpVtbl->GetIdentity(This,pidInstance,pidWriter,pbstrWriterName,pUsage,pSource);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadata_GetFileCounts(IVssExamineWriterMetadata* This,UINT *pcIncludeFiles,UINT *pcExcludeFiles,UINT *pcComponents) {
    return This->lpVtbl->GetFileCounts(This,pcIncludeFiles,pcExcludeFiles,pcComponents);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadata_GetIncludeFile(IVssExamineWriterMetadata* This,UINT iFile,IVssWMFiledesc **ppFiledesc) {
    return This->lpVtbl->GetIncludeFile(This,iFile,ppFiledesc);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadata_GetExcludeFile(IVssExamineWriterMetadata* This,UINT iFile,IVssWMFiledesc **ppFiledesc) {
    return This->lpVtbl->GetExcludeFile(This,iFile,ppFiledesc);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadata_GetComponent(IVssExamineWriterMetadata* This,UINT iComponent,IVssWMComponent **ppComponent) {
    return This->lpVtbl->GetComponent(This,iComponent,ppComponent);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadata_GetRestoreMethod(IVssExamineWriterMetadata* This,VSS_RESTOREMETHOD_ENUM *pMethod,BSTR *pbstrService,BSTR *pbstrUserProcedure,VSS_WRITERRESTORE_ENUM *pwriterRestore,boolean *pbRebootRequired,UINT *pcMappings) {
    return This->lpVtbl->GetRestoreMethod(This,pMethod,pbstrService,pbstrUserProcedure,pwriterRestore,pbRebootRequired,pcMappings);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadata_GetAlternateLocationMapping(IVssExamineWriterMetadata* This,UINT iMapping,IVssWMFiledesc **ppFiledesc) {
    return This->lpVtbl->GetAlternateLocationMapping(This,iMapping,ppFiledesc);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadata_GetBackupSchema(IVssExamineWriterMetadata* This,DWORD *pdwSchemaMask) {
    return This->lpVtbl->GetBackupSchema(This,pdwSchemaMask);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadata_GetDocument(IVssExamineWriterMetadata* This,IXMLDOMDocument **pDoc) {
    return This->lpVtbl->GetDocument(This,pDoc);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadata_SaveAsXML(IVssExamineWriterMetadata* This,BSTR *pbstrXML) {
    return This->lpVtbl->SaveAsXML(This,pbstrXML);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadata_LoadFromXML(IVssExamineWriterMetadata* This,BSTR bstrXML) {
    return This->lpVtbl->LoadFromXML(This,bstrXML);
}
#endif
#endif

#endif


#endif  /* __IVssExamineWriterMetadata_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssExamineWriterMetadataEx interface
 */
#ifndef __IVssExamineWriterMetadataEx_INTERFACE_DEFINED__
#define __IVssExamineWriterMetadataEx_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssExamineWriterMetadataEx, 0x0c0e5ec0, 0xca44, 0x472b, 0xb7,0x02, 0xe6,0x52,0xdb,0x1c,0x04,0x51);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0c0e5ec0-ca44-472b-b702-e652db1c0451")
IVssExamineWriterMetadataEx : public IVssExamineWriterMetadata
{
    virtual HRESULT STDMETHODCALLTYPE GetIdentityEx(
        VSS_ID *pidInstance,
        VSS_ID *pidWriter,
        BSTR *pbstrWriterName,
        BSTR *pbstrInstanceName,
        VSS_USAGE_TYPE *pUsage,
        VSS_SOURCE_TYPE *pSource) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssExamineWriterMetadataEx, 0x0c0e5ec0, 0xca44, 0x472b, 0xb7,0x02, 0xe6,0x52,0xdb,0x1c,0x04,0x51)
#endif
#else
typedef struct IVssExamineWriterMetadataExVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVssExamineWriterMetadata methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIdentity)(
        IVssExamineWriterMetadataEx *This,
        VSS_ID *pidInstance,
        VSS_ID *pidWriter,
        BSTR *pbstrWriterName,
        VSS_USAGE_TYPE *pUsage,
        VSS_SOURCE_TYPE *pSource);

    HRESULT (STDMETHODCALLTYPE *GetFileCounts)(
        IVssExamineWriterMetadataEx *This,
        UINT *pcIncludeFiles,
        UINT *pcExcludeFiles,
        UINT *pcComponents);

    HRESULT (STDMETHODCALLTYPE *GetIncludeFile)(
        IVssExamineWriterMetadataEx *This,
        UINT iFile,
        IVssWMFiledesc **ppFiledesc);

    HRESULT (STDMETHODCALLTYPE *GetExcludeFile)(
        IVssExamineWriterMetadataEx *This,
        UINT iFile,
        IVssWMFiledesc **ppFiledesc);

    HRESULT (STDMETHODCALLTYPE *GetComponent)(
        IVssExamineWriterMetadataEx *This,
        UINT iComponent,
        IVssWMComponent **ppComponent);

    HRESULT (STDMETHODCALLTYPE *GetRestoreMethod)(
        IVssExamineWriterMetadataEx *This,
        VSS_RESTOREMETHOD_ENUM *pMethod,
        BSTR *pbstrService,
        BSTR *pbstrUserProcedure,
        VSS_WRITERRESTORE_ENUM *pwriterRestore,
        boolean *pbRebootRequired,
        UINT *pcMappings);

    HRESULT (STDMETHODCALLTYPE *GetAlternateLocationMapping)(
        IVssExamineWriterMetadataEx *This,
        UINT iMapping,
        IVssWMFiledesc **ppFiledesc);

    HRESULT (STDMETHODCALLTYPE *GetBackupSchema)(
        IVssExamineWriterMetadataEx *This,
        DWORD *pdwSchemaMask);

    HRESULT (STDMETHODCALLTYPE *GetDocument)(
        IVssExamineWriterMetadataEx *This,
        IXMLDOMDocument **pDoc);

    HRESULT (STDMETHODCALLTYPE *SaveAsXML)(
        IVssExamineWriterMetadataEx *This,
        BSTR *pbstrXML);

    HRESULT (STDMETHODCALLTYPE *LoadFromXML)(
        IVssExamineWriterMetadataEx *This,
        BSTR bstrXML);

    /*** IVssExamineWriterMetadataEx methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIdentityEx)(
        IVssExamineWriterMetadataEx *This,
        VSS_ID *pidInstance,
        VSS_ID *pidWriter,
        BSTR *pbstrWriterName,
        BSTR *pbstrInstanceName,
        VSS_USAGE_TYPE *pUsage,
        VSS_SOURCE_TYPE *pSource);

    END_INTERFACE
} IVssExamineWriterMetadataExVtbl;

interface IVssExamineWriterMetadataEx {
    CONST_VTBL IVssExamineWriterMetadataExVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssExamineWriterMetadataEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssExamineWriterMetadataEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssExamineWriterMetadataEx_Release(This) (This)->lpVtbl->Release(This)
/*** IVssExamineWriterMetadata methods ***/
#define IVssExamineWriterMetadataEx_GetIdentity(This,pidInstance,pidWriter,pbstrWriterName,pUsage,pSource) (This)->lpVtbl->GetIdentity(This,pidInstance,pidWriter,pbstrWriterName,pUsage,pSource)
#define IVssExamineWriterMetadataEx_GetFileCounts(This,pcIncludeFiles,pcExcludeFiles,pcComponents) (This)->lpVtbl->GetFileCounts(This,pcIncludeFiles,pcExcludeFiles,pcComponents)
#define IVssExamineWriterMetadataEx_GetIncludeFile(This,iFile,ppFiledesc) (This)->lpVtbl->GetIncludeFile(This,iFile,ppFiledesc)
#define IVssExamineWriterMetadataEx_GetExcludeFile(This,iFile,ppFiledesc) (This)->lpVtbl->GetExcludeFile(This,iFile,ppFiledesc)
#define IVssExamineWriterMetadataEx_GetComponent(This,iComponent,ppComponent) (This)->lpVtbl->GetComponent(This,iComponent,ppComponent)
#define IVssExamineWriterMetadataEx_GetRestoreMethod(This,pMethod,pbstrService,pbstrUserProcedure,pwriterRestore,pbRebootRequired,pcMappings) (This)->lpVtbl->GetRestoreMethod(This,pMethod,pbstrService,pbstrUserProcedure,pwriterRestore,pbRebootRequired,pcMappings)
#define IVssExamineWriterMetadataEx_GetAlternateLocationMapping(This,iMapping,ppFiledesc) (This)->lpVtbl->GetAlternateLocationMapping(This,iMapping,ppFiledesc)
#define IVssExamineWriterMetadataEx_GetBackupSchema(This,pdwSchemaMask) (This)->lpVtbl->GetBackupSchema(This,pdwSchemaMask)
#define IVssExamineWriterMetadataEx_GetDocument(This,pDoc) (This)->lpVtbl->GetDocument(This,pDoc)
#define IVssExamineWriterMetadataEx_SaveAsXML(This,pbstrXML) (This)->lpVtbl->SaveAsXML(This,pbstrXML)
#define IVssExamineWriterMetadataEx_LoadFromXML(This,bstrXML) (This)->lpVtbl->LoadFromXML(This,bstrXML)
/*** IVssExamineWriterMetadataEx methods ***/
#define IVssExamineWriterMetadataEx_GetIdentityEx(This,pidInstance,pidWriter,pbstrWriterName,pbstrInstanceName,pUsage,pSource) (This)->lpVtbl->GetIdentityEx(This,pidInstance,pidWriter,pbstrWriterName,pbstrInstanceName,pUsage,pSource)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx_QueryInterface(IVssExamineWriterMetadataEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVssExamineWriterMetadataEx_AddRef(IVssExamineWriterMetadataEx* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVssExamineWriterMetadataEx_Release(IVssExamineWriterMetadataEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssExamineWriterMetadata methods ***/
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx_GetIdentity(IVssExamineWriterMetadataEx* This,VSS_ID *pidInstance,VSS_ID *pidWriter,BSTR *pbstrWriterName,VSS_USAGE_TYPE *pUsage,VSS_SOURCE_TYPE *pSource) {
    return This->lpVtbl->GetIdentity(This,pidInstance,pidWriter,pbstrWriterName,pUsage,pSource);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx_GetFileCounts(IVssExamineWriterMetadataEx* This,UINT *pcIncludeFiles,UINT *pcExcludeFiles,UINT *pcComponents) {
    return This->lpVtbl->GetFileCounts(This,pcIncludeFiles,pcExcludeFiles,pcComponents);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx_GetIncludeFile(IVssExamineWriterMetadataEx* This,UINT iFile,IVssWMFiledesc **ppFiledesc) {
    return This->lpVtbl->GetIncludeFile(This,iFile,ppFiledesc);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx_GetExcludeFile(IVssExamineWriterMetadataEx* This,UINT iFile,IVssWMFiledesc **ppFiledesc) {
    return This->lpVtbl->GetExcludeFile(This,iFile,ppFiledesc);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx_GetComponent(IVssExamineWriterMetadataEx* This,UINT iComponent,IVssWMComponent **ppComponent) {
    return This->lpVtbl->GetComponent(This,iComponent,ppComponent);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx_GetRestoreMethod(IVssExamineWriterMetadataEx* This,VSS_RESTOREMETHOD_ENUM *pMethod,BSTR *pbstrService,BSTR *pbstrUserProcedure,VSS_WRITERRESTORE_ENUM *pwriterRestore,boolean *pbRebootRequired,UINT *pcMappings) {
    return This->lpVtbl->GetRestoreMethod(This,pMethod,pbstrService,pbstrUserProcedure,pwriterRestore,pbRebootRequired,pcMappings);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx_GetAlternateLocationMapping(IVssExamineWriterMetadataEx* This,UINT iMapping,IVssWMFiledesc **ppFiledesc) {
    return This->lpVtbl->GetAlternateLocationMapping(This,iMapping,ppFiledesc);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx_GetBackupSchema(IVssExamineWriterMetadataEx* This,DWORD *pdwSchemaMask) {
    return This->lpVtbl->GetBackupSchema(This,pdwSchemaMask);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx_GetDocument(IVssExamineWriterMetadataEx* This,IXMLDOMDocument **pDoc) {
    return This->lpVtbl->GetDocument(This,pDoc);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx_SaveAsXML(IVssExamineWriterMetadataEx* This,BSTR *pbstrXML) {
    return This->lpVtbl->SaveAsXML(This,pbstrXML);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx_LoadFromXML(IVssExamineWriterMetadataEx* This,BSTR bstrXML) {
    return This->lpVtbl->LoadFromXML(This,bstrXML);
}
/*** IVssExamineWriterMetadataEx methods ***/
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx_GetIdentityEx(IVssExamineWriterMetadataEx* This,VSS_ID *pidInstance,VSS_ID *pidWriter,BSTR *pbstrWriterName,BSTR *pbstrInstanceName,VSS_USAGE_TYPE *pUsage,VSS_SOURCE_TYPE *pSource) {
    return This->lpVtbl->GetIdentityEx(This,pidInstance,pidWriter,pbstrWriterName,pbstrInstanceName,pUsage,pSource);
}
#endif
#endif

#endif


#endif  /* __IVssExamineWriterMetadataEx_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssExamineWriterMetadataEx2 interface
 */
#ifndef __IVssExamineWriterMetadataEx2_INTERFACE_DEFINED__
#define __IVssExamineWriterMetadataEx2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssExamineWriterMetadataEx2, 0xce115780, 0xa611, 0x431b, 0xb5,0x7f, 0xc3,0x83,0x03,0xab,0x6a,0xee);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ce115780-a611-431b-b57f-c38303ab6aee")
IVssExamineWriterMetadataEx2 : public IVssExamineWriterMetadataEx
{
    virtual HRESULT STDMETHODCALLTYPE GetVersion(
        DWORD *pdwMajorVersion,
        DWORD *pdwMinorVersion) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetExcludeFromSnapshotCount(
        UINT *pcExcludedFromSnapshot) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetExcludeFromSnapshotFile(
        UINT iFile,
        IVssWMFiledesc **ppFiledesc) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssExamineWriterMetadataEx2, 0xce115780, 0xa611, 0x431b, 0xb5,0x7f, 0xc3,0x83,0x03,0xab,0x6a,0xee)
#endif
#else
typedef struct IVssExamineWriterMetadataEx2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVssExamineWriterMetadata methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIdentity)(
        IVssExamineWriterMetadataEx2 *This,
        VSS_ID *pidInstance,
        VSS_ID *pidWriter,
        BSTR *pbstrWriterName,
        VSS_USAGE_TYPE *pUsage,
        VSS_SOURCE_TYPE *pSource);

    HRESULT (STDMETHODCALLTYPE *GetFileCounts)(
        IVssExamineWriterMetadataEx2 *This,
        UINT *pcIncludeFiles,
        UINT *pcExcludeFiles,
        UINT *pcComponents);

    HRESULT (STDMETHODCALLTYPE *GetIncludeFile)(
        IVssExamineWriterMetadataEx2 *This,
        UINT iFile,
        IVssWMFiledesc **ppFiledesc);

    HRESULT (STDMETHODCALLTYPE *GetExcludeFile)(
        IVssExamineWriterMetadataEx2 *This,
        UINT iFile,
        IVssWMFiledesc **ppFiledesc);

    HRESULT (STDMETHODCALLTYPE *GetComponent)(
        IVssExamineWriterMetadataEx2 *This,
        UINT iComponent,
        IVssWMComponent **ppComponent);

    HRESULT (STDMETHODCALLTYPE *GetRestoreMethod)(
        IVssExamineWriterMetadataEx2 *This,
        VSS_RESTOREMETHOD_ENUM *pMethod,
        BSTR *pbstrService,
        BSTR *pbstrUserProcedure,
        VSS_WRITERRESTORE_ENUM *pwriterRestore,
        boolean *pbRebootRequired,
        UINT *pcMappings);

    HRESULT (STDMETHODCALLTYPE *GetAlternateLocationMapping)(
        IVssExamineWriterMetadataEx2 *This,
        UINT iMapping,
        IVssWMFiledesc **ppFiledesc);

    HRESULT (STDMETHODCALLTYPE *GetBackupSchema)(
        IVssExamineWriterMetadataEx2 *This,
        DWORD *pdwSchemaMask);

    HRESULT (STDMETHODCALLTYPE *GetDocument)(
        IVssExamineWriterMetadataEx2 *This,
        IXMLDOMDocument **pDoc);

    HRESULT (STDMETHODCALLTYPE *SaveAsXML)(
        IVssExamineWriterMetadataEx2 *This,
        BSTR *pbstrXML);

    HRESULT (STDMETHODCALLTYPE *LoadFromXML)(
        IVssExamineWriterMetadataEx2 *This,
        BSTR bstrXML);

    /*** IVssExamineWriterMetadataEx methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIdentityEx)(
        IVssExamineWriterMetadataEx2 *This,
        VSS_ID *pidInstance,
        VSS_ID *pidWriter,
        BSTR *pbstrWriterName,
        BSTR *pbstrInstanceName,
        VSS_USAGE_TYPE *pUsage,
        VSS_SOURCE_TYPE *pSource);

    /*** IVssExamineWriterMetadataEx2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetVersion)(
        IVssExamineWriterMetadataEx2 *This,
        DWORD *pdwMajorVersion,
        DWORD *pdwMinorVersion);

    HRESULT (STDMETHODCALLTYPE *GetExcludeFromSnapshotCount)(
        IVssExamineWriterMetadataEx2 *This,
        UINT *pcExcludedFromSnapshot);

    HRESULT (STDMETHODCALLTYPE *GetExcludeFromSnapshotFile)(
        IVssExamineWriterMetadataEx2 *This,
        UINT iFile,
        IVssWMFiledesc **ppFiledesc);

    END_INTERFACE
} IVssExamineWriterMetadataEx2Vtbl;

interface IVssExamineWriterMetadataEx2 {
    CONST_VTBL IVssExamineWriterMetadataEx2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssExamineWriterMetadataEx2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssExamineWriterMetadataEx2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssExamineWriterMetadataEx2_Release(This) (This)->lpVtbl->Release(This)
/*** IVssExamineWriterMetadata methods ***/
#define IVssExamineWriterMetadataEx2_GetIdentity(This,pidInstance,pidWriter,pbstrWriterName,pUsage,pSource) (This)->lpVtbl->GetIdentity(This,pidInstance,pidWriter,pbstrWriterName,pUsage,pSource)
#define IVssExamineWriterMetadataEx2_GetFileCounts(This,pcIncludeFiles,pcExcludeFiles,pcComponents) (This)->lpVtbl->GetFileCounts(This,pcIncludeFiles,pcExcludeFiles,pcComponents)
#define IVssExamineWriterMetadataEx2_GetIncludeFile(This,iFile,ppFiledesc) (This)->lpVtbl->GetIncludeFile(This,iFile,ppFiledesc)
#define IVssExamineWriterMetadataEx2_GetExcludeFile(This,iFile,ppFiledesc) (This)->lpVtbl->GetExcludeFile(This,iFile,ppFiledesc)
#define IVssExamineWriterMetadataEx2_GetComponent(This,iComponent,ppComponent) (This)->lpVtbl->GetComponent(This,iComponent,ppComponent)
#define IVssExamineWriterMetadataEx2_GetRestoreMethod(This,pMethod,pbstrService,pbstrUserProcedure,pwriterRestore,pbRebootRequired,pcMappings) (This)->lpVtbl->GetRestoreMethod(This,pMethod,pbstrService,pbstrUserProcedure,pwriterRestore,pbRebootRequired,pcMappings)
#define IVssExamineWriterMetadataEx2_GetAlternateLocationMapping(This,iMapping,ppFiledesc) (This)->lpVtbl->GetAlternateLocationMapping(This,iMapping,ppFiledesc)
#define IVssExamineWriterMetadataEx2_GetBackupSchema(This,pdwSchemaMask) (This)->lpVtbl->GetBackupSchema(This,pdwSchemaMask)
#define IVssExamineWriterMetadataEx2_GetDocument(This,pDoc) (This)->lpVtbl->GetDocument(This,pDoc)
#define IVssExamineWriterMetadataEx2_SaveAsXML(This,pbstrXML) (This)->lpVtbl->SaveAsXML(This,pbstrXML)
#define IVssExamineWriterMetadataEx2_LoadFromXML(This,bstrXML) (This)->lpVtbl->LoadFromXML(This,bstrXML)
/*** IVssExamineWriterMetadataEx methods ***/
#define IVssExamineWriterMetadataEx2_GetIdentityEx(This,pidInstance,pidWriter,pbstrWriterName,pbstrInstanceName,pUsage,pSource) (This)->lpVtbl->GetIdentityEx(This,pidInstance,pidWriter,pbstrWriterName,pbstrInstanceName,pUsage,pSource)
/*** IVssExamineWriterMetadataEx2 methods ***/
#define IVssExamineWriterMetadataEx2_GetVersion(This,pdwMajorVersion,pdwMinorVersion) (This)->lpVtbl->GetVersion(This,pdwMajorVersion,pdwMinorVersion)
#define IVssExamineWriterMetadataEx2_GetExcludeFromSnapshotCount(This,pcExcludedFromSnapshot) (This)->lpVtbl->GetExcludeFromSnapshotCount(This,pcExcludedFromSnapshot)
#define IVssExamineWriterMetadataEx2_GetExcludeFromSnapshotFile(This,iFile,ppFiledesc) (This)->lpVtbl->GetExcludeFromSnapshotFile(This,iFile,ppFiledesc)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx2_QueryInterface(IVssExamineWriterMetadataEx2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVssExamineWriterMetadataEx2_AddRef(IVssExamineWriterMetadataEx2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVssExamineWriterMetadataEx2_Release(IVssExamineWriterMetadataEx2* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssExamineWriterMetadata methods ***/
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx2_GetIdentity(IVssExamineWriterMetadataEx2* This,VSS_ID *pidInstance,VSS_ID *pidWriter,BSTR *pbstrWriterName,VSS_USAGE_TYPE *pUsage,VSS_SOURCE_TYPE *pSource) {
    return This->lpVtbl->GetIdentity(This,pidInstance,pidWriter,pbstrWriterName,pUsage,pSource);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx2_GetFileCounts(IVssExamineWriterMetadataEx2* This,UINT *pcIncludeFiles,UINT *pcExcludeFiles,UINT *pcComponents) {
    return This->lpVtbl->GetFileCounts(This,pcIncludeFiles,pcExcludeFiles,pcComponents);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx2_GetIncludeFile(IVssExamineWriterMetadataEx2* This,UINT iFile,IVssWMFiledesc **ppFiledesc) {
    return This->lpVtbl->GetIncludeFile(This,iFile,ppFiledesc);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx2_GetExcludeFile(IVssExamineWriterMetadataEx2* This,UINT iFile,IVssWMFiledesc **ppFiledesc) {
    return This->lpVtbl->GetExcludeFile(This,iFile,ppFiledesc);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx2_GetComponent(IVssExamineWriterMetadataEx2* This,UINT iComponent,IVssWMComponent **ppComponent) {
    return This->lpVtbl->GetComponent(This,iComponent,ppComponent);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx2_GetRestoreMethod(IVssExamineWriterMetadataEx2* This,VSS_RESTOREMETHOD_ENUM *pMethod,BSTR *pbstrService,BSTR *pbstrUserProcedure,VSS_WRITERRESTORE_ENUM *pwriterRestore,boolean *pbRebootRequired,UINT *pcMappings) {
    return This->lpVtbl->GetRestoreMethod(This,pMethod,pbstrService,pbstrUserProcedure,pwriterRestore,pbRebootRequired,pcMappings);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx2_GetAlternateLocationMapping(IVssExamineWriterMetadataEx2* This,UINT iMapping,IVssWMFiledesc **ppFiledesc) {
    return This->lpVtbl->GetAlternateLocationMapping(This,iMapping,ppFiledesc);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx2_GetBackupSchema(IVssExamineWriterMetadataEx2* This,DWORD *pdwSchemaMask) {
    return This->lpVtbl->GetBackupSchema(This,pdwSchemaMask);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx2_GetDocument(IVssExamineWriterMetadataEx2* This,IXMLDOMDocument **pDoc) {
    return This->lpVtbl->GetDocument(This,pDoc);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx2_SaveAsXML(IVssExamineWriterMetadataEx2* This,BSTR *pbstrXML) {
    return This->lpVtbl->SaveAsXML(This,pbstrXML);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx2_LoadFromXML(IVssExamineWriterMetadataEx2* This,BSTR bstrXML) {
    return This->lpVtbl->LoadFromXML(This,bstrXML);
}
/*** IVssExamineWriterMetadataEx methods ***/
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx2_GetIdentityEx(IVssExamineWriterMetadataEx2* This,VSS_ID *pidInstance,VSS_ID *pidWriter,BSTR *pbstrWriterName,BSTR *pbstrInstanceName,VSS_USAGE_TYPE *pUsage,VSS_SOURCE_TYPE *pSource) {
    return This->lpVtbl->GetIdentityEx(This,pidInstance,pidWriter,pbstrWriterName,pbstrInstanceName,pUsage,pSource);
}
/*** IVssExamineWriterMetadataEx2 methods ***/
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx2_GetVersion(IVssExamineWriterMetadataEx2* This,DWORD *pdwMajorVersion,DWORD *pdwMinorVersion) {
    return This->lpVtbl->GetVersion(This,pdwMajorVersion,pdwMinorVersion);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx2_GetExcludeFromSnapshotCount(IVssExamineWriterMetadataEx2* This,UINT *pcExcludedFromSnapshot) {
    return This->lpVtbl->GetExcludeFromSnapshotCount(This,pcExcludedFromSnapshot);
}
static __WIDL_INLINE HRESULT IVssExamineWriterMetadataEx2_GetExcludeFromSnapshotFile(IVssExamineWriterMetadataEx2* This,UINT iFile,IVssWMFiledesc **ppFiledesc) {
    return This->lpVtbl->GetExcludeFromSnapshotFile(This,iFile,ppFiledesc);
}
#endif
#endif

#endif


#endif  /* __IVssExamineWriterMetadataEx2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssWriterComponentsExt interface
 */
#ifndef __IVssWriterComponentsExt_INTERFACE_DEFINED__
#define __IVssWriterComponentsExt_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssWriterComponentsExt, 0x00000000, 0x0000, 0x0000, 0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00000000-0000-0000-0000-000000000000")
IVssWriterComponentsExt : public IVssWriterComponents
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssWriterComponentsExt, 0x00000000, 0x0000, 0x0000, 0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00)
#endif
#else
typedef struct IVssWriterComponentsExtVtbl {
    BEGIN_INTERFACE

    /*** IVssWriterComponents methods ***/
    HRESULT (STDMETHODCALLTYPE *GetComponentCount)(
        IVssWriterComponentsExt *This,
        UINT *pcComponents);

    HRESULT (STDMETHODCALLTYPE *GetWriterInfo)(
        IVssWriterComponentsExt *This,
        VSS_ID *pidInstance,
        VSS_ID *pidWriter);

    HRESULT (STDMETHODCALLTYPE *GetComponent)(
        IVssWriterComponentsExt *This,
        UINT iComponent,
        IVssComponent **ppComponent);

    END_INTERFACE
} IVssWriterComponentsExtVtbl;

interface IVssWriterComponentsExt {
    CONST_VTBL IVssWriterComponentsExtVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IVssWriterComponents methods ***/
#define IVssWriterComponentsExt_GetComponentCount(This,pcComponents) (This)->lpVtbl->GetComponentCount(This,pcComponents)
#define IVssWriterComponentsExt_GetWriterInfo(This,pidInstance,pidWriter) (This)->lpVtbl->GetWriterInfo(This,pidInstance,pidWriter)
#define IVssWriterComponentsExt_GetComponent(This,iComponent,ppComponent) (This)->lpVtbl->GetComponent(This,iComponent,ppComponent)
#else
/*** IVssWriterComponents methods ***/
static __WIDL_INLINE HRESULT IVssWriterComponentsExt_GetComponentCount(IVssWriterComponentsExt* This,UINT *pcComponents) {
    return This->lpVtbl->GetComponentCount(This,pcComponents);
}
static __WIDL_INLINE HRESULT IVssWriterComponentsExt_GetWriterInfo(IVssWriterComponentsExt* This,VSS_ID *pidInstance,VSS_ID *pidWriter) {
    return This->lpVtbl->GetWriterInfo(This,pidInstance,pidWriter);
}
static __WIDL_INLINE HRESULT IVssWriterComponentsExt_GetComponent(IVssWriterComponentsExt* This,UINT iComponent,IVssComponent **ppComponent) {
    return This->lpVtbl->GetComponent(This,iComponent,ppComponent);
}
#endif
#endif

#endif


#endif  /* __IVssWriterComponentsExt_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssBackupComponents interface
 */
#ifndef __IVssBackupComponents_INTERFACE_DEFINED__
#define __IVssBackupComponents_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssBackupComponents, 0x665c1d5f, 0xc218, 0x414d, 0xa0,0x5d, 0x7f,0xef,0x5f,0x9d,0x5c,0x86);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("665c1d5f-c218-414d-a05d-7fef5f9d5c86")
IVssBackupComponents : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetWriterComponentsCount(
        UINT *pcComponents) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetWriterComponents(
        UINT iWriter,
        IVssWriterComponentsExt **ppWriter) = 0;

    virtual HRESULT STDMETHODCALLTYPE InitializeForBackup(
        BSTR bstrXML = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBackupState(
        boolean bSelectComponents,
        boolean bBackupBootableSystemState,
        VSS_BACKUP_TYPE backupType,
        boolean bPartialFileSupport = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE InitializeForRestore(
        BSTR bstrXML) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRestoreState(
        VSS_RESTORE_TYPE restoreType) = 0;

    virtual HRESULT STDMETHODCALLTYPE GatherWriterMetadata(
        IVssAsync **pAsync) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetWriterMetadataCount(
        UINT *pcWriters) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetWriterMetadata(
        UINT iWriter,
        VSS_ID *pidInstance,
        IVssExamineWriterMetadata **ppMetadata) = 0;

    virtual HRESULT STDMETHODCALLTYPE FreeWriterMetadata(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddComponent(
        VSS_ID instanceId,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName) = 0;

    virtual HRESULT STDMETHODCALLTYPE PrepareForBackup(
        IVssAsync **ppAsync) = 0;

    virtual HRESULT STDMETHODCALLTYPE AbortBackup(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GatherWriterStatus(
        IVssAsync **pAsync) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetWriterStatusCount(
        UINT *pcWriters) = 0;

    virtual HRESULT STDMETHODCALLTYPE FreeWriterStatus(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetWriterStatus(
        UINT iWriter,
        VSS_ID *pidInstance,
        VSS_ID *pidWriter,
        BSTR *pbstrWriter,
        VSS_WRITER_STATE *pnStatus,
        HRESULT *phResultFailure) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBackupSucceeded(
        VSS_ID instanceId,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bSucceded) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBackupOptions(
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszBackupOptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSelectedForRestore(
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bSelectedForRestore) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRestoreOptions(
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszRestoreOptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAdditionalRestores(
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bAdditionalRestores) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPreviousBackupStamp(
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszPreviousBackupStamp) = 0;

    virtual HRESULT STDMETHODCALLTYPE SaveAsXML(
        BSTR *pbstrXML) = 0;

    virtual HRESULT STDMETHODCALLTYPE BackupComplete(
        IVssAsync **ppAsync) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddAlternativeLocationMapping(
        VSS_ID writerId,
        VSS_COMPONENT_TYPE componentType,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        boolean bRecursive,
        LPCWSTR wszDestination) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddRestoreSubcomponent(
        VSS_ID writerId,
        VSS_COMPONENT_TYPE componentType,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszSubComponentLogicalPath,
        LPCWSTR wszSubComponentName,
        boolean bRepair) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFileRestoreStatus(
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        VSS_FILE_RESTORE_STATUS status) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddNewTarget(
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszPath,
        LPCWSTR wszFileName,
        boolean bRecursive,
        LPCWSTR wszAlternatePath) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRangesFilePath(
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        UINT iPartialFile,
        LPCWSTR wszRangesFile) = 0;

    virtual HRESULT STDMETHODCALLTYPE PreRestore(
        IVssAsync **ppAsync) = 0;

    virtual HRESULT STDMETHODCALLTYPE PostRestore(
        IVssAsync **ppAsync) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetContext(
        LONG lContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE StartSnapshotSet(
        VSS_ID *pSnapshotSetId) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddToSnapshotSet(
        VSS_PWSZ pwszVolumeName,
        VSS_ID ProviderId,
        VSS_ID *pidSnapshot) = 0;

    virtual HRESULT STDMETHODCALLTYPE DoSnapshotSet(
        IVssAsync **ppAsync) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE ImportSnapshots(
        IVssAsync **ppAsync) = 0;

    virtual HRESULT STDMETHODCALLTYPE BreakSnapshotSet(
        VSS_ID SnapshotSetId) = 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 IsVolumeSupported(
        VSS_ID ProviderId,
        VSS_PWSZ pwszVolumeName,
        WINBOOL *pbSupportedByThisProvider) = 0;

    virtual HRESULT STDMETHODCALLTYPE DisableWriterClasses(
        const VSS_ID *rgWriterClassId,
        UINT cClassId) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnableWriterClasses(
        const VSS_ID *rgWriterClassId,
        UINT cClassId) = 0;

    virtual HRESULT STDMETHODCALLTYPE DisableWriterInstances(
        const VSS_ID *rgWriterInstanceId,
        UINT cInstanceId) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExposeSnapshot(
        VSS_ID SnapshotId,
        VSS_PWSZ wszPathFromRoot,
        LONG lAttributes,
        VSS_PWSZ wszExpose,
        VSS_PWSZ *pwszExposed) = 0;

    virtual HRESULT STDMETHODCALLTYPE RevertToSnapshot(
        VSS_ID SnapshotId,
        WINBOOL bForceDismount) = 0;

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

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssBackupComponents, 0x665c1d5f, 0xc218, 0x414d, 0xa0,0x5d, 0x7f,0xef,0x5f,0x9d,0x5c,0x86)
#endif
#else
typedef struct IVssBackupComponentsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVssBackupComponents methods ***/
    HRESULT (STDMETHODCALLTYPE *GetWriterComponentsCount)(
        IVssBackupComponents *This,
        UINT *pcComponents);

    HRESULT (STDMETHODCALLTYPE *GetWriterComponents)(
        IVssBackupComponents *This,
        UINT iWriter,
        IVssWriterComponentsExt **ppWriter);

    HRESULT (STDMETHODCALLTYPE *InitializeForBackup)(
        IVssBackupComponents *This,
        BSTR bstrXML);

    HRESULT (STDMETHODCALLTYPE *SetBackupState)(
        IVssBackupComponents *This,
        boolean bSelectComponents,
        boolean bBackupBootableSystemState,
        VSS_BACKUP_TYPE backupType,
        boolean bPartialFileSupport);

    HRESULT (STDMETHODCALLTYPE *InitializeForRestore)(
        IVssBackupComponents *This,
        BSTR bstrXML);

    HRESULT (STDMETHODCALLTYPE *SetRestoreState)(
        IVssBackupComponents *This,
        VSS_RESTORE_TYPE restoreType);

    HRESULT (STDMETHODCALLTYPE *GatherWriterMetadata)(
        IVssBackupComponents *This,
        IVssAsync **pAsync);

    HRESULT (STDMETHODCALLTYPE *GetWriterMetadataCount)(
        IVssBackupComponents *This,
        UINT *pcWriters);

    HRESULT (STDMETHODCALLTYPE *GetWriterMetadata)(
        IVssBackupComponents *This,
        UINT iWriter,
        VSS_ID *pidInstance,
        IVssExamineWriterMetadata **ppMetadata);

    HRESULT (STDMETHODCALLTYPE *FreeWriterMetadata)(
        IVssBackupComponents *This);

    HRESULT (STDMETHODCALLTYPE *AddComponent)(
        IVssBackupComponents *This,
        VSS_ID instanceId,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName);

    HRESULT (STDMETHODCALLTYPE *PrepareForBackup)(
        IVssBackupComponents *This,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *AbortBackup)(
        IVssBackupComponents *This);

    HRESULT (STDMETHODCALLTYPE *GatherWriterStatus)(
        IVssBackupComponents *This,
        IVssAsync **pAsync);

    HRESULT (STDMETHODCALLTYPE *GetWriterStatusCount)(
        IVssBackupComponents *This,
        UINT *pcWriters);

    HRESULT (STDMETHODCALLTYPE *FreeWriterStatus)(
        IVssBackupComponents *This);

    HRESULT (STDMETHODCALLTYPE *GetWriterStatus)(
        IVssBackupComponents *This,
        UINT iWriter,
        VSS_ID *pidInstance,
        VSS_ID *pidWriter,
        BSTR *pbstrWriter,
        VSS_WRITER_STATE *pnStatus,
        HRESULT *phResultFailure);

    HRESULT (STDMETHODCALLTYPE *SetBackupSucceeded)(
        IVssBackupComponents *This,
        VSS_ID instanceId,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bSucceded);

    HRESULT (STDMETHODCALLTYPE *SetBackupOptions)(
        IVssBackupComponents *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszBackupOptions);

    HRESULT (STDMETHODCALLTYPE *SetSelectedForRestore)(
        IVssBackupComponents *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bSelectedForRestore);

    HRESULT (STDMETHODCALLTYPE *SetRestoreOptions)(
        IVssBackupComponents *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszRestoreOptions);

    HRESULT (STDMETHODCALLTYPE *SetAdditionalRestores)(
        IVssBackupComponents *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bAdditionalRestores);

    HRESULT (STDMETHODCALLTYPE *SetPreviousBackupStamp)(
        IVssBackupComponents *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszPreviousBackupStamp);

    HRESULT (STDMETHODCALLTYPE *SaveAsXML)(
        IVssBackupComponents *This,
        BSTR *pbstrXML);

    HRESULT (STDMETHODCALLTYPE *BackupComplete)(
        IVssBackupComponents *This,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *AddAlternativeLocationMapping)(
        IVssBackupComponents *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE componentType,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        boolean bRecursive,
        LPCWSTR wszDestination);

    HRESULT (STDMETHODCALLTYPE *AddRestoreSubcomponent)(
        IVssBackupComponents *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE componentType,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszSubComponentLogicalPath,
        LPCWSTR wszSubComponentName,
        boolean bRepair);

    HRESULT (STDMETHODCALLTYPE *SetFileRestoreStatus)(
        IVssBackupComponents *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        VSS_FILE_RESTORE_STATUS status);

    HRESULT (STDMETHODCALLTYPE *AddNewTarget)(
        IVssBackupComponents *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszPath,
        LPCWSTR wszFileName,
        boolean bRecursive,
        LPCWSTR wszAlternatePath);

    HRESULT (STDMETHODCALLTYPE *SetRangesFilePath)(
        IVssBackupComponents *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        UINT iPartialFile,
        LPCWSTR wszRangesFile);

    HRESULT (STDMETHODCALLTYPE *PreRestore)(
        IVssBackupComponents *This,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *PostRestore)(
        IVssBackupComponents *This,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *SetContext)(
        IVssBackupComponents *This,
        LONG lContext);

    HRESULT (STDMETHODCALLTYPE *StartSnapshotSet)(
        IVssBackupComponents *This,
        VSS_ID *pSnapshotSetId);

    HRESULT (STDMETHODCALLTYPE *AddToSnapshotSet)(
        IVssBackupComponents *This,
        VSS_PWSZ pwszVolumeName,
        VSS_ID ProviderId,
        VSS_ID *pidSnapshot);

    HRESULT (STDMETHODCALLTYPE *DoSnapshotSet)(
        IVssBackupComponents *This,
        IVssAsync **ppAsync);

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

    HRESULT (STDMETHODCALLTYPE *ImportSnapshots)(
        IVssBackupComponents *This,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *BreakSnapshotSet)(
        IVssBackupComponents *This,
        VSS_ID SnapshotSetId);

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

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

    HRESULT (STDMETHODCALLTYPE *IsVolumeSupported)(
        IVssBackupComponents *This,
        VSS_ID ProviderId,
        VSS_PWSZ pwszVolumeName,
        WINBOOL *pbSupportedByThisProvider);

    HRESULT (STDMETHODCALLTYPE *DisableWriterClasses)(
        IVssBackupComponents *This,
        const VSS_ID *rgWriterClassId,
        UINT cClassId);

    HRESULT (STDMETHODCALLTYPE *EnableWriterClasses)(
        IVssBackupComponents *This,
        const VSS_ID *rgWriterClassId,
        UINT cClassId);

    HRESULT (STDMETHODCALLTYPE *DisableWriterInstances)(
        IVssBackupComponents *This,
        const VSS_ID *rgWriterInstanceId,
        UINT cInstanceId);

    HRESULT (STDMETHODCALLTYPE *ExposeSnapshot)(
        IVssBackupComponents *This,
        VSS_ID SnapshotId,
        VSS_PWSZ wszPathFromRoot,
        LONG lAttributes,
        VSS_PWSZ wszExpose,
        VSS_PWSZ *pwszExposed);

    HRESULT (STDMETHODCALLTYPE *RevertToSnapshot)(
        IVssBackupComponents *This,
        VSS_ID SnapshotId,
        WINBOOL bForceDismount);

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

    END_INTERFACE
} IVssBackupComponentsVtbl;

interface IVssBackupComponents {
    CONST_VTBL IVssBackupComponentsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssBackupComponents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssBackupComponents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssBackupComponents_Release(This) (This)->lpVtbl->Release(This)
/*** IVssBackupComponents methods ***/
#define IVssBackupComponents_GetWriterComponentsCount(This,pcComponents) (This)->lpVtbl->GetWriterComponentsCount(This,pcComponents)
#define IVssBackupComponents_GetWriterComponents(This,iWriter,ppWriter) (This)->lpVtbl->GetWriterComponents(This,iWriter,ppWriter)
#define IVssBackupComponents_InitializeForBackup(This,bstrXML) (This)->lpVtbl->InitializeForBackup(This,bstrXML)
#define IVssBackupComponents_SetBackupState(This,bSelectComponents,bBackupBootableSystemState,backupType,bPartialFileSupport) (This)->lpVtbl->SetBackupState(This,bSelectComponents,bBackupBootableSystemState,backupType,bPartialFileSupport)
#define IVssBackupComponents_InitializeForRestore(This,bstrXML) (This)->lpVtbl->InitializeForRestore(This,bstrXML)
#define IVssBackupComponents_SetRestoreState(This,restoreType) (This)->lpVtbl->SetRestoreState(This,restoreType)
#define IVssBackupComponents_GatherWriterMetadata(This,pAsync) (This)->lpVtbl->GatherWriterMetadata(This,pAsync)
#define IVssBackupComponents_GetWriterMetadataCount(This,pcWriters) (This)->lpVtbl->GetWriterMetadataCount(This,pcWriters)
#define IVssBackupComponents_GetWriterMetadata(This,iWriter,pidInstance,ppMetadata) (This)->lpVtbl->GetWriterMetadata(This,iWriter,pidInstance,ppMetadata)
#define IVssBackupComponents_FreeWriterMetadata(This) (This)->lpVtbl->FreeWriterMetadata(This)
#define IVssBackupComponents_AddComponent(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName) (This)->lpVtbl->AddComponent(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName)
#define IVssBackupComponents_PrepareForBackup(This,ppAsync) (This)->lpVtbl->PrepareForBackup(This,ppAsync)
#define IVssBackupComponents_AbortBackup(This) (This)->lpVtbl->AbortBackup(This)
#define IVssBackupComponents_GatherWriterStatus(This,pAsync) (This)->lpVtbl->GatherWriterStatus(This,pAsync)
#define IVssBackupComponents_GetWriterStatusCount(This,pcWriters) (This)->lpVtbl->GetWriterStatusCount(This,pcWriters)
#define IVssBackupComponents_FreeWriterStatus(This) (This)->lpVtbl->FreeWriterStatus(This)
#define IVssBackupComponents_GetWriterStatus(This,iWriter,pidInstance,pidWriter,pbstrWriter,pnStatus,phResultFailure) (This)->lpVtbl->GetWriterStatus(This,iWriter,pidInstance,pidWriter,pbstrWriter,pnStatus,phResultFailure)
#define IVssBackupComponents_SetBackupSucceeded(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName,bSucceded) (This)->lpVtbl->SetBackupSucceeded(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName,bSucceded)
#define IVssBackupComponents_SetBackupOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszBackupOptions) (This)->lpVtbl->SetBackupOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszBackupOptions)
#define IVssBackupComponents_SetSelectedForRestore(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore) (This)->lpVtbl->SetSelectedForRestore(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore)
#define IVssBackupComponents_SetRestoreOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszRestoreOptions) (This)->lpVtbl->SetRestoreOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszRestoreOptions)
#define IVssBackupComponents_SetAdditionalRestores(This,writerId,ct,wszLogicalPath,wszComponentName,bAdditionalRestores) (This)->lpVtbl->SetAdditionalRestores(This,writerId,ct,wszLogicalPath,wszComponentName,bAdditionalRestores)
#define IVssBackupComponents_SetPreviousBackupStamp(This,writerId,ct,wszLogicalPath,wszComponentName,wszPreviousBackupStamp) (This)->lpVtbl->SetPreviousBackupStamp(This,writerId,ct,wszLogicalPath,wszComponentName,wszPreviousBackupStamp)
#define IVssBackupComponents_SaveAsXML(This,pbstrXML) (This)->lpVtbl->SaveAsXML(This,pbstrXML)
#define IVssBackupComponents_BackupComplete(This,ppAsync) (This)->lpVtbl->BackupComplete(This,ppAsync)
#define IVssBackupComponents_AddAlternativeLocationMapping(This,writerId,componentType,wszLogicalPath,wszComponentName,wszPath,wszFilespec,bRecursive,wszDestination) (This)->lpVtbl->AddAlternativeLocationMapping(This,writerId,componentType,wszLogicalPath,wszComponentName,wszPath,wszFilespec,bRecursive,wszDestination)
#define IVssBackupComponents_AddRestoreSubcomponent(This,writerId,componentType,wszLogicalPath,wszComponentName,wszSubComponentLogicalPath,wszSubComponentName,bRepair) (This)->lpVtbl->AddRestoreSubcomponent(This,writerId,componentType,wszLogicalPath,wszComponentName,wszSubComponentLogicalPath,wszSubComponentName,bRepair)
#define IVssBackupComponents_SetFileRestoreStatus(This,writerId,ct,wszLogicalPath,wszComponentName,status) (This)->lpVtbl->SetFileRestoreStatus(This,writerId,ct,wszLogicalPath,wszComponentName,status)
#define IVssBackupComponents_AddNewTarget(This,writerId,ct,wszLogicalPath,wszComponentName,wszPath,wszFileName,bRecursive,wszAlternatePath) (This)->lpVtbl->AddNewTarget(This,writerId,ct,wszLogicalPath,wszComponentName,wszPath,wszFileName,bRecursive,wszAlternatePath)
#define IVssBackupComponents_SetRangesFilePath(This,writerId,ct,wszLogicalPath,wszComponentName,iPartialFile,wszRangesFile) (This)->lpVtbl->SetRangesFilePath(This,writerId,ct,wszLogicalPath,wszComponentName,iPartialFile,wszRangesFile)
#define IVssBackupComponents_PreRestore(This,ppAsync) (This)->lpVtbl->PreRestore(This,ppAsync)
#define IVssBackupComponents_PostRestore(This,ppAsync) (This)->lpVtbl->PostRestore(This,ppAsync)
#define IVssBackupComponents_SetContext(This,lContext) (This)->lpVtbl->SetContext(This,lContext)
#define IVssBackupComponents_StartSnapshotSet(This,pSnapshotSetId) (This)->lpVtbl->StartSnapshotSet(This,pSnapshotSetId)
#define IVssBackupComponents_AddToSnapshotSet(This,pwszVolumeName,ProviderId,pidSnapshot) (This)->lpVtbl->AddToSnapshotSet(This,pwszVolumeName,ProviderId,pidSnapshot)
#define IVssBackupComponents_DoSnapshotSet(This,ppAsync) (This)->lpVtbl->DoSnapshotSet(This,ppAsync)
#define IVssBackupComponents_DeleteSnapshots(This,SourceObjectId,eSourceObjectType,bForceDelete,plDeletedSnapshots,pNondeletedSnapshotID) (This)->lpVtbl->DeleteSnapshots(This,SourceObjectId,eSourceObjectType,bForceDelete,plDeletedSnapshots,pNondeletedSnapshotID)
#define IVssBackupComponents_ImportSnapshots(This,ppAsync) (This)->lpVtbl->ImportSnapshots(This,ppAsync)
#define IVssBackupComponents_BreakSnapshotSet(This,SnapshotSetId) (This)->lpVtbl->BreakSnapshotSet(This,SnapshotSetId)
#define IVssBackupComponents_GetSnapshotProperties(This,SnapshotId,pProp) (This)->lpVtbl->GetSnapshotProperties(This,SnapshotId,pProp)
#define IVssBackupComponents_Query(This,QueriedObjectId,eQueriedObjectType,eReturnedObjectsType,ppEnum) (This)->lpVtbl->Query(This,QueriedObjectId,eQueriedObjectType,eReturnedObjectsType,ppEnum)
#define IVssBackupComponents_IsVolumeSupported(This,ProviderId,pwszVolumeName,pbSupportedByThisProvider) (This)->lpVtbl->IsVolumeSupported(This,ProviderId,pwszVolumeName,pbSupportedByThisProvider)
#define IVssBackupComponents_DisableWriterClasses(This,rgWriterClassId,cClassId) (This)->lpVtbl->DisableWriterClasses(This,rgWriterClassId,cClassId)
#define IVssBackupComponents_EnableWriterClasses(This,rgWriterClassId,cClassId) (This)->lpVtbl->EnableWriterClasses(This,rgWriterClassId,cClassId)
#define IVssBackupComponents_DisableWriterInstances(This,rgWriterInstanceId,cInstanceId) (This)->lpVtbl->DisableWriterInstances(This,rgWriterInstanceId,cInstanceId)
#define IVssBackupComponents_ExposeSnapshot(This,SnapshotId,wszPathFromRoot,lAttributes,wszExpose,pwszExposed) (This)->lpVtbl->ExposeSnapshot(This,SnapshotId,wszPathFromRoot,lAttributes,wszExpose,pwszExposed)
#define IVssBackupComponents_RevertToSnapshot(This,SnapshotId,bForceDismount) (This)->lpVtbl->RevertToSnapshot(This,SnapshotId,bForceDismount)
#define IVssBackupComponents_QueryRevertStatus(This,pwszVolume,ppAsync) (This)->lpVtbl->QueryRevertStatus(This,pwszVolume,ppAsync)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVssBackupComponents_QueryInterface(IVssBackupComponents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVssBackupComponents_AddRef(IVssBackupComponents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVssBackupComponents_Release(IVssBackupComponents* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssBackupComponents methods ***/
static __WIDL_INLINE HRESULT IVssBackupComponents_GetWriterComponentsCount(IVssBackupComponents* This,UINT *pcComponents) {
    return This->lpVtbl->GetWriterComponentsCount(This,pcComponents);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_GetWriterComponents(IVssBackupComponents* This,UINT iWriter,IVssWriterComponentsExt **ppWriter) {
    return This->lpVtbl->GetWriterComponents(This,iWriter,ppWriter);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_InitializeForBackup(IVssBackupComponents* This,BSTR bstrXML) {
    return This->lpVtbl->InitializeForBackup(This,bstrXML);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_SetBackupState(IVssBackupComponents* This,boolean bSelectComponents,boolean bBackupBootableSystemState,VSS_BACKUP_TYPE backupType,boolean bPartialFileSupport) {
    return This->lpVtbl->SetBackupState(This,bSelectComponents,bBackupBootableSystemState,backupType,bPartialFileSupport);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_InitializeForRestore(IVssBackupComponents* This,BSTR bstrXML) {
    return This->lpVtbl->InitializeForRestore(This,bstrXML);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_SetRestoreState(IVssBackupComponents* This,VSS_RESTORE_TYPE restoreType) {
    return This->lpVtbl->SetRestoreState(This,restoreType);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_GatherWriterMetadata(IVssBackupComponents* This,IVssAsync **pAsync) {
    return This->lpVtbl->GatherWriterMetadata(This,pAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_GetWriterMetadataCount(IVssBackupComponents* This,UINT *pcWriters) {
    return This->lpVtbl->GetWriterMetadataCount(This,pcWriters);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_GetWriterMetadata(IVssBackupComponents* This,UINT iWriter,VSS_ID *pidInstance,IVssExamineWriterMetadata **ppMetadata) {
    return This->lpVtbl->GetWriterMetadata(This,iWriter,pidInstance,ppMetadata);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_FreeWriterMetadata(IVssBackupComponents* This) {
    return This->lpVtbl->FreeWriterMetadata(This);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_AddComponent(IVssBackupComponents* This,VSS_ID instanceId,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName) {
    return This->lpVtbl->AddComponent(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_PrepareForBackup(IVssBackupComponents* This,IVssAsync **ppAsync) {
    return This->lpVtbl->PrepareForBackup(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_AbortBackup(IVssBackupComponents* This) {
    return This->lpVtbl->AbortBackup(This);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_GatherWriterStatus(IVssBackupComponents* This,IVssAsync **pAsync) {
    return This->lpVtbl->GatherWriterStatus(This,pAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_GetWriterStatusCount(IVssBackupComponents* This,UINT *pcWriters) {
    return This->lpVtbl->GetWriterStatusCount(This,pcWriters);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_FreeWriterStatus(IVssBackupComponents* This) {
    return This->lpVtbl->FreeWriterStatus(This);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_GetWriterStatus(IVssBackupComponents* This,UINT iWriter,VSS_ID *pidInstance,VSS_ID *pidWriter,BSTR *pbstrWriter,VSS_WRITER_STATE *pnStatus,HRESULT *phResultFailure) {
    return This->lpVtbl->GetWriterStatus(This,iWriter,pidInstance,pidWriter,pbstrWriter,pnStatus,phResultFailure);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_SetBackupSucceeded(IVssBackupComponents* This,VSS_ID instanceId,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,boolean bSucceded) {
    return This->lpVtbl->SetBackupSucceeded(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName,bSucceded);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_SetBackupOptions(IVssBackupComponents* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszBackupOptions) {
    return This->lpVtbl->SetBackupOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszBackupOptions);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_SetSelectedForRestore(IVssBackupComponents* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,boolean bSelectedForRestore) {
    return This->lpVtbl->SetSelectedForRestore(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_SetRestoreOptions(IVssBackupComponents* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszRestoreOptions) {
    return This->lpVtbl->SetRestoreOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszRestoreOptions);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_SetAdditionalRestores(IVssBackupComponents* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,boolean bAdditionalRestores) {
    return This->lpVtbl->SetAdditionalRestores(This,writerId,ct,wszLogicalPath,wszComponentName,bAdditionalRestores);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_SetPreviousBackupStamp(IVssBackupComponents* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszPreviousBackupStamp) {
    return This->lpVtbl->SetPreviousBackupStamp(This,writerId,ct,wszLogicalPath,wszComponentName,wszPreviousBackupStamp);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_SaveAsXML(IVssBackupComponents* This,BSTR *pbstrXML) {
    return This->lpVtbl->SaveAsXML(This,pbstrXML);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_BackupComplete(IVssBackupComponents* This,IVssAsync **ppAsync) {
    return This->lpVtbl->BackupComplete(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_AddAlternativeLocationMapping(IVssBackupComponents* This,VSS_ID writerId,VSS_COMPONENT_TYPE componentType,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszPath,LPCWSTR wszFilespec,boolean bRecursive,LPCWSTR wszDestination) {
    return This->lpVtbl->AddAlternativeLocationMapping(This,writerId,componentType,wszLogicalPath,wszComponentName,wszPath,wszFilespec,bRecursive,wszDestination);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_AddRestoreSubcomponent(IVssBackupComponents* This,VSS_ID writerId,VSS_COMPONENT_TYPE componentType,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszSubComponentLogicalPath,LPCWSTR wszSubComponentName,boolean bRepair) {
    return This->lpVtbl->AddRestoreSubcomponent(This,writerId,componentType,wszLogicalPath,wszComponentName,wszSubComponentLogicalPath,wszSubComponentName,bRepair);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_SetFileRestoreStatus(IVssBackupComponents* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,VSS_FILE_RESTORE_STATUS status) {
    return This->lpVtbl->SetFileRestoreStatus(This,writerId,ct,wszLogicalPath,wszComponentName,status);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_AddNewTarget(IVssBackupComponents* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszPath,LPCWSTR wszFileName,boolean bRecursive,LPCWSTR wszAlternatePath) {
    return This->lpVtbl->AddNewTarget(This,writerId,ct,wszLogicalPath,wszComponentName,wszPath,wszFileName,bRecursive,wszAlternatePath);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_SetRangesFilePath(IVssBackupComponents* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,UINT iPartialFile,LPCWSTR wszRangesFile) {
    return This->lpVtbl->SetRangesFilePath(This,writerId,ct,wszLogicalPath,wszComponentName,iPartialFile,wszRangesFile);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_PreRestore(IVssBackupComponents* This,IVssAsync **ppAsync) {
    return This->lpVtbl->PreRestore(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_PostRestore(IVssBackupComponents* This,IVssAsync **ppAsync) {
    return This->lpVtbl->PostRestore(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_SetContext(IVssBackupComponents* This,LONG lContext) {
    return This->lpVtbl->SetContext(This,lContext);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_StartSnapshotSet(IVssBackupComponents* This,VSS_ID *pSnapshotSetId) {
    return This->lpVtbl->StartSnapshotSet(This,pSnapshotSetId);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_AddToSnapshotSet(IVssBackupComponents* This,VSS_PWSZ pwszVolumeName,VSS_ID ProviderId,VSS_ID *pidSnapshot) {
    return This->lpVtbl->AddToSnapshotSet(This,pwszVolumeName,ProviderId,pidSnapshot);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_DoSnapshotSet(IVssBackupComponents* This,IVssAsync **ppAsync) {
    return This->lpVtbl->DoSnapshotSet(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_DeleteSnapshots(IVssBackupComponents* 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 IVssBackupComponents_ImportSnapshots(IVssBackupComponents* This,IVssAsync **ppAsync) {
    return This->lpVtbl->ImportSnapshots(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_BreakSnapshotSet(IVssBackupComponents* This,VSS_ID SnapshotSetId) {
    return This->lpVtbl->BreakSnapshotSet(This,SnapshotSetId);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_GetSnapshotProperties(IVssBackupComponents* This,VSS_ID SnapshotId,VSS_SNAPSHOT_PROP *pProp) {
    return This->lpVtbl->GetSnapshotProperties(This,SnapshotId,pProp);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_Query(IVssBackupComponents* 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 IVssBackupComponents_IsVolumeSupported(IVssBackupComponents* This,VSS_ID ProviderId,VSS_PWSZ pwszVolumeName,WINBOOL *pbSupportedByThisProvider) {
    return This->lpVtbl->IsVolumeSupported(This,ProviderId,pwszVolumeName,pbSupportedByThisProvider);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_DisableWriterClasses(IVssBackupComponents* This,const VSS_ID *rgWriterClassId,UINT cClassId) {
    return This->lpVtbl->DisableWriterClasses(This,rgWriterClassId,cClassId);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_EnableWriterClasses(IVssBackupComponents* This,const VSS_ID *rgWriterClassId,UINT cClassId) {
    return This->lpVtbl->EnableWriterClasses(This,rgWriterClassId,cClassId);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_DisableWriterInstances(IVssBackupComponents* This,const VSS_ID *rgWriterInstanceId,UINT cInstanceId) {
    return This->lpVtbl->DisableWriterInstances(This,rgWriterInstanceId,cInstanceId);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_ExposeSnapshot(IVssBackupComponents* This,VSS_ID SnapshotId,VSS_PWSZ wszPathFromRoot,LONG lAttributes,VSS_PWSZ wszExpose,VSS_PWSZ *pwszExposed) {
    return This->lpVtbl->ExposeSnapshot(This,SnapshotId,wszPathFromRoot,lAttributes,wszExpose,pwszExposed);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_RevertToSnapshot(IVssBackupComponents* This,VSS_ID SnapshotId,WINBOOL bForceDismount) {
    return This->lpVtbl->RevertToSnapshot(This,SnapshotId,bForceDismount);
}
static __WIDL_INLINE HRESULT IVssBackupComponents_QueryRevertStatus(IVssBackupComponents* This,VSS_PWSZ pwszVolume,IVssAsync **ppAsync) {
    return This->lpVtbl->QueryRevertStatus(This,pwszVolume,ppAsync);
}
#endif
#endif

#endif


#endif  /* __IVssBackupComponents_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssBackupComponentsEx interface
 */
#ifndef __IVssBackupComponentsEx_INTERFACE_DEFINED__
#define __IVssBackupComponentsEx_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssBackupComponentsEx, 0x963f03ad, 0x9e4c, 0x4a34, 0xac,0x15, 0xe4,0xb6,0x17,0x4e,0x50,0x36);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("963f03ad-9e4c-4a34-ac15-e4b6174e5036")
IVssBackupComponentsEx : public IVssBackupComponents
{
    virtual HRESULT STDMETHODCALLTYPE GetWriterMetadataEx(
        UINT iWriter,
        VSS_ID *pidInstance,
        IVssExamineWriterMetadataEx **ppMetadata) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSelectedForRestoreEx(
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bSelectedForRestore,
        VSS_ID instanceId) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssBackupComponentsEx, 0x963f03ad, 0x9e4c, 0x4a34, 0xac,0x15, 0xe4,0xb6,0x17,0x4e,0x50,0x36)
#endif
#else
typedef struct IVssBackupComponentsExVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVssBackupComponents methods ***/
    HRESULT (STDMETHODCALLTYPE *GetWriterComponentsCount)(
        IVssBackupComponentsEx *This,
        UINT *pcComponents);

    HRESULT (STDMETHODCALLTYPE *GetWriterComponents)(
        IVssBackupComponentsEx *This,
        UINT iWriter,
        IVssWriterComponentsExt **ppWriter);

    HRESULT (STDMETHODCALLTYPE *InitializeForBackup)(
        IVssBackupComponentsEx *This,
        BSTR bstrXML);

    HRESULT (STDMETHODCALLTYPE *SetBackupState)(
        IVssBackupComponentsEx *This,
        boolean bSelectComponents,
        boolean bBackupBootableSystemState,
        VSS_BACKUP_TYPE backupType,
        boolean bPartialFileSupport);

    HRESULT (STDMETHODCALLTYPE *InitializeForRestore)(
        IVssBackupComponentsEx *This,
        BSTR bstrXML);

    HRESULT (STDMETHODCALLTYPE *SetRestoreState)(
        IVssBackupComponentsEx *This,
        VSS_RESTORE_TYPE restoreType);

    HRESULT (STDMETHODCALLTYPE *GatherWriterMetadata)(
        IVssBackupComponentsEx *This,
        IVssAsync **pAsync);

    HRESULT (STDMETHODCALLTYPE *GetWriterMetadataCount)(
        IVssBackupComponentsEx *This,
        UINT *pcWriters);

    HRESULT (STDMETHODCALLTYPE *GetWriterMetadata)(
        IVssBackupComponentsEx *This,
        UINT iWriter,
        VSS_ID *pidInstance,
        IVssExamineWriterMetadata **ppMetadata);

    HRESULT (STDMETHODCALLTYPE *FreeWriterMetadata)(
        IVssBackupComponentsEx *This);

    HRESULT (STDMETHODCALLTYPE *AddComponent)(
        IVssBackupComponentsEx *This,
        VSS_ID instanceId,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName);

    HRESULT (STDMETHODCALLTYPE *PrepareForBackup)(
        IVssBackupComponentsEx *This,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *AbortBackup)(
        IVssBackupComponentsEx *This);

    HRESULT (STDMETHODCALLTYPE *GatherWriterStatus)(
        IVssBackupComponentsEx *This,
        IVssAsync **pAsync);

    HRESULT (STDMETHODCALLTYPE *GetWriterStatusCount)(
        IVssBackupComponentsEx *This,
        UINT *pcWriters);

    HRESULT (STDMETHODCALLTYPE *FreeWriterStatus)(
        IVssBackupComponentsEx *This);

    HRESULT (STDMETHODCALLTYPE *GetWriterStatus)(
        IVssBackupComponentsEx *This,
        UINT iWriter,
        VSS_ID *pidInstance,
        VSS_ID *pidWriter,
        BSTR *pbstrWriter,
        VSS_WRITER_STATE *pnStatus,
        HRESULT *phResultFailure);

    HRESULT (STDMETHODCALLTYPE *SetBackupSucceeded)(
        IVssBackupComponentsEx *This,
        VSS_ID instanceId,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bSucceded);

    HRESULT (STDMETHODCALLTYPE *SetBackupOptions)(
        IVssBackupComponentsEx *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszBackupOptions);

    HRESULT (STDMETHODCALLTYPE *SetSelectedForRestore)(
        IVssBackupComponentsEx *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bSelectedForRestore);

    HRESULT (STDMETHODCALLTYPE *SetRestoreOptions)(
        IVssBackupComponentsEx *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszRestoreOptions);

    HRESULT (STDMETHODCALLTYPE *SetAdditionalRestores)(
        IVssBackupComponentsEx *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bAdditionalRestores);

    HRESULT (STDMETHODCALLTYPE *SetPreviousBackupStamp)(
        IVssBackupComponentsEx *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszPreviousBackupStamp);

    HRESULT (STDMETHODCALLTYPE *SaveAsXML)(
        IVssBackupComponentsEx *This,
        BSTR *pbstrXML);

    HRESULT (STDMETHODCALLTYPE *BackupComplete)(
        IVssBackupComponentsEx *This,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *AddAlternativeLocationMapping)(
        IVssBackupComponentsEx *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE componentType,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        boolean bRecursive,
        LPCWSTR wszDestination);

    HRESULT (STDMETHODCALLTYPE *AddRestoreSubcomponent)(
        IVssBackupComponentsEx *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE componentType,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszSubComponentLogicalPath,
        LPCWSTR wszSubComponentName,
        boolean bRepair);

    HRESULT (STDMETHODCALLTYPE *SetFileRestoreStatus)(
        IVssBackupComponentsEx *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        VSS_FILE_RESTORE_STATUS status);

    HRESULT (STDMETHODCALLTYPE *AddNewTarget)(
        IVssBackupComponentsEx *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszPath,
        LPCWSTR wszFileName,
        boolean bRecursive,
        LPCWSTR wszAlternatePath);

    HRESULT (STDMETHODCALLTYPE *SetRangesFilePath)(
        IVssBackupComponentsEx *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        UINT iPartialFile,
        LPCWSTR wszRangesFile);

    HRESULT (STDMETHODCALLTYPE *PreRestore)(
        IVssBackupComponentsEx *This,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *PostRestore)(
        IVssBackupComponentsEx *This,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *SetContext)(
        IVssBackupComponentsEx *This,
        LONG lContext);

    HRESULT (STDMETHODCALLTYPE *StartSnapshotSet)(
        IVssBackupComponentsEx *This,
        VSS_ID *pSnapshotSetId);

    HRESULT (STDMETHODCALLTYPE *AddToSnapshotSet)(
        IVssBackupComponentsEx *This,
        VSS_PWSZ pwszVolumeName,
        VSS_ID ProviderId,
        VSS_ID *pidSnapshot);

    HRESULT (STDMETHODCALLTYPE *DoSnapshotSet)(
        IVssBackupComponentsEx *This,
        IVssAsync **ppAsync);

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

    HRESULT (STDMETHODCALLTYPE *ImportSnapshots)(
        IVssBackupComponentsEx *This,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *BreakSnapshotSet)(
        IVssBackupComponentsEx *This,
        VSS_ID SnapshotSetId);

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

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

    HRESULT (STDMETHODCALLTYPE *IsVolumeSupported)(
        IVssBackupComponentsEx *This,
        VSS_ID ProviderId,
        VSS_PWSZ pwszVolumeName,
        WINBOOL *pbSupportedByThisProvider);

    HRESULT (STDMETHODCALLTYPE *DisableWriterClasses)(
        IVssBackupComponentsEx *This,
        const VSS_ID *rgWriterClassId,
        UINT cClassId);

    HRESULT (STDMETHODCALLTYPE *EnableWriterClasses)(
        IVssBackupComponentsEx *This,
        const VSS_ID *rgWriterClassId,
        UINT cClassId);

    HRESULT (STDMETHODCALLTYPE *DisableWriterInstances)(
        IVssBackupComponentsEx *This,
        const VSS_ID *rgWriterInstanceId,
        UINT cInstanceId);

    HRESULT (STDMETHODCALLTYPE *ExposeSnapshot)(
        IVssBackupComponentsEx *This,
        VSS_ID SnapshotId,
        VSS_PWSZ wszPathFromRoot,
        LONG lAttributes,
        VSS_PWSZ wszExpose,
        VSS_PWSZ *pwszExposed);

    HRESULT (STDMETHODCALLTYPE *RevertToSnapshot)(
        IVssBackupComponentsEx *This,
        VSS_ID SnapshotId,
        WINBOOL bForceDismount);

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

    /*** IVssBackupComponentsEx methods ***/
    HRESULT (STDMETHODCALLTYPE *GetWriterMetadataEx)(
        IVssBackupComponentsEx *This,
        UINT iWriter,
        VSS_ID *pidInstance,
        IVssExamineWriterMetadataEx **ppMetadata);

    HRESULT (STDMETHODCALLTYPE *SetSelectedForRestoreEx)(
        IVssBackupComponentsEx *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bSelectedForRestore,
        VSS_ID instanceId);

    END_INTERFACE
} IVssBackupComponentsExVtbl;

interface IVssBackupComponentsEx {
    CONST_VTBL IVssBackupComponentsExVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssBackupComponentsEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssBackupComponentsEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssBackupComponentsEx_Release(This) (This)->lpVtbl->Release(This)
/*** IVssBackupComponents methods ***/
#define IVssBackupComponentsEx_GetWriterComponentsCount(This,pcComponents) (This)->lpVtbl->GetWriterComponentsCount(This,pcComponents)
#define IVssBackupComponentsEx_GetWriterComponents(This,iWriter,ppWriter) (This)->lpVtbl->GetWriterComponents(This,iWriter,ppWriter)
#define IVssBackupComponentsEx_InitializeForBackup(This,bstrXML) (This)->lpVtbl->InitializeForBackup(This,bstrXML)
#define IVssBackupComponentsEx_SetBackupState(This,bSelectComponents,bBackupBootableSystemState,backupType,bPartialFileSupport) (This)->lpVtbl->SetBackupState(This,bSelectComponents,bBackupBootableSystemState,backupType,bPartialFileSupport)
#define IVssBackupComponentsEx_InitializeForRestore(This,bstrXML) (This)->lpVtbl->InitializeForRestore(This,bstrXML)
#define IVssBackupComponentsEx_SetRestoreState(This,restoreType) (This)->lpVtbl->SetRestoreState(This,restoreType)
#define IVssBackupComponentsEx_GatherWriterMetadata(This,pAsync) (This)->lpVtbl->GatherWriterMetadata(This,pAsync)
#define IVssBackupComponentsEx_GetWriterMetadataCount(This,pcWriters) (This)->lpVtbl->GetWriterMetadataCount(This,pcWriters)
#define IVssBackupComponentsEx_GetWriterMetadata(This,iWriter,pidInstance,ppMetadata) (This)->lpVtbl->GetWriterMetadata(This,iWriter,pidInstance,ppMetadata)
#define IVssBackupComponentsEx_FreeWriterMetadata(This) (This)->lpVtbl->FreeWriterMetadata(This)
#define IVssBackupComponentsEx_AddComponent(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName) (This)->lpVtbl->AddComponent(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName)
#define IVssBackupComponentsEx_PrepareForBackup(This,ppAsync) (This)->lpVtbl->PrepareForBackup(This,ppAsync)
#define IVssBackupComponentsEx_AbortBackup(This) (This)->lpVtbl->AbortBackup(This)
#define IVssBackupComponentsEx_GatherWriterStatus(This,pAsync) (This)->lpVtbl->GatherWriterStatus(This,pAsync)
#define IVssBackupComponentsEx_GetWriterStatusCount(This,pcWriters) (This)->lpVtbl->GetWriterStatusCount(This,pcWriters)
#define IVssBackupComponentsEx_FreeWriterStatus(This) (This)->lpVtbl->FreeWriterStatus(This)
#define IVssBackupComponentsEx_GetWriterStatus(This,iWriter,pidInstance,pidWriter,pbstrWriter,pnStatus,phResultFailure) (This)->lpVtbl->GetWriterStatus(This,iWriter,pidInstance,pidWriter,pbstrWriter,pnStatus,phResultFailure)
#define IVssBackupComponentsEx_SetBackupSucceeded(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName,bSucceded) (This)->lpVtbl->SetBackupSucceeded(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName,bSucceded)
#define IVssBackupComponentsEx_SetBackupOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszBackupOptions) (This)->lpVtbl->SetBackupOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszBackupOptions)
#define IVssBackupComponentsEx_SetSelectedForRestore(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore) (This)->lpVtbl->SetSelectedForRestore(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore)
#define IVssBackupComponentsEx_SetRestoreOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszRestoreOptions) (This)->lpVtbl->SetRestoreOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszRestoreOptions)
#define IVssBackupComponentsEx_SetAdditionalRestores(This,writerId,ct,wszLogicalPath,wszComponentName,bAdditionalRestores) (This)->lpVtbl->SetAdditionalRestores(This,writerId,ct,wszLogicalPath,wszComponentName,bAdditionalRestores)
#define IVssBackupComponentsEx_SetPreviousBackupStamp(This,writerId,ct,wszLogicalPath,wszComponentName,wszPreviousBackupStamp) (This)->lpVtbl->SetPreviousBackupStamp(This,writerId,ct,wszLogicalPath,wszComponentName,wszPreviousBackupStamp)
#define IVssBackupComponentsEx_SaveAsXML(This,pbstrXML) (This)->lpVtbl->SaveAsXML(This,pbstrXML)
#define IVssBackupComponentsEx_BackupComplete(This,ppAsync) (This)->lpVtbl->BackupComplete(This,ppAsync)
#define IVssBackupComponentsEx_AddAlternativeLocationMapping(This,writerId,componentType,wszLogicalPath,wszComponentName,wszPath,wszFilespec,bRecursive,wszDestination) (This)->lpVtbl->AddAlternativeLocationMapping(This,writerId,componentType,wszLogicalPath,wszComponentName,wszPath,wszFilespec,bRecursive,wszDestination)
#define IVssBackupComponentsEx_AddRestoreSubcomponent(This,writerId,componentType,wszLogicalPath,wszComponentName,wszSubComponentLogicalPath,wszSubComponentName,bRepair) (This)->lpVtbl->AddRestoreSubcomponent(This,writerId,componentType,wszLogicalPath,wszComponentName,wszSubComponentLogicalPath,wszSubComponentName,bRepair)
#define IVssBackupComponentsEx_SetFileRestoreStatus(This,writerId,ct,wszLogicalPath,wszComponentName,status) (This)->lpVtbl->SetFileRestoreStatus(This,writerId,ct,wszLogicalPath,wszComponentName,status)
#define IVssBackupComponentsEx_AddNewTarget(This,writerId,ct,wszLogicalPath,wszComponentName,wszPath,wszFileName,bRecursive,wszAlternatePath) (This)->lpVtbl->AddNewTarget(This,writerId,ct,wszLogicalPath,wszComponentName,wszPath,wszFileName,bRecursive,wszAlternatePath)
#define IVssBackupComponentsEx_SetRangesFilePath(This,writerId,ct,wszLogicalPath,wszComponentName,iPartialFile,wszRangesFile) (This)->lpVtbl->SetRangesFilePath(This,writerId,ct,wszLogicalPath,wszComponentName,iPartialFile,wszRangesFile)
#define IVssBackupComponentsEx_PreRestore(This,ppAsync) (This)->lpVtbl->PreRestore(This,ppAsync)
#define IVssBackupComponentsEx_PostRestore(This,ppAsync) (This)->lpVtbl->PostRestore(This,ppAsync)
#define IVssBackupComponentsEx_SetContext(This,lContext) (This)->lpVtbl->SetContext(This,lContext)
#define IVssBackupComponentsEx_StartSnapshotSet(This,pSnapshotSetId) (This)->lpVtbl->StartSnapshotSet(This,pSnapshotSetId)
#define IVssBackupComponentsEx_AddToSnapshotSet(This,pwszVolumeName,ProviderId,pidSnapshot) (This)->lpVtbl->AddToSnapshotSet(This,pwszVolumeName,ProviderId,pidSnapshot)
#define IVssBackupComponentsEx_DoSnapshotSet(This,ppAsync) (This)->lpVtbl->DoSnapshotSet(This,ppAsync)
#define IVssBackupComponentsEx_DeleteSnapshots(This,SourceObjectId,eSourceObjectType,bForceDelete,plDeletedSnapshots,pNondeletedSnapshotID) (This)->lpVtbl->DeleteSnapshots(This,SourceObjectId,eSourceObjectType,bForceDelete,plDeletedSnapshots,pNondeletedSnapshotID)
#define IVssBackupComponentsEx_ImportSnapshots(This,ppAsync) (This)->lpVtbl->ImportSnapshots(This,ppAsync)
#define IVssBackupComponentsEx_BreakSnapshotSet(This,SnapshotSetId) (This)->lpVtbl->BreakSnapshotSet(This,SnapshotSetId)
#define IVssBackupComponentsEx_GetSnapshotProperties(This,SnapshotId,pProp) (This)->lpVtbl->GetSnapshotProperties(This,SnapshotId,pProp)
#define IVssBackupComponentsEx_Query(This,QueriedObjectId,eQueriedObjectType,eReturnedObjectsType,ppEnum) (This)->lpVtbl->Query(This,QueriedObjectId,eQueriedObjectType,eReturnedObjectsType,ppEnum)
#define IVssBackupComponentsEx_IsVolumeSupported(This,ProviderId,pwszVolumeName,pbSupportedByThisProvider) (This)->lpVtbl->IsVolumeSupported(This,ProviderId,pwszVolumeName,pbSupportedByThisProvider)
#define IVssBackupComponentsEx_DisableWriterClasses(This,rgWriterClassId,cClassId) (This)->lpVtbl->DisableWriterClasses(This,rgWriterClassId,cClassId)
#define IVssBackupComponentsEx_EnableWriterClasses(This,rgWriterClassId,cClassId) (This)->lpVtbl->EnableWriterClasses(This,rgWriterClassId,cClassId)
#define IVssBackupComponentsEx_DisableWriterInstances(This,rgWriterInstanceId,cInstanceId) (This)->lpVtbl->DisableWriterInstances(This,rgWriterInstanceId,cInstanceId)
#define IVssBackupComponentsEx_ExposeSnapshot(This,SnapshotId,wszPathFromRoot,lAttributes,wszExpose,pwszExposed) (This)->lpVtbl->ExposeSnapshot(This,SnapshotId,wszPathFromRoot,lAttributes,wszExpose,pwszExposed)
#define IVssBackupComponentsEx_RevertToSnapshot(This,SnapshotId,bForceDismount) (This)->lpVtbl->RevertToSnapshot(This,SnapshotId,bForceDismount)
#define IVssBackupComponentsEx_QueryRevertStatus(This,pwszVolume,ppAsync) (This)->lpVtbl->QueryRevertStatus(This,pwszVolume,ppAsync)
/*** IVssBackupComponentsEx methods ***/
#define IVssBackupComponentsEx_GetWriterMetadataEx(This,iWriter,pidInstance,ppMetadata) (This)->lpVtbl->GetWriterMetadataEx(This,iWriter,pidInstance,ppMetadata)
#define IVssBackupComponentsEx_SetSelectedForRestoreEx(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore,instanceId) (This)->lpVtbl->SetSelectedForRestoreEx(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore,instanceId)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_QueryInterface(IVssBackupComponentsEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVssBackupComponentsEx_AddRef(IVssBackupComponentsEx* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVssBackupComponentsEx_Release(IVssBackupComponentsEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssBackupComponents methods ***/
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_GetWriterComponentsCount(IVssBackupComponentsEx* This,UINT *pcComponents) {
    return This->lpVtbl->GetWriterComponentsCount(This,pcComponents);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_GetWriterComponents(IVssBackupComponentsEx* This,UINT iWriter,IVssWriterComponentsExt **ppWriter) {
    return This->lpVtbl->GetWriterComponents(This,iWriter,ppWriter);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_InitializeForBackup(IVssBackupComponentsEx* This,BSTR bstrXML) {
    return This->lpVtbl->InitializeForBackup(This,bstrXML);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_SetBackupState(IVssBackupComponentsEx* This,boolean bSelectComponents,boolean bBackupBootableSystemState,VSS_BACKUP_TYPE backupType,boolean bPartialFileSupport) {
    return This->lpVtbl->SetBackupState(This,bSelectComponents,bBackupBootableSystemState,backupType,bPartialFileSupport);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_InitializeForRestore(IVssBackupComponentsEx* This,BSTR bstrXML) {
    return This->lpVtbl->InitializeForRestore(This,bstrXML);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_SetRestoreState(IVssBackupComponentsEx* This,VSS_RESTORE_TYPE restoreType) {
    return This->lpVtbl->SetRestoreState(This,restoreType);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_GatherWriterMetadata(IVssBackupComponentsEx* This,IVssAsync **pAsync) {
    return This->lpVtbl->GatherWriterMetadata(This,pAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_GetWriterMetadataCount(IVssBackupComponentsEx* This,UINT *pcWriters) {
    return This->lpVtbl->GetWriterMetadataCount(This,pcWriters);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_GetWriterMetadata(IVssBackupComponentsEx* This,UINT iWriter,VSS_ID *pidInstance,IVssExamineWriterMetadata **ppMetadata) {
    return This->lpVtbl->GetWriterMetadata(This,iWriter,pidInstance,ppMetadata);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_FreeWriterMetadata(IVssBackupComponentsEx* This) {
    return This->lpVtbl->FreeWriterMetadata(This);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_AddComponent(IVssBackupComponentsEx* This,VSS_ID instanceId,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName) {
    return This->lpVtbl->AddComponent(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_PrepareForBackup(IVssBackupComponentsEx* This,IVssAsync **ppAsync) {
    return This->lpVtbl->PrepareForBackup(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_AbortBackup(IVssBackupComponentsEx* This) {
    return This->lpVtbl->AbortBackup(This);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_GatherWriterStatus(IVssBackupComponentsEx* This,IVssAsync **pAsync) {
    return This->lpVtbl->GatherWriterStatus(This,pAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_GetWriterStatusCount(IVssBackupComponentsEx* This,UINT *pcWriters) {
    return This->lpVtbl->GetWriterStatusCount(This,pcWriters);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_FreeWriterStatus(IVssBackupComponentsEx* This) {
    return This->lpVtbl->FreeWriterStatus(This);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_GetWriterStatus(IVssBackupComponentsEx* This,UINT iWriter,VSS_ID *pidInstance,VSS_ID *pidWriter,BSTR *pbstrWriter,VSS_WRITER_STATE *pnStatus,HRESULT *phResultFailure) {
    return This->lpVtbl->GetWriterStatus(This,iWriter,pidInstance,pidWriter,pbstrWriter,pnStatus,phResultFailure);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_SetBackupSucceeded(IVssBackupComponentsEx* This,VSS_ID instanceId,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,boolean bSucceded) {
    return This->lpVtbl->SetBackupSucceeded(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName,bSucceded);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_SetBackupOptions(IVssBackupComponentsEx* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszBackupOptions) {
    return This->lpVtbl->SetBackupOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszBackupOptions);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_SetSelectedForRestore(IVssBackupComponentsEx* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,boolean bSelectedForRestore) {
    return This->lpVtbl->SetSelectedForRestore(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_SetRestoreOptions(IVssBackupComponentsEx* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszRestoreOptions) {
    return This->lpVtbl->SetRestoreOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszRestoreOptions);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_SetAdditionalRestores(IVssBackupComponentsEx* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,boolean bAdditionalRestores) {
    return This->lpVtbl->SetAdditionalRestores(This,writerId,ct,wszLogicalPath,wszComponentName,bAdditionalRestores);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_SetPreviousBackupStamp(IVssBackupComponentsEx* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszPreviousBackupStamp) {
    return This->lpVtbl->SetPreviousBackupStamp(This,writerId,ct,wszLogicalPath,wszComponentName,wszPreviousBackupStamp);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_SaveAsXML(IVssBackupComponentsEx* This,BSTR *pbstrXML) {
    return This->lpVtbl->SaveAsXML(This,pbstrXML);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_BackupComplete(IVssBackupComponentsEx* This,IVssAsync **ppAsync) {
    return This->lpVtbl->BackupComplete(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_AddAlternativeLocationMapping(IVssBackupComponentsEx* This,VSS_ID writerId,VSS_COMPONENT_TYPE componentType,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszPath,LPCWSTR wszFilespec,boolean bRecursive,LPCWSTR wszDestination) {
    return This->lpVtbl->AddAlternativeLocationMapping(This,writerId,componentType,wszLogicalPath,wszComponentName,wszPath,wszFilespec,bRecursive,wszDestination);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_AddRestoreSubcomponent(IVssBackupComponentsEx* This,VSS_ID writerId,VSS_COMPONENT_TYPE componentType,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszSubComponentLogicalPath,LPCWSTR wszSubComponentName,boolean bRepair) {
    return This->lpVtbl->AddRestoreSubcomponent(This,writerId,componentType,wszLogicalPath,wszComponentName,wszSubComponentLogicalPath,wszSubComponentName,bRepair);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_SetFileRestoreStatus(IVssBackupComponentsEx* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,VSS_FILE_RESTORE_STATUS status) {
    return This->lpVtbl->SetFileRestoreStatus(This,writerId,ct,wszLogicalPath,wszComponentName,status);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_AddNewTarget(IVssBackupComponentsEx* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszPath,LPCWSTR wszFileName,boolean bRecursive,LPCWSTR wszAlternatePath) {
    return This->lpVtbl->AddNewTarget(This,writerId,ct,wszLogicalPath,wszComponentName,wszPath,wszFileName,bRecursive,wszAlternatePath);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_SetRangesFilePath(IVssBackupComponentsEx* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,UINT iPartialFile,LPCWSTR wszRangesFile) {
    return This->lpVtbl->SetRangesFilePath(This,writerId,ct,wszLogicalPath,wszComponentName,iPartialFile,wszRangesFile);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_PreRestore(IVssBackupComponentsEx* This,IVssAsync **ppAsync) {
    return This->lpVtbl->PreRestore(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_PostRestore(IVssBackupComponentsEx* This,IVssAsync **ppAsync) {
    return This->lpVtbl->PostRestore(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_SetContext(IVssBackupComponentsEx* This,LONG lContext) {
    return This->lpVtbl->SetContext(This,lContext);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_StartSnapshotSet(IVssBackupComponentsEx* This,VSS_ID *pSnapshotSetId) {
    return This->lpVtbl->StartSnapshotSet(This,pSnapshotSetId);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_AddToSnapshotSet(IVssBackupComponentsEx* This,VSS_PWSZ pwszVolumeName,VSS_ID ProviderId,VSS_ID *pidSnapshot) {
    return This->lpVtbl->AddToSnapshotSet(This,pwszVolumeName,ProviderId,pidSnapshot);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_DoSnapshotSet(IVssBackupComponentsEx* This,IVssAsync **ppAsync) {
    return This->lpVtbl->DoSnapshotSet(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_DeleteSnapshots(IVssBackupComponentsEx* 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 IVssBackupComponentsEx_ImportSnapshots(IVssBackupComponentsEx* This,IVssAsync **ppAsync) {
    return This->lpVtbl->ImportSnapshots(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_BreakSnapshotSet(IVssBackupComponentsEx* This,VSS_ID SnapshotSetId) {
    return This->lpVtbl->BreakSnapshotSet(This,SnapshotSetId);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_GetSnapshotProperties(IVssBackupComponentsEx* This,VSS_ID SnapshotId,VSS_SNAPSHOT_PROP *pProp) {
    return This->lpVtbl->GetSnapshotProperties(This,SnapshotId,pProp);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_Query(IVssBackupComponentsEx* 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 IVssBackupComponentsEx_IsVolumeSupported(IVssBackupComponentsEx* This,VSS_ID ProviderId,VSS_PWSZ pwszVolumeName,WINBOOL *pbSupportedByThisProvider) {
    return This->lpVtbl->IsVolumeSupported(This,ProviderId,pwszVolumeName,pbSupportedByThisProvider);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_DisableWriterClasses(IVssBackupComponentsEx* This,const VSS_ID *rgWriterClassId,UINT cClassId) {
    return This->lpVtbl->DisableWriterClasses(This,rgWriterClassId,cClassId);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_EnableWriterClasses(IVssBackupComponentsEx* This,const VSS_ID *rgWriterClassId,UINT cClassId) {
    return This->lpVtbl->EnableWriterClasses(This,rgWriterClassId,cClassId);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_DisableWriterInstances(IVssBackupComponentsEx* This,const VSS_ID *rgWriterInstanceId,UINT cInstanceId) {
    return This->lpVtbl->DisableWriterInstances(This,rgWriterInstanceId,cInstanceId);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_ExposeSnapshot(IVssBackupComponentsEx* This,VSS_ID SnapshotId,VSS_PWSZ wszPathFromRoot,LONG lAttributes,VSS_PWSZ wszExpose,VSS_PWSZ *pwszExposed) {
    return This->lpVtbl->ExposeSnapshot(This,SnapshotId,wszPathFromRoot,lAttributes,wszExpose,pwszExposed);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_RevertToSnapshot(IVssBackupComponentsEx* This,VSS_ID SnapshotId,WINBOOL bForceDismount) {
    return This->lpVtbl->RevertToSnapshot(This,SnapshotId,bForceDismount);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_QueryRevertStatus(IVssBackupComponentsEx* This,VSS_PWSZ pwszVolume,IVssAsync **ppAsync) {
    return This->lpVtbl->QueryRevertStatus(This,pwszVolume,ppAsync);
}
/*** IVssBackupComponentsEx methods ***/
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_GetWriterMetadataEx(IVssBackupComponentsEx* This,UINT iWriter,VSS_ID *pidInstance,IVssExamineWriterMetadataEx **ppMetadata) {
    return This->lpVtbl->GetWriterMetadataEx(This,iWriter,pidInstance,ppMetadata);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx_SetSelectedForRestoreEx(IVssBackupComponentsEx* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,boolean bSelectedForRestore,VSS_ID instanceId) {
    return This->lpVtbl->SetSelectedForRestoreEx(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore,instanceId);
}
#endif
#endif

#endif


#endif  /* __IVssBackupComponentsEx_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssBackupComponentsEx2 interface
 */
#ifndef __IVssBackupComponentsEx2_INTERFACE_DEFINED__
#define __IVssBackupComponentsEx2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssBackupComponentsEx2, 0xacfe2b3a, 0x22c9, 0x4ef8, 0xbd,0x03, 0x2f,0x9c,0xa2,0x30,0x08,0x4e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("acfe2b3a-22c9-4ef8-bd03-2f9ca230084e")
IVssBackupComponentsEx2 : public IVssBackupComponentsEx
{
    virtual HRESULT STDMETHODCALLTYPE UnexposeSnapshot(
        VSS_ID snapshotId) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAuthoritativeRestore(
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bAuth) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRollForward(
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        VSS_ROLLFORWARD_TYPE rollType,
        LPCWSTR wszRollForwardPoint) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRestoreName(
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszRestoreName) = 0;

    virtual HRESULT STDMETHODCALLTYPE BreakSnapshotSetEx(
        VSS_ID SnapshotSetID,
        DWORD dwBreakFlags,
        IVssAsync **ppAsync) = 0;

    virtual HRESULT STDMETHODCALLTYPE PreFastRecovery(
        VSS_ID SnapshotSetID,
        DWORD dwPreFastRecoveryFlags,
        IVssAsync **ppAsync) = 0;

    virtual HRESULT STDMETHODCALLTYPE FastRecovery(
        VSS_ID SnapshotSetID,
        DWORD dwFastRecoveryFlags,
        IVssAsync **ppAsync) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssBackupComponentsEx2, 0xacfe2b3a, 0x22c9, 0x4ef8, 0xbd,0x03, 0x2f,0x9c,0xa2,0x30,0x08,0x4e)
#endif
#else
typedef struct IVssBackupComponentsEx2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVssBackupComponents methods ***/
    HRESULT (STDMETHODCALLTYPE *GetWriterComponentsCount)(
        IVssBackupComponentsEx2 *This,
        UINT *pcComponents);

    HRESULT (STDMETHODCALLTYPE *GetWriterComponents)(
        IVssBackupComponentsEx2 *This,
        UINT iWriter,
        IVssWriterComponentsExt **ppWriter);

    HRESULT (STDMETHODCALLTYPE *InitializeForBackup)(
        IVssBackupComponentsEx2 *This,
        BSTR bstrXML);

    HRESULT (STDMETHODCALLTYPE *SetBackupState)(
        IVssBackupComponentsEx2 *This,
        boolean bSelectComponents,
        boolean bBackupBootableSystemState,
        VSS_BACKUP_TYPE backupType,
        boolean bPartialFileSupport);

    HRESULT (STDMETHODCALLTYPE *InitializeForRestore)(
        IVssBackupComponentsEx2 *This,
        BSTR bstrXML);

    HRESULT (STDMETHODCALLTYPE *SetRestoreState)(
        IVssBackupComponentsEx2 *This,
        VSS_RESTORE_TYPE restoreType);

    HRESULT (STDMETHODCALLTYPE *GatherWriterMetadata)(
        IVssBackupComponentsEx2 *This,
        IVssAsync **pAsync);

    HRESULT (STDMETHODCALLTYPE *GetWriterMetadataCount)(
        IVssBackupComponentsEx2 *This,
        UINT *pcWriters);

    HRESULT (STDMETHODCALLTYPE *GetWriterMetadata)(
        IVssBackupComponentsEx2 *This,
        UINT iWriter,
        VSS_ID *pidInstance,
        IVssExamineWriterMetadata **ppMetadata);

    HRESULT (STDMETHODCALLTYPE *FreeWriterMetadata)(
        IVssBackupComponentsEx2 *This);

    HRESULT (STDMETHODCALLTYPE *AddComponent)(
        IVssBackupComponentsEx2 *This,
        VSS_ID instanceId,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName);

    HRESULT (STDMETHODCALLTYPE *PrepareForBackup)(
        IVssBackupComponentsEx2 *This,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *AbortBackup)(
        IVssBackupComponentsEx2 *This);

    HRESULT (STDMETHODCALLTYPE *GatherWriterStatus)(
        IVssBackupComponentsEx2 *This,
        IVssAsync **pAsync);

    HRESULT (STDMETHODCALLTYPE *GetWriterStatusCount)(
        IVssBackupComponentsEx2 *This,
        UINT *pcWriters);

    HRESULT (STDMETHODCALLTYPE *FreeWriterStatus)(
        IVssBackupComponentsEx2 *This);

    HRESULT (STDMETHODCALLTYPE *GetWriterStatus)(
        IVssBackupComponentsEx2 *This,
        UINT iWriter,
        VSS_ID *pidInstance,
        VSS_ID *pidWriter,
        BSTR *pbstrWriter,
        VSS_WRITER_STATE *pnStatus,
        HRESULT *phResultFailure);

    HRESULT (STDMETHODCALLTYPE *SetBackupSucceeded)(
        IVssBackupComponentsEx2 *This,
        VSS_ID instanceId,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bSucceded);

    HRESULT (STDMETHODCALLTYPE *SetBackupOptions)(
        IVssBackupComponentsEx2 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszBackupOptions);

    HRESULT (STDMETHODCALLTYPE *SetSelectedForRestore)(
        IVssBackupComponentsEx2 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bSelectedForRestore);

    HRESULT (STDMETHODCALLTYPE *SetRestoreOptions)(
        IVssBackupComponentsEx2 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszRestoreOptions);

    HRESULT (STDMETHODCALLTYPE *SetAdditionalRestores)(
        IVssBackupComponentsEx2 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bAdditionalRestores);

    HRESULT (STDMETHODCALLTYPE *SetPreviousBackupStamp)(
        IVssBackupComponentsEx2 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszPreviousBackupStamp);

    HRESULT (STDMETHODCALLTYPE *SaveAsXML)(
        IVssBackupComponentsEx2 *This,
        BSTR *pbstrXML);

    HRESULT (STDMETHODCALLTYPE *BackupComplete)(
        IVssBackupComponentsEx2 *This,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *AddAlternativeLocationMapping)(
        IVssBackupComponentsEx2 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE componentType,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        boolean bRecursive,
        LPCWSTR wszDestination);

    HRESULT (STDMETHODCALLTYPE *AddRestoreSubcomponent)(
        IVssBackupComponentsEx2 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE componentType,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszSubComponentLogicalPath,
        LPCWSTR wszSubComponentName,
        boolean bRepair);

    HRESULT (STDMETHODCALLTYPE *SetFileRestoreStatus)(
        IVssBackupComponentsEx2 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        VSS_FILE_RESTORE_STATUS status);

    HRESULT (STDMETHODCALLTYPE *AddNewTarget)(
        IVssBackupComponentsEx2 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszPath,
        LPCWSTR wszFileName,
        boolean bRecursive,
        LPCWSTR wszAlternatePath);

    HRESULT (STDMETHODCALLTYPE *SetRangesFilePath)(
        IVssBackupComponentsEx2 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        UINT iPartialFile,
        LPCWSTR wszRangesFile);

    HRESULT (STDMETHODCALLTYPE *PreRestore)(
        IVssBackupComponentsEx2 *This,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *PostRestore)(
        IVssBackupComponentsEx2 *This,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *SetContext)(
        IVssBackupComponentsEx2 *This,
        LONG lContext);

    HRESULT (STDMETHODCALLTYPE *StartSnapshotSet)(
        IVssBackupComponentsEx2 *This,
        VSS_ID *pSnapshotSetId);

    HRESULT (STDMETHODCALLTYPE *AddToSnapshotSet)(
        IVssBackupComponentsEx2 *This,
        VSS_PWSZ pwszVolumeName,
        VSS_ID ProviderId,
        VSS_ID *pidSnapshot);

    HRESULT (STDMETHODCALLTYPE *DoSnapshotSet)(
        IVssBackupComponentsEx2 *This,
        IVssAsync **ppAsync);

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

    HRESULT (STDMETHODCALLTYPE *ImportSnapshots)(
        IVssBackupComponentsEx2 *This,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *BreakSnapshotSet)(
        IVssBackupComponentsEx2 *This,
        VSS_ID SnapshotSetId);

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

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

    HRESULT (STDMETHODCALLTYPE *IsVolumeSupported)(
        IVssBackupComponentsEx2 *This,
        VSS_ID ProviderId,
        VSS_PWSZ pwszVolumeName,
        WINBOOL *pbSupportedByThisProvider);

    HRESULT (STDMETHODCALLTYPE *DisableWriterClasses)(
        IVssBackupComponentsEx2 *This,
        const VSS_ID *rgWriterClassId,
        UINT cClassId);

    HRESULT (STDMETHODCALLTYPE *EnableWriterClasses)(
        IVssBackupComponentsEx2 *This,
        const VSS_ID *rgWriterClassId,
        UINT cClassId);

    HRESULT (STDMETHODCALLTYPE *DisableWriterInstances)(
        IVssBackupComponentsEx2 *This,
        const VSS_ID *rgWriterInstanceId,
        UINT cInstanceId);

    HRESULT (STDMETHODCALLTYPE *ExposeSnapshot)(
        IVssBackupComponentsEx2 *This,
        VSS_ID SnapshotId,
        VSS_PWSZ wszPathFromRoot,
        LONG lAttributes,
        VSS_PWSZ wszExpose,
        VSS_PWSZ *pwszExposed);

    HRESULT (STDMETHODCALLTYPE *RevertToSnapshot)(
        IVssBackupComponentsEx2 *This,
        VSS_ID SnapshotId,
        WINBOOL bForceDismount);

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

    /*** IVssBackupComponentsEx methods ***/
    HRESULT (STDMETHODCALLTYPE *GetWriterMetadataEx)(
        IVssBackupComponentsEx2 *This,
        UINT iWriter,
        VSS_ID *pidInstance,
        IVssExamineWriterMetadataEx **ppMetadata);

    HRESULT (STDMETHODCALLTYPE *SetSelectedForRestoreEx)(
        IVssBackupComponentsEx2 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bSelectedForRestore,
        VSS_ID instanceId);

    /*** IVssBackupComponentsEx2 methods ***/
    HRESULT (STDMETHODCALLTYPE *UnexposeSnapshot)(
        IVssBackupComponentsEx2 *This,
        VSS_ID snapshotId);

    HRESULT (STDMETHODCALLTYPE *SetAuthoritativeRestore)(
        IVssBackupComponentsEx2 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bAuth);

    HRESULT (STDMETHODCALLTYPE *SetRollForward)(
        IVssBackupComponentsEx2 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        VSS_ROLLFORWARD_TYPE rollType,
        LPCWSTR wszRollForwardPoint);

    HRESULT (STDMETHODCALLTYPE *SetRestoreName)(
        IVssBackupComponentsEx2 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszRestoreName);

    HRESULT (STDMETHODCALLTYPE *BreakSnapshotSetEx)(
        IVssBackupComponentsEx2 *This,
        VSS_ID SnapshotSetID,
        DWORD dwBreakFlags,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *PreFastRecovery)(
        IVssBackupComponentsEx2 *This,
        VSS_ID SnapshotSetID,
        DWORD dwPreFastRecoveryFlags,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *FastRecovery)(
        IVssBackupComponentsEx2 *This,
        VSS_ID SnapshotSetID,
        DWORD dwFastRecoveryFlags,
        IVssAsync **ppAsync);

    END_INTERFACE
} IVssBackupComponentsEx2Vtbl;

interface IVssBackupComponentsEx2 {
    CONST_VTBL IVssBackupComponentsEx2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssBackupComponentsEx2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssBackupComponentsEx2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssBackupComponentsEx2_Release(This) (This)->lpVtbl->Release(This)
/*** IVssBackupComponents methods ***/
#define IVssBackupComponentsEx2_GetWriterComponentsCount(This,pcComponents) (This)->lpVtbl->GetWriterComponentsCount(This,pcComponents)
#define IVssBackupComponentsEx2_GetWriterComponents(This,iWriter,ppWriter) (This)->lpVtbl->GetWriterComponents(This,iWriter,ppWriter)
#define IVssBackupComponentsEx2_InitializeForBackup(This,bstrXML) (This)->lpVtbl->InitializeForBackup(This,bstrXML)
#define IVssBackupComponentsEx2_SetBackupState(This,bSelectComponents,bBackupBootableSystemState,backupType,bPartialFileSupport) (This)->lpVtbl->SetBackupState(This,bSelectComponents,bBackupBootableSystemState,backupType,bPartialFileSupport)
#define IVssBackupComponentsEx2_InitializeForRestore(This,bstrXML) (This)->lpVtbl->InitializeForRestore(This,bstrXML)
#define IVssBackupComponentsEx2_SetRestoreState(This,restoreType) (This)->lpVtbl->SetRestoreState(This,restoreType)
#define IVssBackupComponentsEx2_GatherWriterMetadata(This,pAsync) (This)->lpVtbl->GatherWriterMetadata(This,pAsync)
#define IVssBackupComponentsEx2_GetWriterMetadataCount(This,pcWriters) (This)->lpVtbl->GetWriterMetadataCount(This,pcWriters)
#define IVssBackupComponentsEx2_GetWriterMetadata(This,iWriter,pidInstance,ppMetadata) (This)->lpVtbl->GetWriterMetadata(This,iWriter,pidInstance,ppMetadata)
#define IVssBackupComponentsEx2_FreeWriterMetadata(This) (This)->lpVtbl->FreeWriterMetadata(This)
#define IVssBackupComponentsEx2_AddComponent(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName) (This)->lpVtbl->AddComponent(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName)
#define IVssBackupComponentsEx2_PrepareForBackup(This,ppAsync) (This)->lpVtbl->PrepareForBackup(This,ppAsync)
#define IVssBackupComponentsEx2_AbortBackup(This) (This)->lpVtbl->AbortBackup(This)
#define IVssBackupComponentsEx2_GatherWriterStatus(This,pAsync) (This)->lpVtbl->GatherWriterStatus(This,pAsync)
#define IVssBackupComponentsEx2_GetWriterStatusCount(This,pcWriters) (This)->lpVtbl->GetWriterStatusCount(This,pcWriters)
#define IVssBackupComponentsEx2_FreeWriterStatus(This) (This)->lpVtbl->FreeWriterStatus(This)
#define IVssBackupComponentsEx2_GetWriterStatus(This,iWriter,pidInstance,pidWriter,pbstrWriter,pnStatus,phResultFailure) (This)->lpVtbl->GetWriterStatus(This,iWriter,pidInstance,pidWriter,pbstrWriter,pnStatus,phResultFailure)
#define IVssBackupComponentsEx2_SetBackupSucceeded(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName,bSucceded) (This)->lpVtbl->SetBackupSucceeded(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName,bSucceded)
#define IVssBackupComponentsEx2_SetBackupOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszBackupOptions) (This)->lpVtbl->SetBackupOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszBackupOptions)
#define IVssBackupComponentsEx2_SetSelectedForRestore(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore) (This)->lpVtbl->SetSelectedForRestore(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore)
#define IVssBackupComponentsEx2_SetRestoreOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszRestoreOptions) (This)->lpVtbl->SetRestoreOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszRestoreOptions)
#define IVssBackupComponentsEx2_SetAdditionalRestores(This,writerId,ct,wszLogicalPath,wszComponentName,bAdditionalRestores) (This)->lpVtbl->SetAdditionalRestores(This,writerId,ct,wszLogicalPath,wszComponentName,bAdditionalRestores)
#define IVssBackupComponentsEx2_SetPreviousBackupStamp(This,writerId,ct,wszLogicalPath,wszComponentName,wszPreviousBackupStamp) (This)->lpVtbl->SetPreviousBackupStamp(This,writerId,ct,wszLogicalPath,wszComponentName,wszPreviousBackupStamp)
#define IVssBackupComponentsEx2_SaveAsXML(This,pbstrXML) (This)->lpVtbl->SaveAsXML(This,pbstrXML)
#define IVssBackupComponentsEx2_BackupComplete(This,ppAsync) (This)->lpVtbl->BackupComplete(This,ppAsync)
#define IVssBackupComponentsEx2_AddAlternativeLocationMapping(This,writerId,componentType,wszLogicalPath,wszComponentName,wszPath,wszFilespec,bRecursive,wszDestination) (This)->lpVtbl->AddAlternativeLocationMapping(This,writerId,componentType,wszLogicalPath,wszComponentName,wszPath,wszFilespec,bRecursive,wszDestination)
#define IVssBackupComponentsEx2_AddRestoreSubcomponent(This,writerId,componentType,wszLogicalPath,wszComponentName,wszSubComponentLogicalPath,wszSubComponentName,bRepair) (This)->lpVtbl->AddRestoreSubcomponent(This,writerId,componentType,wszLogicalPath,wszComponentName,wszSubComponentLogicalPath,wszSubComponentName,bRepair)
#define IVssBackupComponentsEx2_SetFileRestoreStatus(This,writerId,ct,wszLogicalPath,wszComponentName,status) (This)->lpVtbl->SetFileRestoreStatus(This,writerId,ct,wszLogicalPath,wszComponentName,status)
#define IVssBackupComponentsEx2_AddNewTarget(This,writerId,ct,wszLogicalPath,wszComponentName,wszPath,wszFileName,bRecursive,wszAlternatePath) (This)->lpVtbl->AddNewTarget(This,writerId,ct,wszLogicalPath,wszComponentName,wszPath,wszFileName,bRecursive,wszAlternatePath)
#define IVssBackupComponentsEx2_SetRangesFilePath(This,writerId,ct,wszLogicalPath,wszComponentName,iPartialFile,wszRangesFile) (This)->lpVtbl->SetRangesFilePath(This,writerId,ct,wszLogicalPath,wszComponentName,iPartialFile,wszRangesFile)
#define IVssBackupComponentsEx2_PreRestore(This,ppAsync) (This)->lpVtbl->PreRestore(This,ppAsync)
#define IVssBackupComponentsEx2_PostRestore(This,ppAsync) (This)->lpVtbl->PostRestore(This,ppAsync)
#define IVssBackupComponentsEx2_SetContext(This,lContext) (This)->lpVtbl->SetContext(This,lContext)
#define IVssBackupComponentsEx2_StartSnapshotSet(This,pSnapshotSetId) (This)->lpVtbl->StartSnapshotSet(This,pSnapshotSetId)
#define IVssBackupComponentsEx2_AddToSnapshotSet(This,pwszVolumeName,ProviderId,pidSnapshot) (This)->lpVtbl->AddToSnapshotSet(This,pwszVolumeName,ProviderId,pidSnapshot)
#define IVssBackupComponentsEx2_DoSnapshotSet(This,ppAsync) (This)->lpVtbl->DoSnapshotSet(This,ppAsync)
#define IVssBackupComponentsEx2_DeleteSnapshots(This,SourceObjectId,eSourceObjectType,bForceDelete,plDeletedSnapshots,pNondeletedSnapshotID) (This)->lpVtbl->DeleteSnapshots(This,SourceObjectId,eSourceObjectType,bForceDelete,plDeletedSnapshots,pNondeletedSnapshotID)
#define IVssBackupComponentsEx2_ImportSnapshots(This,ppAsync) (This)->lpVtbl->ImportSnapshots(This,ppAsync)
#define IVssBackupComponentsEx2_BreakSnapshotSet(This,SnapshotSetId) (This)->lpVtbl->BreakSnapshotSet(This,SnapshotSetId)
#define IVssBackupComponentsEx2_GetSnapshotProperties(This,SnapshotId,pProp) (This)->lpVtbl->GetSnapshotProperties(This,SnapshotId,pProp)
#define IVssBackupComponentsEx2_Query(This,QueriedObjectId,eQueriedObjectType,eReturnedObjectsType,ppEnum) (This)->lpVtbl->Query(This,QueriedObjectId,eQueriedObjectType,eReturnedObjectsType,ppEnum)
#define IVssBackupComponentsEx2_IsVolumeSupported(This,ProviderId,pwszVolumeName,pbSupportedByThisProvider) (This)->lpVtbl->IsVolumeSupported(This,ProviderId,pwszVolumeName,pbSupportedByThisProvider)
#define IVssBackupComponentsEx2_DisableWriterClasses(This,rgWriterClassId,cClassId) (This)->lpVtbl->DisableWriterClasses(This,rgWriterClassId,cClassId)
#define IVssBackupComponentsEx2_EnableWriterClasses(This,rgWriterClassId,cClassId) (This)->lpVtbl->EnableWriterClasses(This,rgWriterClassId,cClassId)
#define IVssBackupComponentsEx2_DisableWriterInstances(This,rgWriterInstanceId,cInstanceId) (This)->lpVtbl->DisableWriterInstances(This,rgWriterInstanceId,cInstanceId)
#define IVssBackupComponentsEx2_ExposeSnapshot(This,SnapshotId,wszPathFromRoot,lAttributes,wszExpose,pwszExposed) (This)->lpVtbl->ExposeSnapshot(This,SnapshotId,wszPathFromRoot,lAttributes,wszExpose,pwszExposed)
#define IVssBackupComponentsEx2_RevertToSnapshot(This,SnapshotId,bForceDismount) (This)->lpVtbl->RevertToSnapshot(This,SnapshotId,bForceDismount)
#define IVssBackupComponentsEx2_QueryRevertStatus(This,pwszVolume,ppAsync) (This)->lpVtbl->QueryRevertStatus(This,pwszVolume,ppAsync)
/*** IVssBackupComponentsEx methods ***/
#define IVssBackupComponentsEx2_GetWriterMetadataEx(This,iWriter,pidInstance,ppMetadata) (This)->lpVtbl->GetWriterMetadataEx(This,iWriter,pidInstance,ppMetadata)
#define IVssBackupComponentsEx2_SetSelectedForRestoreEx(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore,instanceId) (This)->lpVtbl->SetSelectedForRestoreEx(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore,instanceId)
/*** IVssBackupComponentsEx2 methods ***/
#define IVssBackupComponentsEx2_UnexposeSnapshot(This,snapshotId) (This)->lpVtbl->UnexposeSnapshot(This,snapshotId)
#define IVssBackupComponentsEx2_SetAuthoritativeRestore(This,writerId,ct,wszLogicalPath,wszComponentName,bAuth) (This)->lpVtbl->SetAuthoritativeRestore(This,writerId,ct,wszLogicalPath,wszComponentName,bAuth)
#define IVssBackupComponentsEx2_SetRollForward(This,writerId,ct,wszLogicalPath,wszComponentName,rollType,wszRollForwardPoint) (This)->lpVtbl->SetRollForward(This,writerId,ct,wszLogicalPath,wszComponentName,rollType,wszRollForwardPoint)
#define IVssBackupComponentsEx2_SetRestoreName(This,writerId,ct,wszLogicalPath,wszComponentName,wszRestoreName) (This)->lpVtbl->SetRestoreName(This,writerId,ct,wszLogicalPath,wszComponentName,wszRestoreName)
#define IVssBackupComponentsEx2_BreakSnapshotSetEx(This,SnapshotSetID,dwBreakFlags,ppAsync) (This)->lpVtbl->BreakSnapshotSetEx(This,SnapshotSetID,dwBreakFlags,ppAsync)
#define IVssBackupComponentsEx2_PreFastRecovery(This,SnapshotSetID,dwPreFastRecoveryFlags,ppAsync) (This)->lpVtbl->PreFastRecovery(This,SnapshotSetID,dwPreFastRecoveryFlags,ppAsync)
#define IVssBackupComponentsEx2_FastRecovery(This,SnapshotSetID,dwFastRecoveryFlags,ppAsync) (This)->lpVtbl->FastRecovery(This,SnapshotSetID,dwFastRecoveryFlags,ppAsync)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_QueryInterface(IVssBackupComponentsEx2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVssBackupComponentsEx2_AddRef(IVssBackupComponentsEx2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVssBackupComponentsEx2_Release(IVssBackupComponentsEx2* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssBackupComponents methods ***/
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_GetWriterComponentsCount(IVssBackupComponentsEx2* This,UINT *pcComponents) {
    return This->lpVtbl->GetWriterComponentsCount(This,pcComponents);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_GetWriterComponents(IVssBackupComponentsEx2* This,UINT iWriter,IVssWriterComponentsExt **ppWriter) {
    return This->lpVtbl->GetWriterComponents(This,iWriter,ppWriter);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_InitializeForBackup(IVssBackupComponentsEx2* This,BSTR bstrXML) {
    return This->lpVtbl->InitializeForBackup(This,bstrXML);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_SetBackupState(IVssBackupComponentsEx2* This,boolean bSelectComponents,boolean bBackupBootableSystemState,VSS_BACKUP_TYPE backupType,boolean bPartialFileSupport) {
    return This->lpVtbl->SetBackupState(This,bSelectComponents,bBackupBootableSystemState,backupType,bPartialFileSupport);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_InitializeForRestore(IVssBackupComponentsEx2* This,BSTR bstrXML) {
    return This->lpVtbl->InitializeForRestore(This,bstrXML);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_SetRestoreState(IVssBackupComponentsEx2* This,VSS_RESTORE_TYPE restoreType) {
    return This->lpVtbl->SetRestoreState(This,restoreType);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_GatherWriterMetadata(IVssBackupComponentsEx2* This,IVssAsync **pAsync) {
    return This->lpVtbl->GatherWriterMetadata(This,pAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_GetWriterMetadataCount(IVssBackupComponentsEx2* This,UINT *pcWriters) {
    return This->lpVtbl->GetWriterMetadataCount(This,pcWriters);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_GetWriterMetadata(IVssBackupComponentsEx2* This,UINT iWriter,VSS_ID *pidInstance,IVssExamineWriterMetadata **ppMetadata) {
    return This->lpVtbl->GetWriterMetadata(This,iWriter,pidInstance,ppMetadata);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_FreeWriterMetadata(IVssBackupComponentsEx2* This) {
    return This->lpVtbl->FreeWriterMetadata(This);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_AddComponent(IVssBackupComponentsEx2* This,VSS_ID instanceId,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName) {
    return This->lpVtbl->AddComponent(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_PrepareForBackup(IVssBackupComponentsEx2* This,IVssAsync **ppAsync) {
    return This->lpVtbl->PrepareForBackup(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_AbortBackup(IVssBackupComponentsEx2* This) {
    return This->lpVtbl->AbortBackup(This);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_GatherWriterStatus(IVssBackupComponentsEx2* This,IVssAsync **pAsync) {
    return This->lpVtbl->GatherWriterStatus(This,pAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_GetWriterStatusCount(IVssBackupComponentsEx2* This,UINT *pcWriters) {
    return This->lpVtbl->GetWriterStatusCount(This,pcWriters);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_FreeWriterStatus(IVssBackupComponentsEx2* This) {
    return This->lpVtbl->FreeWriterStatus(This);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_GetWriterStatus(IVssBackupComponentsEx2* This,UINT iWriter,VSS_ID *pidInstance,VSS_ID *pidWriter,BSTR *pbstrWriter,VSS_WRITER_STATE *pnStatus,HRESULT *phResultFailure) {
    return This->lpVtbl->GetWriterStatus(This,iWriter,pidInstance,pidWriter,pbstrWriter,pnStatus,phResultFailure);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_SetBackupSucceeded(IVssBackupComponentsEx2* This,VSS_ID instanceId,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,boolean bSucceded) {
    return This->lpVtbl->SetBackupSucceeded(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName,bSucceded);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_SetBackupOptions(IVssBackupComponentsEx2* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszBackupOptions) {
    return This->lpVtbl->SetBackupOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszBackupOptions);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_SetSelectedForRestore(IVssBackupComponentsEx2* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,boolean bSelectedForRestore) {
    return This->lpVtbl->SetSelectedForRestore(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_SetRestoreOptions(IVssBackupComponentsEx2* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszRestoreOptions) {
    return This->lpVtbl->SetRestoreOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszRestoreOptions);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_SetAdditionalRestores(IVssBackupComponentsEx2* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,boolean bAdditionalRestores) {
    return This->lpVtbl->SetAdditionalRestores(This,writerId,ct,wszLogicalPath,wszComponentName,bAdditionalRestores);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_SetPreviousBackupStamp(IVssBackupComponentsEx2* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszPreviousBackupStamp) {
    return This->lpVtbl->SetPreviousBackupStamp(This,writerId,ct,wszLogicalPath,wszComponentName,wszPreviousBackupStamp);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_SaveAsXML(IVssBackupComponentsEx2* This,BSTR *pbstrXML) {
    return This->lpVtbl->SaveAsXML(This,pbstrXML);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_BackupComplete(IVssBackupComponentsEx2* This,IVssAsync **ppAsync) {
    return This->lpVtbl->BackupComplete(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_AddAlternativeLocationMapping(IVssBackupComponentsEx2* This,VSS_ID writerId,VSS_COMPONENT_TYPE componentType,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszPath,LPCWSTR wszFilespec,boolean bRecursive,LPCWSTR wszDestination) {
    return This->lpVtbl->AddAlternativeLocationMapping(This,writerId,componentType,wszLogicalPath,wszComponentName,wszPath,wszFilespec,bRecursive,wszDestination);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_AddRestoreSubcomponent(IVssBackupComponentsEx2* This,VSS_ID writerId,VSS_COMPONENT_TYPE componentType,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszSubComponentLogicalPath,LPCWSTR wszSubComponentName,boolean bRepair) {
    return This->lpVtbl->AddRestoreSubcomponent(This,writerId,componentType,wszLogicalPath,wszComponentName,wszSubComponentLogicalPath,wszSubComponentName,bRepair);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_SetFileRestoreStatus(IVssBackupComponentsEx2* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,VSS_FILE_RESTORE_STATUS status) {
    return This->lpVtbl->SetFileRestoreStatus(This,writerId,ct,wszLogicalPath,wszComponentName,status);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_AddNewTarget(IVssBackupComponentsEx2* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszPath,LPCWSTR wszFileName,boolean bRecursive,LPCWSTR wszAlternatePath) {
    return This->lpVtbl->AddNewTarget(This,writerId,ct,wszLogicalPath,wszComponentName,wszPath,wszFileName,bRecursive,wszAlternatePath);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_SetRangesFilePath(IVssBackupComponentsEx2* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,UINT iPartialFile,LPCWSTR wszRangesFile) {
    return This->lpVtbl->SetRangesFilePath(This,writerId,ct,wszLogicalPath,wszComponentName,iPartialFile,wszRangesFile);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_PreRestore(IVssBackupComponentsEx2* This,IVssAsync **ppAsync) {
    return This->lpVtbl->PreRestore(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_PostRestore(IVssBackupComponentsEx2* This,IVssAsync **ppAsync) {
    return This->lpVtbl->PostRestore(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_SetContext(IVssBackupComponentsEx2* This,LONG lContext) {
    return This->lpVtbl->SetContext(This,lContext);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_StartSnapshotSet(IVssBackupComponentsEx2* This,VSS_ID *pSnapshotSetId) {
    return This->lpVtbl->StartSnapshotSet(This,pSnapshotSetId);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_AddToSnapshotSet(IVssBackupComponentsEx2* This,VSS_PWSZ pwszVolumeName,VSS_ID ProviderId,VSS_ID *pidSnapshot) {
    return This->lpVtbl->AddToSnapshotSet(This,pwszVolumeName,ProviderId,pidSnapshot);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_DoSnapshotSet(IVssBackupComponentsEx2* This,IVssAsync **ppAsync) {
    return This->lpVtbl->DoSnapshotSet(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_DeleteSnapshots(IVssBackupComponentsEx2* 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 IVssBackupComponentsEx2_ImportSnapshots(IVssBackupComponentsEx2* This,IVssAsync **ppAsync) {
    return This->lpVtbl->ImportSnapshots(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_BreakSnapshotSet(IVssBackupComponentsEx2* This,VSS_ID SnapshotSetId) {
    return This->lpVtbl->BreakSnapshotSet(This,SnapshotSetId);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_GetSnapshotProperties(IVssBackupComponentsEx2* This,VSS_ID SnapshotId,VSS_SNAPSHOT_PROP *pProp) {
    return This->lpVtbl->GetSnapshotProperties(This,SnapshotId,pProp);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_Query(IVssBackupComponentsEx2* 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 IVssBackupComponentsEx2_IsVolumeSupported(IVssBackupComponentsEx2* This,VSS_ID ProviderId,VSS_PWSZ pwszVolumeName,WINBOOL *pbSupportedByThisProvider) {
    return This->lpVtbl->IsVolumeSupported(This,ProviderId,pwszVolumeName,pbSupportedByThisProvider);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_DisableWriterClasses(IVssBackupComponentsEx2* This,const VSS_ID *rgWriterClassId,UINT cClassId) {
    return This->lpVtbl->DisableWriterClasses(This,rgWriterClassId,cClassId);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_EnableWriterClasses(IVssBackupComponentsEx2* This,const VSS_ID *rgWriterClassId,UINT cClassId) {
    return This->lpVtbl->EnableWriterClasses(This,rgWriterClassId,cClassId);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_DisableWriterInstances(IVssBackupComponentsEx2* This,const VSS_ID *rgWriterInstanceId,UINT cInstanceId) {
    return This->lpVtbl->DisableWriterInstances(This,rgWriterInstanceId,cInstanceId);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_ExposeSnapshot(IVssBackupComponentsEx2* This,VSS_ID SnapshotId,VSS_PWSZ wszPathFromRoot,LONG lAttributes,VSS_PWSZ wszExpose,VSS_PWSZ *pwszExposed) {
    return This->lpVtbl->ExposeSnapshot(This,SnapshotId,wszPathFromRoot,lAttributes,wszExpose,pwszExposed);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_RevertToSnapshot(IVssBackupComponentsEx2* This,VSS_ID SnapshotId,WINBOOL bForceDismount) {
    return This->lpVtbl->RevertToSnapshot(This,SnapshotId,bForceDismount);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_QueryRevertStatus(IVssBackupComponentsEx2* This,VSS_PWSZ pwszVolume,IVssAsync **ppAsync) {
    return This->lpVtbl->QueryRevertStatus(This,pwszVolume,ppAsync);
}
/*** IVssBackupComponentsEx methods ***/
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_GetWriterMetadataEx(IVssBackupComponentsEx2* This,UINT iWriter,VSS_ID *pidInstance,IVssExamineWriterMetadataEx **ppMetadata) {
    return This->lpVtbl->GetWriterMetadataEx(This,iWriter,pidInstance,ppMetadata);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_SetSelectedForRestoreEx(IVssBackupComponentsEx2* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,boolean bSelectedForRestore,VSS_ID instanceId) {
    return This->lpVtbl->SetSelectedForRestoreEx(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore,instanceId);
}
/*** IVssBackupComponentsEx2 methods ***/
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_UnexposeSnapshot(IVssBackupComponentsEx2* This,VSS_ID snapshotId) {
    return This->lpVtbl->UnexposeSnapshot(This,snapshotId);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_SetAuthoritativeRestore(IVssBackupComponentsEx2* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,boolean bAuth) {
    return This->lpVtbl->SetAuthoritativeRestore(This,writerId,ct,wszLogicalPath,wszComponentName,bAuth);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_SetRollForward(IVssBackupComponentsEx2* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,VSS_ROLLFORWARD_TYPE rollType,LPCWSTR wszRollForwardPoint) {
    return This->lpVtbl->SetRollForward(This,writerId,ct,wszLogicalPath,wszComponentName,rollType,wszRollForwardPoint);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_SetRestoreName(IVssBackupComponentsEx2* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszRestoreName) {
    return This->lpVtbl->SetRestoreName(This,writerId,ct,wszLogicalPath,wszComponentName,wszRestoreName);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_BreakSnapshotSetEx(IVssBackupComponentsEx2* This,VSS_ID SnapshotSetID,DWORD dwBreakFlags,IVssAsync **ppAsync) {
    return This->lpVtbl->BreakSnapshotSetEx(This,SnapshotSetID,dwBreakFlags,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_PreFastRecovery(IVssBackupComponentsEx2* This,VSS_ID SnapshotSetID,DWORD dwPreFastRecoveryFlags,IVssAsync **ppAsync) {
    return This->lpVtbl->PreFastRecovery(This,SnapshotSetID,dwPreFastRecoveryFlags,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx2_FastRecovery(IVssBackupComponentsEx2* This,VSS_ID SnapshotSetID,DWORD dwFastRecoveryFlags,IVssAsync **ppAsync) {
    return This->lpVtbl->FastRecovery(This,SnapshotSetID,dwFastRecoveryFlags,ppAsync);
}
#endif
#endif

#endif


#endif  /* __IVssBackupComponentsEx2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssBackupComponentsEx3 interface
 */
#ifndef __IVssBackupComponentsEx3_INTERFACE_DEFINED__
#define __IVssBackupComponentsEx3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssBackupComponentsEx3, 0xc191bfbc, 0xb602, 0x4675, 0x8b,0xd1, 0x67,0xd6,0x42,0xf5,0x29,0xd5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c191bfbc-b602-4675-8bd1-67d642f529d5")
IVssBackupComponentsEx3 : public IVssBackupComponentsEx2
{
    virtual HRESULT STDMETHODCALLTYPE GetWriterStatusEx(
        UINT iWriter,
        VSS_ID *pidInstance,
        VSS_ID *pidWriter,
        BSTR *pbstrWriter,
        VSS_WRITER_STATE *pnStatus,
        HRESULT *phrFailureWriter,
        HRESULT *phrApplication = 0,
        BSTR *pbstrApplicationMessage = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddSnapshotToRecoverySet(
        VSS_ID snapshotId,
        DWORD dwFlags,
        VSS_PWSZ pwszDestinationVolume = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE RecoverSet(
        DWORD dwFlags,
        IVssAsync **ppAsync) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSessionId(
        VSS_ID *idSession) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssBackupComponentsEx3, 0xc191bfbc, 0xb602, 0x4675, 0x8b,0xd1, 0x67,0xd6,0x42,0xf5,0x29,0xd5)
#endif
#else
typedef struct IVssBackupComponentsEx3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVssBackupComponents methods ***/
    HRESULT (STDMETHODCALLTYPE *GetWriterComponentsCount)(
        IVssBackupComponentsEx3 *This,
        UINT *pcComponents);

    HRESULT (STDMETHODCALLTYPE *GetWriterComponents)(
        IVssBackupComponentsEx3 *This,
        UINT iWriter,
        IVssWriterComponentsExt **ppWriter);

    HRESULT (STDMETHODCALLTYPE *InitializeForBackup)(
        IVssBackupComponentsEx3 *This,
        BSTR bstrXML);

    HRESULT (STDMETHODCALLTYPE *SetBackupState)(
        IVssBackupComponentsEx3 *This,
        boolean bSelectComponents,
        boolean bBackupBootableSystemState,
        VSS_BACKUP_TYPE backupType,
        boolean bPartialFileSupport);

    HRESULT (STDMETHODCALLTYPE *InitializeForRestore)(
        IVssBackupComponentsEx3 *This,
        BSTR bstrXML);

    HRESULT (STDMETHODCALLTYPE *SetRestoreState)(
        IVssBackupComponentsEx3 *This,
        VSS_RESTORE_TYPE restoreType);

    HRESULT (STDMETHODCALLTYPE *GatherWriterMetadata)(
        IVssBackupComponentsEx3 *This,
        IVssAsync **pAsync);

    HRESULT (STDMETHODCALLTYPE *GetWriterMetadataCount)(
        IVssBackupComponentsEx3 *This,
        UINT *pcWriters);

    HRESULT (STDMETHODCALLTYPE *GetWriterMetadata)(
        IVssBackupComponentsEx3 *This,
        UINT iWriter,
        VSS_ID *pidInstance,
        IVssExamineWriterMetadata **ppMetadata);

    HRESULT (STDMETHODCALLTYPE *FreeWriterMetadata)(
        IVssBackupComponentsEx3 *This);

    HRESULT (STDMETHODCALLTYPE *AddComponent)(
        IVssBackupComponentsEx3 *This,
        VSS_ID instanceId,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName);

    HRESULT (STDMETHODCALLTYPE *PrepareForBackup)(
        IVssBackupComponentsEx3 *This,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *AbortBackup)(
        IVssBackupComponentsEx3 *This);

    HRESULT (STDMETHODCALLTYPE *GatherWriterStatus)(
        IVssBackupComponentsEx3 *This,
        IVssAsync **pAsync);

    HRESULT (STDMETHODCALLTYPE *GetWriterStatusCount)(
        IVssBackupComponentsEx3 *This,
        UINT *pcWriters);

    HRESULT (STDMETHODCALLTYPE *FreeWriterStatus)(
        IVssBackupComponentsEx3 *This);

    HRESULT (STDMETHODCALLTYPE *GetWriterStatus)(
        IVssBackupComponentsEx3 *This,
        UINT iWriter,
        VSS_ID *pidInstance,
        VSS_ID *pidWriter,
        BSTR *pbstrWriter,
        VSS_WRITER_STATE *pnStatus,
        HRESULT *phResultFailure);

    HRESULT (STDMETHODCALLTYPE *SetBackupSucceeded)(
        IVssBackupComponentsEx3 *This,
        VSS_ID instanceId,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bSucceded);

    HRESULT (STDMETHODCALLTYPE *SetBackupOptions)(
        IVssBackupComponentsEx3 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszBackupOptions);

    HRESULT (STDMETHODCALLTYPE *SetSelectedForRestore)(
        IVssBackupComponentsEx3 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bSelectedForRestore);

    HRESULT (STDMETHODCALLTYPE *SetRestoreOptions)(
        IVssBackupComponentsEx3 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszRestoreOptions);

    HRESULT (STDMETHODCALLTYPE *SetAdditionalRestores)(
        IVssBackupComponentsEx3 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bAdditionalRestores);

    HRESULT (STDMETHODCALLTYPE *SetPreviousBackupStamp)(
        IVssBackupComponentsEx3 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszPreviousBackupStamp);

    HRESULT (STDMETHODCALLTYPE *SaveAsXML)(
        IVssBackupComponentsEx3 *This,
        BSTR *pbstrXML);

    HRESULT (STDMETHODCALLTYPE *BackupComplete)(
        IVssBackupComponentsEx3 *This,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *AddAlternativeLocationMapping)(
        IVssBackupComponentsEx3 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE componentType,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        boolean bRecursive,
        LPCWSTR wszDestination);

    HRESULT (STDMETHODCALLTYPE *AddRestoreSubcomponent)(
        IVssBackupComponentsEx3 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE componentType,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszSubComponentLogicalPath,
        LPCWSTR wszSubComponentName,
        boolean bRepair);

    HRESULT (STDMETHODCALLTYPE *SetFileRestoreStatus)(
        IVssBackupComponentsEx3 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        VSS_FILE_RESTORE_STATUS status);

    HRESULT (STDMETHODCALLTYPE *AddNewTarget)(
        IVssBackupComponentsEx3 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszPath,
        LPCWSTR wszFileName,
        boolean bRecursive,
        LPCWSTR wszAlternatePath);

    HRESULT (STDMETHODCALLTYPE *SetRangesFilePath)(
        IVssBackupComponentsEx3 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        UINT iPartialFile,
        LPCWSTR wszRangesFile);

    HRESULT (STDMETHODCALLTYPE *PreRestore)(
        IVssBackupComponentsEx3 *This,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *PostRestore)(
        IVssBackupComponentsEx3 *This,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *SetContext)(
        IVssBackupComponentsEx3 *This,
        LONG lContext);

    HRESULT (STDMETHODCALLTYPE *StartSnapshotSet)(
        IVssBackupComponentsEx3 *This,
        VSS_ID *pSnapshotSetId);

    HRESULT (STDMETHODCALLTYPE *AddToSnapshotSet)(
        IVssBackupComponentsEx3 *This,
        VSS_PWSZ pwszVolumeName,
        VSS_ID ProviderId,
        VSS_ID *pidSnapshot);

    HRESULT (STDMETHODCALLTYPE *DoSnapshotSet)(
        IVssBackupComponentsEx3 *This,
        IVssAsync **ppAsync);

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

    HRESULT (STDMETHODCALLTYPE *ImportSnapshots)(
        IVssBackupComponentsEx3 *This,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *BreakSnapshotSet)(
        IVssBackupComponentsEx3 *This,
        VSS_ID SnapshotSetId);

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

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

    HRESULT (STDMETHODCALLTYPE *IsVolumeSupported)(
        IVssBackupComponentsEx3 *This,
        VSS_ID ProviderId,
        VSS_PWSZ pwszVolumeName,
        WINBOOL *pbSupportedByThisProvider);

    HRESULT (STDMETHODCALLTYPE *DisableWriterClasses)(
        IVssBackupComponentsEx3 *This,
        const VSS_ID *rgWriterClassId,
        UINT cClassId);

    HRESULT (STDMETHODCALLTYPE *EnableWriterClasses)(
        IVssBackupComponentsEx3 *This,
        const VSS_ID *rgWriterClassId,
        UINT cClassId);

    HRESULT (STDMETHODCALLTYPE *DisableWriterInstances)(
        IVssBackupComponentsEx3 *This,
        const VSS_ID *rgWriterInstanceId,
        UINT cInstanceId);

    HRESULT (STDMETHODCALLTYPE *ExposeSnapshot)(
        IVssBackupComponentsEx3 *This,
        VSS_ID SnapshotId,
        VSS_PWSZ wszPathFromRoot,
        LONG lAttributes,
        VSS_PWSZ wszExpose,
        VSS_PWSZ *pwszExposed);

    HRESULT (STDMETHODCALLTYPE *RevertToSnapshot)(
        IVssBackupComponentsEx3 *This,
        VSS_ID SnapshotId,
        WINBOOL bForceDismount);

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

    /*** IVssBackupComponentsEx methods ***/
    HRESULT (STDMETHODCALLTYPE *GetWriterMetadataEx)(
        IVssBackupComponentsEx3 *This,
        UINT iWriter,
        VSS_ID *pidInstance,
        IVssExamineWriterMetadataEx **ppMetadata);

    HRESULT (STDMETHODCALLTYPE *SetSelectedForRestoreEx)(
        IVssBackupComponentsEx3 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bSelectedForRestore,
        VSS_ID instanceId);

    /*** IVssBackupComponentsEx2 methods ***/
    HRESULT (STDMETHODCALLTYPE *UnexposeSnapshot)(
        IVssBackupComponentsEx3 *This,
        VSS_ID snapshotId);

    HRESULT (STDMETHODCALLTYPE *SetAuthoritativeRestore)(
        IVssBackupComponentsEx3 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bAuth);

    HRESULT (STDMETHODCALLTYPE *SetRollForward)(
        IVssBackupComponentsEx3 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        VSS_ROLLFORWARD_TYPE rollType,
        LPCWSTR wszRollForwardPoint);

    HRESULT (STDMETHODCALLTYPE *SetRestoreName)(
        IVssBackupComponentsEx3 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszRestoreName);

    HRESULT (STDMETHODCALLTYPE *BreakSnapshotSetEx)(
        IVssBackupComponentsEx3 *This,
        VSS_ID SnapshotSetID,
        DWORD dwBreakFlags,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *PreFastRecovery)(
        IVssBackupComponentsEx3 *This,
        VSS_ID SnapshotSetID,
        DWORD dwPreFastRecoveryFlags,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *FastRecovery)(
        IVssBackupComponentsEx3 *This,
        VSS_ID SnapshotSetID,
        DWORD dwFastRecoveryFlags,
        IVssAsync **ppAsync);

    /*** IVssBackupComponentsEx3 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetWriterStatusEx)(
        IVssBackupComponentsEx3 *This,
        UINT iWriter,
        VSS_ID *pidInstance,
        VSS_ID *pidWriter,
        BSTR *pbstrWriter,
        VSS_WRITER_STATE *pnStatus,
        HRESULT *phrFailureWriter,
        HRESULT *phrApplication,
        BSTR *pbstrApplicationMessage);

    HRESULT (STDMETHODCALLTYPE *AddSnapshotToRecoverySet)(
        IVssBackupComponentsEx3 *This,
        VSS_ID snapshotId,
        DWORD dwFlags,
        VSS_PWSZ pwszDestinationVolume);

    HRESULT (STDMETHODCALLTYPE *RecoverSet)(
        IVssBackupComponentsEx3 *This,
        DWORD dwFlags,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *GetSessionId)(
        IVssBackupComponentsEx3 *This,
        VSS_ID *idSession);

    END_INTERFACE
} IVssBackupComponentsEx3Vtbl;

interface IVssBackupComponentsEx3 {
    CONST_VTBL IVssBackupComponentsEx3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssBackupComponentsEx3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssBackupComponentsEx3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssBackupComponentsEx3_Release(This) (This)->lpVtbl->Release(This)
/*** IVssBackupComponents methods ***/
#define IVssBackupComponentsEx3_GetWriterComponentsCount(This,pcComponents) (This)->lpVtbl->GetWriterComponentsCount(This,pcComponents)
#define IVssBackupComponentsEx3_GetWriterComponents(This,iWriter,ppWriter) (This)->lpVtbl->GetWriterComponents(This,iWriter,ppWriter)
#define IVssBackupComponentsEx3_InitializeForBackup(This,bstrXML) (This)->lpVtbl->InitializeForBackup(This,bstrXML)
#define IVssBackupComponentsEx3_SetBackupState(This,bSelectComponents,bBackupBootableSystemState,backupType,bPartialFileSupport) (This)->lpVtbl->SetBackupState(This,bSelectComponents,bBackupBootableSystemState,backupType,bPartialFileSupport)
#define IVssBackupComponentsEx3_InitializeForRestore(This,bstrXML) (This)->lpVtbl->InitializeForRestore(This,bstrXML)
#define IVssBackupComponentsEx3_SetRestoreState(This,restoreType) (This)->lpVtbl->SetRestoreState(This,restoreType)
#define IVssBackupComponentsEx3_GatherWriterMetadata(This,pAsync) (This)->lpVtbl->GatherWriterMetadata(This,pAsync)
#define IVssBackupComponentsEx3_GetWriterMetadataCount(This,pcWriters) (This)->lpVtbl->GetWriterMetadataCount(This,pcWriters)
#define IVssBackupComponentsEx3_GetWriterMetadata(This,iWriter,pidInstance,ppMetadata) (This)->lpVtbl->GetWriterMetadata(This,iWriter,pidInstance,ppMetadata)
#define IVssBackupComponentsEx3_FreeWriterMetadata(This) (This)->lpVtbl->FreeWriterMetadata(This)
#define IVssBackupComponentsEx3_AddComponent(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName) (This)->lpVtbl->AddComponent(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName)
#define IVssBackupComponentsEx3_PrepareForBackup(This,ppAsync) (This)->lpVtbl->PrepareForBackup(This,ppAsync)
#define IVssBackupComponentsEx3_AbortBackup(This) (This)->lpVtbl->AbortBackup(This)
#define IVssBackupComponentsEx3_GatherWriterStatus(This,pAsync) (This)->lpVtbl->GatherWriterStatus(This,pAsync)
#define IVssBackupComponentsEx3_GetWriterStatusCount(This,pcWriters) (This)->lpVtbl->GetWriterStatusCount(This,pcWriters)
#define IVssBackupComponentsEx3_FreeWriterStatus(This) (This)->lpVtbl->FreeWriterStatus(This)
#define IVssBackupComponentsEx3_GetWriterStatus(This,iWriter,pidInstance,pidWriter,pbstrWriter,pnStatus,phResultFailure) (This)->lpVtbl->GetWriterStatus(This,iWriter,pidInstance,pidWriter,pbstrWriter,pnStatus,phResultFailure)
#define IVssBackupComponentsEx3_SetBackupSucceeded(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName,bSucceded) (This)->lpVtbl->SetBackupSucceeded(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName,bSucceded)
#define IVssBackupComponentsEx3_SetBackupOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszBackupOptions) (This)->lpVtbl->SetBackupOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszBackupOptions)
#define IVssBackupComponentsEx3_SetSelectedForRestore(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore) (This)->lpVtbl->SetSelectedForRestore(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore)
#define IVssBackupComponentsEx3_SetRestoreOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszRestoreOptions) (This)->lpVtbl->SetRestoreOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszRestoreOptions)
#define IVssBackupComponentsEx3_SetAdditionalRestores(This,writerId,ct,wszLogicalPath,wszComponentName,bAdditionalRestores) (This)->lpVtbl->SetAdditionalRestores(This,writerId,ct,wszLogicalPath,wszComponentName,bAdditionalRestores)
#define IVssBackupComponentsEx3_SetPreviousBackupStamp(This,writerId,ct,wszLogicalPath,wszComponentName,wszPreviousBackupStamp) (This)->lpVtbl->SetPreviousBackupStamp(This,writerId,ct,wszLogicalPath,wszComponentName,wszPreviousBackupStamp)
#define IVssBackupComponentsEx3_SaveAsXML(This,pbstrXML) (This)->lpVtbl->SaveAsXML(This,pbstrXML)
#define IVssBackupComponentsEx3_BackupComplete(This,ppAsync) (This)->lpVtbl->BackupComplete(This,ppAsync)
#define IVssBackupComponentsEx3_AddAlternativeLocationMapping(This,writerId,componentType,wszLogicalPath,wszComponentName,wszPath,wszFilespec,bRecursive,wszDestination) (This)->lpVtbl->AddAlternativeLocationMapping(This,writerId,componentType,wszLogicalPath,wszComponentName,wszPath,wszFilespec,bRecursive,wszDestination)
#define IVssBackupComponentsEx3_AddRestoreSubcomponent(This,writerId,componentType,wszLogicalPath,wszComponentName,wszSubComponentLogicalPath,wszSubComponentName,bRepair) (This)->lpVtbl->AddRestoreSubcomponent(This,writerId,componentType,wszLogicalPath,wszComponentName,wszSubComponentLogicalPath,wszSubComponentName,bRepair)
#define IVssBackupComponentsEx3_SetFileRestoreStatus(This,writerId,ct,wszLogicalPath,wszComponentName,status) (This)->lpVtbl->SetFileRestoreStatus(This,writerId,ct,wszLogicalPath,wszComponentName,status)
#define IVssBackupComponentsEx3_AddNewTarget(This,writerId,ct,wszLogicalPath,wszComponentName,wszPath,wszFileName,bRecursive,wszAlternatePath) (This)->lpVtbl->AddNewTarget(This,writerId,ct,wszLogicalPath,wszComponentName,wszPath,wszFileName,bRecursive,wszAlternatePath)
#define IVssBackupComponentsEx3_SetRangesFilePath(This,writerId,ct,wszLogicalPath,wszComponentName,iPartialFile,wszRangesFile) (This)->lpVtbl->SetRangesFilePath(This,writerId,ct,wszLogicalPath,wszComponentName,iPartialFile,wszRangesFile)
#define IVssBackupComponentsEx3_PreRestore(This,ppAsync) (This)->lpVtbl->PreRestore(This,ppAsync)
#define IVssBackupComponentsEx3_PostRestore(This,ppAsync) (This)->lpVtbl->PostRestore(This,ppAsync)
#define IVssBackupComponentsEx3_SetContext(This,lContext) (This)->lpVtbl->SetContext(This,lContext)
#define IVssBackupComponentsEx3_StartSnapshotSet(This,pSnapshotSetId) (This)->lpVtbl->StartSnapshotSet(This,pSnapshotSetId)
#define IVssBackupComponentsEx3_AddToSnapshotSet(This,pwszVolumeName,ProviderId,pidSnapshot) (This)->lpVtbl->AddToSnapshotSet(This,pwszVolumeName,ProviderId,pidSnapshot)
#define IVssBackupComponentsEx3_DoSnapshotSet(This,ppAsync) (This)->lpVtbl->DoSnapshotSet(This,ppAsync)
#define IVssBackupComponentsEx3_DeleteSnapshots(This,SourceObjectId,eSourceObjectType,bForceDelete,plDeletedSnapshots,pNondeletedSnapshotID) (This)->lpVtbl->DeleteSnapshots(This,SourceObjectId,eSourceObjectType,bForceDelete,plDeletedSnapshots,pNondeletedSnapshotID)
#define IVssBackupComponentsEx3_ImportSnapshots(This,ppAsync) (This)->lpVtbl->ImportSnapshots(This,ppAsync)
#define IVssBackupComponentsEx3_BreakSnapshotSet(This,SnapshotSetId) (This)->lpVtbl->BreakSnapshotSet(This,SnapshotSetId)
#define IVssBackupComponentsEx3_GetSnapshotProperties(This,SnapshotId,pProp) (This)->lpVtbl->GetSnapshotProperties(This,SnapshotId,pProp)
#define IVssBackupComponentsEx3_Query(This,QueriedObjectId,eQueriedObjectType,eReturnedObjectsType,ppEnum) (This)->lpVtbl->Query(This,QueriedObjectId,eQueriedObjectType,eReturnedObjectsType,ppEnum)
#define IVssBackupComponentsEx3_IsVolumeSupported(This,ProviderId,pwszVolumeName,pbSupportedByThisProvider) (This)->lpVtbl->IsVolumeSupported(This,ProviderId,pwszVolumeName,pbSupportedByThisProvider)
#define IVssBackupComponentsEx3_DisableWriterClasses(This,rgWriterClassId,cClassId) (This)->lpVtbl->DisableWriterClasses(This,rgWriterClassId,cClassId)
#define IVssBackupComponentsEx3_EnableWriterClasses(This,rgWriterClassId,cClassId) (This)->lpVtbl->EnableWriterClasses(This,rgWriterClassId,cClassId)
#define IVssBackupComponentsEx3_DisableWriterInstances(This,rgWriterInstanceId,cInstanceId) (This)->lpVtbl->DisableWriterInstances(This,rgWriterInstanceId,cInstanceId)
#define IVssBackupComponentsEx3_ExposeSnapshot(This,SnapshotId,wszPathFromRoot,lAttributes,wszExpose,pwszExposed) (This)->lpVtbl->ExposeSnapshot(This,SnapshotId,wszPathFromRoot,lAttributes,wszExpose,pwszExposed)
#define IVssBackupComponentsEx3_RevertToSnapshot(This,SnapshotId,bForceDismount) (This)->lpVtbl->RevertToSnapshot(This,SnapshotId,bForceDismount)
#define IVssBackupComponentsEx3_QueryRevertStatus(This,pwszVolume,ppAsync) (This)->lpVtbl->QueryRevertStatus(This,pwszVolume,ppAsync)
/*** IVssBackupComponentsEx methods ***/
#define IVssBackupComponentsEx3_GetWriterMetadataEx(This,iWriter,pidInstance,ppMetadata) (This)->lpVtbl->GetWriterMetadataEx(This,iWriter,pidInstance,ppMetadata)
#define IVssBackupComponentsEx3_SetSelectedForRestoreEx(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore,instanceId) (This)->lpVtbl->SetSelectedForRestoreEx(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore,instanceId)
/*** IVssBackupComponentsEx2 methods ***/
#define IVssBackupComponentsEx3_UnexposeSnapshot(This,snapshotId) (This)->lpVtbl->UnexposeSnapshot(This,snapshotId)
#define IVssBackupComponentsEx3_SetAuthoritativeRestore(This,writerId,ct,wszLogicalPath,wszComponentName,bAuth) (This)->lpVtbl->SetAuthoritativeRestore(This,writerId,ct,wszLogicalPath,wszComponentName,bAuth)
#define IVssBackupComponentsEx3_SetRollForward(This,writerId,ct,wszLogicalPath,wszComponentName,rollType,wszRollForwardPoint) (This)->lpVtbl->SetRollForward(This,writerId,ct,wszLogicalPath,wszComponentName,rollType,wszRollForwardPoint)
#define IVssBackupComponentsEx3_SetRestoreName(This,writerId,ct,wszLogicalPath,wszComponentName,wszRestoreName) (This)->lpVtbl->SetRestoreName(This,writerId,ct,wszLogicalPath,wszComponentName,wszRestoreName)
#define IVssBackupComponentsEx3_BreakSnapshotSetEx(This,SnapshotSetID,dwBreakFlags,ppAsync) (This)->lpVtbl->BreakSnapshotSetEx(This,SnapshotSetID,dwBreakFlags,ppAsync)
#define IVssBackupComponentsEx3_PreFastRecovery(This,SnapshotSetID,dwPreFastRecoveryFlags,ppAsync) (This)->lpVtbl->PreFastRecovery(This,SnapshotSetID,dwPreFastRecoveryFlags,ppAsync)
#define IVssBackupComponentsEx3_FastRecovery(This,SnapshotSetID,dwFastRecoveryFlags,ppAsync) (This)->lpVtbl->FastRecovery(This,SnapshotSetID,dwFastRecoveryFlags,ppAsync)
/*** IVssBackupComponentsEx3 methods ***/
#define IVssBackupComponentsEx3_GetWriterStatusEx(This,iWriter,pidInstance,pidWriter,pbstrWriter,pnStatus,phrFailureWriter,phrApplication,pbstrApplicationMessage) (This)->lpVtbl->GetWriterStatusEx(This,iWriter,pidInstance,pidWriter,pbstrWriter,pnStatus,phrFailureWriter,phrApplication,pbstrApplicationMessage)
#define IVssBackupComponentsEx3_AddSnapshotToRecoverySet(This,snapshotId,dwFlags,pwszDestinationVolume) (This)->lpVtbl->AddSnapshotToRecoverySet(This,snapshotId,dwFlags,pwszDestinationVolume)
#define IVssBackupComponentsEx3_RecoverSet(This,dwFlags,ppAsync) (This)->lpVtbl->RecoverSet(This,dwFlags,ppAsync)
#define IVssBackupComponentsEx3_GetSessionId(This,idSession) (This)->lpVtbl->GetSessionId(This,idSession)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_QueryInterface(IVssBackupComponentsEx3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVssBackupComponentsEx3_AddRef(IVssBackupComponentsEx3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVssBackupComponentsEx3_Release(IVssBackupComponentsEx3* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssBackupComponents methods ***/
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_GetWriterComponentsCount(IVssBackupComponentsEx3* This,UINT *pcComponents) {
    return This->lpVtbl->GetWriterComponentsCount(This,pcComponents);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_GetWriterComponents(IVssBackupComponentsEx3* This,UINT iWriter,IVssWriterComponentsExt **ppWriter) {
    return This->lpVtbl->GetWriterComponents(This,iWriter,ppWriter);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_InitializeForBackup(IVssBackupComponentsEx3* This,BSTR bstrXML) {
    return This->lpVtbl->InitializeForBackup(This,bstrXML);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_SetBackupState(IVssBackupComponentsEx3* This,boolean bSelectComponents,boolean bBackupBootableSystemState,VSS_BACKUP_TYPE backupType,boolean bPartialFileSupport) {
    return This->lpVtbl->SetBackupState(This,bSelectComponents,bBackupBootableSystemState,backupType,bPartialFileSupport);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_InitializeForRestore(IVssBackupComponentsEx3* This,BSTR bstrXML) {
    return This->lpVtbl->InitializeForRestore(This,bstrXML);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_SetRestoreState(IVssBackupComponentsEx3* This,VSS_RESTORE_TYPE restoreType) {
    return This->lpVtbl->SetRestoreState(This,restoreType);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_GatherWriterMetadata(IVssBackupComponentsEx3* This,IVssAsync **pAsync) {
    return This->lpVtbl->GatherWriterMetadata(This,pAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_GetWriterMetadataCount(IVssBackupComponentsEx3* This,UINT *pcWriters) {
    return This->lpVtbl->GetWriterMetadataCount(This,pcWriters);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_GetWriterMetadata(IVssBackupComponentsEx3* This,UINT iWriter,VSS_ID *pidInstance,IVssExamineWriterMetadata **ppMetadata) {
    return This->lpVtbl->GetWriterMetadata(This,iWriter,pidInstance,ppMetadata);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_FreeWriterMetadata(IVssBackupComponentsEx3* This) {
    return This->lpVtbl->FreeWriterMetadata(This);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_AddComponent(IVssBackupComponentsEx3* This,VSS_ID instanceId,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName) {
    return This->lpVtbl->AddComponent(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_PrepareForBackup(IVssBackupComponentsEx3* This,IVssAsync **ppAsync) {
    return This->lpVtbl->PrepareForBackup(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_AbortBackup(IVssBackupComponentsEx3* This) {
    return This->lpVtbl->AbortBackup(This);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_GatherWriterStatus(IVssBackupComponentsEx3* This,IVssAsync **pAsync) {
    return This->lpVtbl->GatherWriterStatus(This,pAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_GetWriterStatusCount(IVssBackupComponentsEx3* This,UINT *pcWriters) {
    return This->lpVtbl->GetWriterStatusCount(This,pcWriters);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_FreeWriterStatus(IVssBackupComponentsEx3* This) {
    return This->lpVtbl->FreeWriterStatus(This);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_GetWriterStatus(IVssBackupComponentsEx3* This,UINT iWriter,VSS_ID *pidInstance,VSS_ID *pidWriter,BSTR *pbstrWriter,VSS_WRITER_STATE *pnStatus,HRESULT *phResultFailure) {
    return This->lpVtbl->GetWriterStatus(This,iWriter,pidInstance,pidWriter,pbstrWriter,pnStatus,phResultFailure);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_SetBackupSucceeded(IVssBackupComponentsEx3* This,VSS_ID instanceId,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,boolean bSucceded) {
    return This->lpVtbl->SetBackupSucceeded(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName,bSucceded);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_SetBackupOptions(IVssBackupComponentsEx3* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszBackupOptions) {
    return This->lpVtbl->SetBackupOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszBackupOptions);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_SetSelectedForRestore(IVssBackupComponentsEx3* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,boolean bSelectedForRestore) {
    return This->lpVtbl->SetSelectedForRestore(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_SetRestoreOptions(IVssBackupComponentsEx3* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszRestoreOptions) {
    return This->lpVtbl->SetRestoreOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszRestoreOptions);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_SetAdditionalRestores(IVssBackupComponentsEx3* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,boolean bAdditionalRestores) {
    return This->lpVtbl->SetAdditionalRestores(This,writerId,ct,wszLogicalPath,wszComponentName,bAdditionalRestores);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_SetPreviousBackupStamp(IVssBackupComponentsEx3* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszPreviousBackupStamp) {
    return This->lpVtbl->SetPreviousBackupStamp(This,writerId,ct,wszLogicalPath,wszComponentName,wszPreviousBackupStamp);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_SaveAsXML(IVssBackupComponentsEx3* This,BSTR *pbstrXML) {
    return This->lpVtbl->SaveAsXML(This,pbstrXML);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_BackupComplete(IVssBackupComponentsEx3* This,IVssAsync **ppAsync) {
    return This->lpVtbl->BackupComplete(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_AddAlternativeLocationMapping(IVssBackupComponentsEx3* This,VSS_ID writerId,VSS_COMPONENT_TYPE componentType,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszPath,LPCWSTR wszFilespec,boolean bRecursive,LPCWSTR wszDestination) {
    return This->lpVtbl->AddAlternativeLocationMapping(This,writerId,componentType,wszLogicalPath,wszComponentName,wszPath,wszFilespec,bRecursive,wszDestination);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_AddRestoreSubcomponent(IVssBackupComponentsEx3* This,VSS_ID writerId,VSS_COMPONENT_TYPE componentType,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszSubComponentLogicalPath,LPCWSTR wszSubComponentName,boolean bRepair) {
    return This->lpVtbl->AddRestoreSubcomponent(This,writerId,componentType,wszLogicalPath,wszComponentName,wszSubComponentLogicalPath,wszSubComponentName,bRepair);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_SetFileRestoreStatus(IVssBackupComponentsEx3* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,VSS_FILE_RESTORE_STATUS status) {
    return This->lpVtbl->SetFileRestoreStatus(This,writerId,ct,wszLogicalPath,wszComponentName,status);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_AddNewTarget(IVssBackupComponentsEx3* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszPath,LPCWSTR wszFileName,boolean bRecursive,LPCWSTR wszAlternatePath) {
    return This->lpVtbl->AddNewTarget(This,writerId,ct,wszLogicalPath,wszComponentName,wszPath,wszFileName,bRecursive,wszAlternatePath);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_SetRangesFilePath(IVssBackupComponentsEx3* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,UINT iPartialFile,LPCWSTR wszRangesFile) {
    return This->lpVtbl->SetRangesFilePath(This,writerId,ct,wszLogicalPath,wszComponentName,iPartialFile,wszRangesFile);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_PreRestore(IVssBackupComponentsEx3* This,IVssAsync **ppAsync) {
    return This->lpVtbl->PreRestore(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_PostRestore(IVssBackupComponentsEx3* This,IVssAsync **ppAsync) {
    return This->lpVtbl->PostRestore(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_SetContext(IVssBackupComponentsEx3* This,LONG lContext) {
    return This->lpVtbl->SetContext(This,lContext);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_StartSnapshotSet(IVssBackupComponentsEx3* This,VSS_ID *pSnapshotSetId) {
    return This->lpVtbl->StartSnapshotSet(This,pSnapshotSetId);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_AddToSnapshotSet(IVssBackupComponentsEx3* This,VSS_PWSZ pwszVolumeName,VSS_ID ProviderId,VSS_ID *pidSnapshot) {
    return This->lpVtbl->AddToSnapshotSet(This,pwszVolumeName,ProviderId,pidSnapshot);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_DoSnapshotSet(IVssBackupComponentsEx3* This,IVssAsync **ppAsync) {
    return This->lpVtbl->DoSnapshotSet(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_DeleteSnapshots(IVssBackupComponentsEx3* 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 IVssBackupComponentsEx3_ImportSnapshots(IVssBackupComponentsEx3* This,IVssAsync **ppAsync) {
    return This->lpVtbl->ImportSnapshots(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_BreakSnapshotSet(IVssBackupComponentsEx3* This,VSS_ID SnapshotSetId) {
    return This->lpVtbl->BreakSnapshotSet(This,SnapshotSetId);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_GetSnapshotProperties(IVssBackupComponentsEx3* This,VSS_ID SnapshotId,VSS_SNAPSHOT_PROP *pProp) {
    return This->lpVtbl->GetSnapshotProperties(This,SnapshotId,pProp);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_Query(IVssBackupComponentsEx3* 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 IVssBackupComponentsEx3_IsVolumeSupported(IVssBackupComponentsEx3* This,VSS_ID ProviderId,VSS_PWSZ pwszVolumeName,WINBOOL *pbSupportedByThisProvider) {
    return This->lpVtbl->IsVolumeSupported(This,ProviderId,pwszVolumeName,pbSupportedByThisProvider);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_DisableWriterClasses(IVssBackupComponentsEx3* This,const VSS_ID *rgWriterClassId,UINT cClassId) {
    return This->lpVtbl->DisableWriterClasses(This,rgWriterClassId,cClassId);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_EnableWriterClasses(IVssBackupComponentsEx3* This,const VSS_ID *rgWriterClassId,UINT cClassId) {
    return This->lpVtbl->EnableWriterClasses(This,rgWriterClassId,cClassId);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_DisableWriterInstances(IVssBackupComponentsEx3* This,const VSS_ID *rgWriterInstanceId,UINT cInstanceId) {
    return This->lpVtbl->DisableWriterInstances(This,rgWriterInstanceId,cInstanceId);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_ExposeSnapshot(IVssBackupComponentsEx3* This,VSS_ID SnapshotId,VSS_PWSZ wszPathFromRoot,LONG lAttributes,VSS_PWSZ wszExpose,VSS_PWSZ *pwszExposed) {
    return This->lpVtbl->ExposeSnapshot(This,SnapshotId,wszPathFromRoot,lAttributes,wszExpose,pwszExposed);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_RevertToSnapshot(IVssBackupComponentsEx3* This,VSS_ID SnapshotId,WINBOOL bForceDismount) {
    return This->lpVtbl->RevertToSnapshot(This,SnapshotId,bForceDismount);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_QueryRevertStatus(IVssBackupComponentsEx3* This,VSS_PWSZ pwszVolume,IVssAsync **ppAsync) {
    return This->lpVtbl->QueryRevertStatus(This,pwszVolume,ppAsync);
}
/*** IVssBackupComponentsEx methods ***/
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_GetWriterMetadataEx(IVssBackupComponentsEx3* This,UINT iWriter,VSS_ID *pidInstance,IVssExamineWriterMetadataEx **ppMetadata) {
    return This->lpVtbl->GetWriterMetadataEx(This,iWriter,pidInstance,ppMetadata);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_SetSelectedForRestoreEx(IVssBackupComponentsEx3* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,boolean bSelectedForRestore,VSS_ID instanceId) {
    return This->lpVtbl->SetSelectedForRestoreEx(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore,instanceId);
}
/*** IVssBackupComponentsEx2 methods ***/
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_UnexposeSnapshot(IVssBackupComponentsEx3* This,VSS_ID snapshotId) {
    return This->lpVtbl->UnexposeSnapshot(This,snapshotId);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_SetAuthoritativeRestore(IVssBackupComponentsEx3* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,boolean bAuth) {
    return This->lpVtbl->SetAuthoritativeRestore(This,writerId,ct,wszLogicalPath,wszComponentName,bAuth);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_SetRollForward(IVssBackupComponentsEx3* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,VSS_ROLLFORWARD_TYPE rollType,LPCWSTR wszRollForwardPoint) {
    return This->lpVtbl->SetRollForward(This,writerId,ct,wszLogicalPath,wszComponentName,rollType,wszRollForwardPoint);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_SetRestoreName(IVssBackupComponentsEx3* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszRestoreName) {
    return This->lpVtbl->SetRestoreName(This,writerId,ct,wszLogicalPath,wszComponentName,wszRestoreName);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_BreakSnapshotSetEx(IVssBackupComponentsEx3* This,VSS_ID SnapshotSetID,DWORD dwBreakFlags,IVssAsync **ppAsync) {
    return This->lpVtbl->BreakSnapshotSetEx(This,SnapshotSetID,dwBreakFlags,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_PreFastRecovery(IVssBackupComponentsEx3* This,VSS_ID SnapshotSetID,DWORD dwPreFastRecoveryFlags,IVssAsync **ppAsync) {
    return This->lpVtbl->PreFastRecovery(This,SnapshotSetID,dwPreFastRecoveryFlags,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_FastRecovery(IVssBackupComponentsEx3* This,VSS_ID SnapshotSetID,DWORD dwFastRecoveryFlags,IVssAsync **ppAsync) {
    return This->lpVtbl->FastRecovery(This,SnapshotSetID,dwFastRecoveryFlags,ppAsync);
}
/*** IVssBackupComponentsEx3 methods ***/
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_GetWriterStatusEx(IVssBackupComponentsEx3* This,UINT iWriter,VSS_ID *pidInstance,VSS_ID *pidWriter,BSTR *pbstrWriter,VSS_WRITER_STATE *pnStatus,HRESULT *phrFailureWriter,HRESULT *phrApplication,BSTR *pbstrApplicationMessage) {
    return This->lpVtbl->GetWriterStatusEx(This,iWriter,pidInstance,pidWriter,pbstrWriter,pnStatus,phrFailureWriter,phrApplication,pbstrApplicationMessage);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_AddSnapshotToRecoverySet(IVssBackupComponentsEx3* This,VSS_ID snapshotId,DWORD dwFlags,VSS_PWSZ pwszDestinationVolume) {
    return This->lpVtbl->AddSnapshotToRecoverySet(This,snapshotId,dwFlags,pwszDestinationVolume);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_RecoverSet(IVssBackupComponentsEx3* This,DWORD dwFlags,IVssAsync **ppAsync) {
    return This->lpVtbl->RecoverSet(This,dwFlags,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx3_GetSessionId(IVssBackupComponentsEx3* This,VSS_ID *idSession) {
    return This->lpVtbl->GetSessionId(This,idSession);
}
#endif
#endif

#endif


#endif  /* __IVssBackupComponentsEx3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssBackupComponentsEx4 interface
 */
#ifndef __IVssBackupComponentsEx4_INTERFACE_DEFINED__
#define __IVssBackupComponentsEx4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssBackupComponentsEx4, 0xf434c2fd, 0xb553, 0x4961, 0xa9,0xf9, 0xa8,0xe9,0x0b,0x67,0x3e,0x53);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f434c2fd-b553-4961-a9f9-a8e90b673e53")
IVssBackupComponentsEx4 : public IVssBackupComponentsEx3
{
    virtual HRESULT STDMETHODCALLTYPE GetRootAndLogicalPrefixPaths(
        VSS_PWSZ pwszFilePath,
        VSS_PWSZ *ppwszRootPath,
        VSS_PWSZ *ppwszLogicalPrefix,
        WINBOOL bNormalizeFQDNforRootPath = FALSE) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssBackupComponentsEx4, 0xf434c2fd, 0xb553, 0x4961, 0xa9,0xf9, 0xa8,0xe9,0x0b,0x67,0x3e,0x53)
#endif
#else
typedef struct IVssBackupComponentsEx4Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVssBackupComponents methods ***/
    HRESULT (STDMETHODCALLTYPE *GetWriterComponentsCount)(
        IVssBackupComponentsEx4 *This,
        UINT *pcComponents);

    HRESULT (STDMETHODCALLTYPE *GetWriterComponents)(
        IVssBackupComponentsEx4 *This,
        UINT iWriter,
        IVssWriterComponentsExt **ppWriter);

    HRESULT (STDMETHODCALLTYPE *InitializeForBackup)(
        IVssBackupComponentsEx4 *This,
        BSTR bstrXML);

    HRESULT (STDMETHODCALLTYPE *SetBackupState)(
        IVssBackupComponentsEx4 *This,
        boolean bSelectComponents,
        boolean bBackupBootableSystemState,
        VSS_BACKUP_TYPE backupType,
        boolean bPartialFileSupport);

    HRESULT (STDMETHODCALLTYPE *InitializeForRestore)(
        IVssBackupComponentsEx4 *This,
        BSTR bstrXML);

    HRESULT (STDMETHODCALLTYPE *SetRestoreState)(
        IVssBackupComponentsEx4 *This,
        VSS_RESTORE_TYPE restoreType);

    HRESULT (STDMETHODCALLTYPE *GatherWriterMetadata)(
        IVssBackupComponentsEx4 *This,
        IVssAsync **pAsync);

    HRESULT (STDMETHODCALLTYPE *GetWriterMetadataCount)(
        IVssBackupComponentsEx4 *This,
        UINT *pcWriters);

    HRESULT (STDMETHODCALLTYPE *GetWriterMetadata)(
        IVssBackupComponentsEx4 *This,
        UINT iWriter,
        VSS_ID *pidInstance,
        IVssExamineWriterMetadata **ppMetadata);

    HRESULT (STDMETHODCALLTYPE *FreeWriterMetadata)(
        IVssBackupComponentsEx4 *This);

    HRESULT (STDMETHODCALLTYPE *AddComponent)(
        IVssBackupComponentsEx4 *This,
        VSS_ID instanceId,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName);

    HRESULT (STDMETHODCALLTYPE *PrepareForBackup)(
        IVssBackupComponentsEx4 *This,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *AbortBackup)(
        IVssBackupComponentsEx4 *This);

    HRESULT (STDMETHODCALLTYPE *GatherWriterStatus)(
        IVssBackupComponentsEx4 *This,
        IVssAsync **pAsync);

    HRESULT (STDMETHODCALLTYPE *GetWriterStatusCount)(
        IVssBackupComponentsEx4 *This,
        UINT *pcWriters);

    HRESULT (STDMETHODCALLTYPE *FreeWriterStatus)(
        IVssBackupComponentsEx4 *This);

    HRESULT (STDMETHODCALLTYPE *GetWriterStatus)(
        IVssBackupComponentsEx4 *This,
        UINT iWriter,
        VSS_ID *pidInstance,
        VSS_ID *pidWriter,
        BSTR *pbstrWriter,
        VSS_WRITER_STATE *pnStatus,
        HRESULT *phResultFailure);

    HRESULT (STDMETHODCALLTYPE *SetBackupSucceeded)(
        IVssBackupComponentsEx4 *This,
        VSS_ID instanceId,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bSucceded);

    HRESULT (STDMETHODCALLTYPE *SetBackupOptions)(
        IVssBackupComponentsEx4 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszBackupOptions);

    HRESULT (STDMETHODCALLTYPE *SetSelectedForRestore)(
        IVssBackupComponentsEx4 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bSelectedForRestore);

    HRESULT (STDMETHODCALLTYPE *SetRestoreOptions)(
        IVssBackupComponentsEx4 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszRestoreOptions);

    HRESULT (STDMETHODCALLTYPE *SetAdditionalRestores)(
        IVssBackupComponentsEx4 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bAdditionalRestores);

    HRESULT (STDMETHODCALLTYPE *SetPreviousBackupStamp)(
        IVssBackupComponentsEx4 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszPreviousBackupStamp);

    HRESULT (STDMETHODCALLTYPE *SaveAsXML)(
        IVssBackupComponentsEx4 *This,
        BSTR *pbstrXML);

    HRESULT (STDMETHODCALLTYPE *BackupComplete)(
        IVssBackupComponentsEx4 *This,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *AddAlternativeLocationMapping)(
        IVssBackupComponentsEx4 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE componentType,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        boolean bRecursive,
        LPCWSTR wszDestination);

    HRESULT (STDMETHODCALLTYPE *AddRestoreSubcomponent)(
        IVssBackupComponentsEx4 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE componentType,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszSubComponentLogicalPath,
        LPCWSTR wszSubComponentName,
        boolean bRepair);

    HRESULT (STDMETHODCALLTYPE *SetFileRestoreStatus)(
        IVssBackupComponentsEx4 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        VSS_FILE_RESTORE_STATUS status);

    HRESULT (STDMETHODCALLTYPE *AddNewTarget)(
        IVssBackupComponentsEx4 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszPath,
        LPCWSTR wszFileName,
        boolean bRecursive,
        LPCWSTR wszAlternatePath);

    HRESULT (STDMETHODCALLTYPE *SetRangesFilePath)(
        IVssBackupComponentsEx4 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        UINT iPartialFile,
        LPCWSTR wszRangesFile);

    HRESULT (STDMETHODCALLTYPE *PreRestore)(
        IVssBackupComponentsEx4 *This,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *PostRestore)(
        IVssBackupComponentsEx4 *This,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *SetContext)(
        IVssBackupComponentsEx4 *This,
        LONG lContext);

    HRESULT (STDMETHODCALLTYPE *StartSnapshotSet)(
        IVssBackupComponentsEx4 *This,
        VSS_ID *pSnapshotSetId);

    HRESULT (STDMETHODCALLTYPE *AddToSnapshotSet)(
        IVssBackupComponentsEx4 *This,
        VSS_PWSZ pwszVolumeName,
        VSS_ID ProviderId,
        VSS_ID *pidSnapshot);

    HRESULT (STDMETHODCALLTYPE *DoSnapshotSet)(
        IVssBackupComponentsEx4 *This,
        IVssAsync **ppAsync);

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

    HRESULT (STDMETHODCALLTYPE *ImportSnapshots)(
        IVssBackupComponentsEx4 *This,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *BreakSnapshotSet)(
        IVssBackupComponentsEx4 *This,
        VSS_ID SnapshotSetId);

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

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

    HRESULT (STDMETHODCALLTYPE *IsVolumeSupported)(
        IVssBackupComponentsEx4 *This,
        VSS_ID ProviderId,
        VSS_PWSZ pwszVolumeName,
        WINBOOL *pbSupportedByThisProvider);

    HRESULT (STDMETHODCALLTYPE *DisableWriterClasses)(
        IVssBackupComponentsEx4 *This,
        const VSS_ID *rgWriterClassId,
        UINT cClassId);

    HRESULT (STDMETHODCALLTYPE *EnableWriterClasses)(
        IVssBackupComponentsEx4 *This,
        const VSS_ID *rgWriterClassId,
        UINT cClassId);

    HRESULT (STDMETHODCALLTYPE *DisableWriterInstances)(
        IVssBackupComponentsEx4 *This,
        const VSS_ID *rgWriterInstanceId,
        UINT cInstanceId);

    HRESULT (STDMETHODCALLTYPE *ExposeSnapshot)(
        IVssBackupComponentsEx4 *This,
        VSS_ID SnapshotId,
        VSS_PWSZ wszPathFromRoot,
        LONG lAttributes,
        VSS_PWSZ wszExpose,
        VSS_PWSZ *pwszExposed);

    HRESULT (STDMETHODCALLTYPE *RevertToSnapshot)(
        IVssBackupComponentsEx4 *This,
        VSS_ID SnapshotId,
        WINBOOL bForceDismount);

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

    /*** IVssBackupComponentsEx methods ***/
    HRESULT (STDMETHODCALLTYPE *GetWriterMetadataEx)(
        IVssBackupComponentsEx4 *This,
        UINT iWriter,
        VSS_ID *pidInstance,
        IVssExamineWriterMetadataEx **ppMetadata);

    HRESULT (STDMETHODCALLTYPE *SetSelectedForRestoreEx)(
        IVssBackupComponentsEx4 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bSelectedForRestore,
        VSS_ID instanceId);

    /*** IVssBackupComponentsEx2 methods ***/
    HRESULT (STDMETHODCALLTYPE *UnexposeSnapshot)(
        IVssBackupComponentsEx4 *This,
        VSS_ID snapshotId);

    HRESULT (STDMETHODCALLTYPE *SetAuthoritativeRestore)(
        IVssBackupComponentsEx4 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        boolean bAuth);

    HRESULT (STDMETHODCALLTYPE *SetRollForward)(
        IVssBackupComponentsEx4 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        VSS_ROLLFORWARD_TYPE rollType,
        LPCWSTR wszRollForwardPoint);

    HRESULT (STDMETHODCALLTYPE *SetRestoreName)(
        IVssBackupComponentsEx4 *This,
        VSS_ID writerId,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszRestoreName);

    HRESULT (STDMETHODCALLTYPE *BreakSnapshotSetEx)(
        IVssBackupComponentsEx4 *This,
        VSS_ID SnapshotSetID,
        DWORD dwBreakFlags,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *PreFastRecovery)(
        IVssBackupComponentsEx4 *This,
        VSS_ID SnapshotSetID,
        DWORD dwPreFastRecoveryFlags,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *FastRecovery)(
        IVssBackupComponentsEx4 *This,
        VSS_ID SnapshotSetID,
        DWORD dwFastRecoveryFlags,
        IVssAsync **ppAsync);

    /*** IVssBackupComponentsEx3 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetWriterStatusEx)(
        IVssBackupComponentsEx4 *This,
        UINT iWriter,
        VSS_ID *pidInstance,
        VSS_ID *pidWriter,
        BSTR *pbstrWriter,
        VSS_WRITER_STATE *pnStatus,
        HRESULT *phrFailureWriter,
        HRESULT *phrApplication,
        BSTR *pbstrApplicationMessage);

    HRESULT (STDMETHODCALLTYPE *AddSnapshotToRecoverySet)(
        IVssBackupComponentsEx4 *This,
        VSS_ID snapshotId,
        DWORD dwFlags,
        VSS_PWSZ pwszDestinationVolume);

    HRESULT (STDMETHODCALLTYPE *RecoverSet)(
        IVssBackupComponentsEx4 *This,
        DWORD dwFlags,
        IVssAsync **ppAsync);

    HRESULT (STDMETHODCALLTYPE *GetSessionId)(
        IVssBackupComponentsEx4 *This,
        VSS_ID *idSession);

    /*** IVssBackupComponentsEx4 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetRootAndLogicalPrefixPaths)(
        IVssBackupComponentsEx4 *This,
        VSS_PWSZ pwszFilePath,
        VSS_PWSZ *ppwszRootPath,
        VSS_PWSZ *ppwszLogicalPrefix,
        WINBOOL bNormalizeFQDNforRootPath);

    END_INTERFACE
} IVssBackupComponentsEx4Vtbl;

interface IVssBackupComponentsEx4 {
    CONST_VTBL IVssBackupComponentsEx4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssBackupComponentsEx4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssBackupComponentsEx4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssBackupComponentsEx4_Release(This) (This)->lpVtbl->Release(This)
/*** IVssBackupComponents methods ***/
#define IVssBackupComponentsEx4_GetWriterComponentsCount(This,pcComponents) (This)->lpVtbl->GetWriterComponentsCount(This,pcComponents)
#define IVssBackupComponentsEx4_GetWriterComponents(This,iWriter,ppWriter) (This)->lpVtbl->GetWriterComponents(This,iWriter,ppWriter)
#define IVssBackupComponentsEx4_InitializeForBackup(This,bstrXML) (This)->lpVtbl->InitializeForBackup(This,bstrXML)
#define IVssBackupComponentsEx4_SetBackupState(This,bSelectComponents,bBackupBootableSystemState,backupType,bPartialFileSupport) (This)->lpVtbl->SetBackupState(This,bSelectComponents,bBackupBootableSystemState,backupType,bPartialFileSupport)
#define IVssBackupComponentsEx4_InitializeForRestore(This,bstrXML) (This)->lpVtbl->InitializeForRestore(This,bstrXML)
#define IVssBackupComponentsEx4_SetRestoreState(This,restoreType) (This)->lpVtbl->SetRestoreState(This,restoreType)
#define IVssBackupComponentsEx4_GatherWriterMetadata(This,pAsync) (This)->lpVtbl->GatherWriterMetadata(This,pAsync)
#define IVssBackupComponentsEx4_GetWriterMetadataCount(This,pcWriters) (This)->lpVtbl->GetWriterMetadataCount(This,pcWriters)
#define IVssBackupComponentsEx4_GetWriterMetadata(This,iWriter,pidInstance,ppMetadata) (This)->lpVtbl->GetWriterMetadata(This,iWriter,pidInstance,ppMetadata)
#define IVssBackupComponentsEx4_FreeWriterMetadata(This) (This)->lpVtbl->FreeWriterMetadata(This)
#define IVssBackupComponentsEx4_AddComponent(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName) (This)->lpVtbl->AddComponent(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName)
#define IVssBackupComponentsEx4_PrepareForBackup(This,ppAsync) (This)->lpVtbl->PrepareForBackup(This,ppAsync)
#define IVssBackupComponentsEx4_AbortBackup(This) (This)->lpVtbl->AbortBackup(This)
#define IVssBackupComponentsEx4_GatherWriterStatus(This,pAsync) (This)->lpVtbl->GatherWriterStatus(This,pAsync)
#define IVssBackupComponentsEx4_GetWriterStatusCount(This,pcWriters) (This)->lpVtbl->GetWriterStatusCount(This,pcWriters)
#define IVssBackupComponentsEx4_FreeWriterStatus(This) (This)->lpVtbl->FreeWriterStatus(This)
#define IVssBackupComponentsEx4_GetWriterStatus(This,iWriter,pidInstance,pidWriter,pbstrWriter,pnStatus,phResultFailure) (This)->lpVtbl->GetWriterStatus(This,iWriter,pidInstance,pidWriter,pbstrWriter,pnStatus,phResultFailure)
#define IVssBackupComponentsEx4_SetBackupSucceeded(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName,bSucceded) (This)->lpVtbl->SetBackupSucceeded(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName,bSucceded)
#define IVssBackupComponentsEx4_SetBackupOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszBackupOptions) (This)->lpVtbl->SetBackupOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszBackupOptions)
#define IVssBackupComponentsEx4_SetSelectedForRestore(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore) (This)->lpVtbl->SetSelectedForRestore(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore)
#define IVssBackupComponentsEx4_SetRestoreOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszRestoreOptions) (This)->lpVtbl->SetRestoreOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszRestoreOptions)
#define IVssBackupComponentsEx4_SetAdditionalRestores(This,writerId,ct,wszLogicalPath,wszComponentName,bAdditionalRestores) (This)->lpVtbl->SetAdditionalRestores(This,writerId,ct,wszLogicalPath,wszComponentName,bAdditionalRestores)
#define IVssBackupComponentsEx4_SetPreviousBackupStamp(This,writerId,ct,wszLogicalPath,wszComponentName,wszPreviousBackupStamp) (This)->lpVtbl->SetPreviousBackupStamp(This,writerId,ct,wszLogicalPath,wszComponentName,wszPreviousBackupStamp)
#define IVssBackupComponentsEx4_SaveAsXML(This,pbstrXML) (This)->lpVtbl->SaveAsXML(This,pbstrXML)
#define IVssBackupComponentsEx4_BackupComplete(This,ppAsync) (This)->lpVtbl->BackupComplete(This,ppAsync)
#define IVssBackupComponentsEx4_AddAlternativeLocationMapping(This,writerId,componentType,wszLogicalPath,wszComponentName,wszPath,wszFilespec,bRecursive,wszDestination) (This)->lpVtbl->AddAlternativeLocationMapping(This,writerId,componentType,wszLogicalPath,wszComponentName,wszPath,wszFilespec,bRecursive,wszDestination)
#define IVssBackupComponentsEx4_AddRestoreSubcomponent(This,writerId,componentType,wszLogicalPath,wszComponentName,wszSubComponentLogicalPath,wszSubComponentName,bRepair) (This)->lpVtbl->AddRestoreSubcomponent(This,writerId,componentType,wszLogicalPath,wszComponentName,wszSubComponentLogicalPath,wszSubComponentName,bRepair)
#define IVssBackupComponentsEx4_SetFileRestoreStatus(This,writerId,ct,wszLogicalPath,wszComponentName,status) (This)->lpVtbl->SetFileRestoreStatus(This,writerId,ct,wszLogicalPath,wszComponentName,status)
#define IVssBackupComponentsEx4_AddNewTarget(This,writerId,ct,wszLogicalPath,wszComponentName,wszPath,wszFileName,bRecursive,wszAlternatePath) (This)->lpVtbl->AddNewTarget(This,writerId,ct,wszLogicalPath,wszComponentName,wszPath,wszFileName,bRecursive,wszAlternatePath)
#define IVssBackupComponentsEx4_SetRangesFilePath(This,writerId,ct,wszLogicalPath,wszComponentName,iPartialFile,wszRangesFile) (This)->lpVtbl->SetRangesFilePath(This,writerId,ct,wszLogicalPath,wszComponentName,iPartialFile,wszRangesFile)
#define IVssBackupComponentsEx4_PreRestore(This,ppAsync) (This)->lpVtbl->PreRestore(This,ppAsync)
#define IVssBackupComponentsEx4_PostRestore(This,ppAsync) (This)->lpVtbl->PostRestore(This,ppAsync)
#define IVssBackupComponentsEx4_SetContext(This,lContext) (This)->lpVtbl->SetContext(This,lContext)
#define IVssBackupComponentsEx4_StartSnapshotSet(This,pSnapshotSetId) (This)->lpVtbl->StartSnapshotSet(This,pSnapshotSetId)
#define IVssBackupComponentsEx4_AddToSnapshotSet(This,pwszVolumeName,ProviderId,pidSnapshot) (This)->lpVtbl->AddToSnapshotSet(This,pwszVolumeName,ProviderId,pidSnapshot)
#define IVssBackupComponentsEx4_DoSnapshotSet(This,ppAsync) (This)->lpVtbl->DoSnapshotSet(This,ppAsync)
#define IVssBackupComponentsEx4_DeleteSnapshots(This,SourceObjectId,eSourceObjectType,bForceDelete,plDeletedSnapshots,pNondeletedSnapshotID) (This)->lpVtbl->DeleteSnapshots(This,SourceObjectId,eSourceObjectType,bForceDelete,plDeletedSnapshots,pNondeletedSnapshotID)
#define IVssBackupComponentsEx4_ImportSnapshots(This,ppAsync) (This)->lpVtbl->ImportSnapshots(This,ppAsync)
#define IVssBackupComponentsEx4_BreakSnapshotSet(This,SnapshotSetId) (This)->lpVtbl->BreakSnapshotSet(This,SnapshotSetId)
#define IVssBackupComponentsEx4_GetSnapshotProperties(This,SnapshotId,pProp) (This)->lpVtbl->GetSnapshotProperties(This,SnapshotId,pProp)
#define IVssBackupComponentsEx4_Query(This,QueriedObjectId,eQueriedObjectType,eReturnedObjectsType,ppEnum) (This)->lpVtbl->Query(This,QueriedObjectId,eQueriedObjectType,eReturnedObjectsType,ppEnum)
#define IVssBackupComponentsEx4_IsVolumeSupported(This,ProviderId,pwszVolumeName,pbSupportedByThisProvider) (This)->lpVtbl->IsVolumeSupported(This,ProviderId,pwszVolumeName,pbSupportedByThisProvider)
#define IVssBackupComponentsEx4_DisableWriterClasses(This,rgWriterClassId,cClassId) (This)->lpVtbl->DisableWriterClasses(This,rgWriterClassId,cClassId)
#define IVssBackupComponentsEx4_EnableWriterClasses(This,rgWriterClassId,cClassId) (This)->lpVtbl->EnableWriterClasses(This,rgWriterClassId,cClassId)
#define IVssBackupComponentsEx4_DisableWriterInstances(This,rgWriterInstanceId,cInstanceId) (This)->lpVtbl->DisableWriterInstances(This,rgWriterInstanceId,cInstanceId)
#define IVssBackupComponentsEx4_ExposeSnapshot(This,SnapshotId,wszPathFromRoot,lAttributes,wszExpose,pwszExposed) (This)->lpVtbl->ExposeSnapshot(This,SnapshotId,wszPathFromRoot,lAttributes,wszExpose,pwszExposed)
#define IVssBackupComponentsEx4_RevertToSnapshot(This,SnapshotId,bForceDismount) (This)->lpVtbl->RevertToSnapshot(This,SnapshotId,bForceDismount)
#define IVssBackupComponentsEx4_QueryRevertStatus(This,pwszVolume,ppAsync) (This)->lpVtbl->QueryRevertStatus(This,pwszVolume,ppAsync)
/*** IVssBackupComponentsEx methods ***/
#define IVssBackupComponentsEx4_GetWriterMetadataEx(This,iWriter,pidInstance,ppMetadata) (This)->lpVtbl->GetWriterMetadataEx(This,iWriter,pidInstance,ppMetadata)
#define IVssBackupComponentsEx4_SetSelectedForRestoreEx(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore,instanceId) (This)->lpVtbl->SetSelectedForRestoreEx(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore,instanceId)
/*** IVssBackupComponentsEx2 methods ***/
#define IVssBackupComponentsEx4_UnexposeSnapshot(This,snapshotId) (This)->lpVtbl->UnexposeSnapshot(This,snapshotId)
#define IVssBackupComponentsEx4_SetAuthoritativeRestore(This,writerId,ct,wszLogicalPath,wszComponentName,bAuth) (This)->lpVtbl->SetAuthoritativeRestore(This,writerId,ct,wszLogicalPath,wszComponentName,bAuth)
#define IVssBackupComponentsEx4_SetRollForward(This,writerId,ct,wszLogicalPath,wszComponentName,rollType,wszRollForwardPoint) (This)->lpVtbl->SetRollForward(This,writerId,ct,wszLogicalPath,wszComponentName,rollType,wszRollForwardPoint)
#define IVssBackupComponentsEx4_SetRestoreName(This,writerId,ct,wszLogicalPath,wszComponentName,wszRestoreName) (This)->lpVtbl->SetRestoreName(This,writerId,ct,wszLogicalPath,wszComponentName,wszRestoreName)
#define IVssBackupComponentsEx4_BreakSnapshotSetEx(This,SnapshotSetID,dwBreakFlags,ppAsync) (This)->lpVtbl->BreakSnapshotSetEx(This,SnapshotSetID,dwBreakFlags,ppAsync)
#define IVssBackupComponentsEx4_PreFastRecovery(This,SnapshotSetID,dwPreFastRecoveryFlags,ppAsync) (This)->lpVtbl->PreFastRecovery(This,SnapshotSetID,dwPreFastRecoveryFlags,ppAsync)
#define IVssBackupComponentsEx4_FastRecovery(This,SnapshotSetID,dwFastRecoveryFlags,ppAsync) (This)->lpVtbl->FastRecovery(This,SnapshotSetID,dwFastRecoveryFlags,ppAsync)
/*** IVssBackupComponentsEx3 methods ***/
#define IVssBackupComponentsEx4_GetWriterStatusEx(This,iWriter,pidInstance,pidWriter,pbstrWriter,pnStatus,phrFailureWriter,phrApplication,pbstrApplicationMessage) (This)->lpVtbl->GetWriterStatusEx(This,iWriter,pidInstance,pidWriter,pbstrWriter,pnStatus,phrFailureWriter,phrApplication,pbstrApplicationMessage)
#define IVssBackupComponentsEx4_AddSnapshotToRecoverySet(This,snapshotId,dwFlags,pwszDestinationVolume) (This)->lpVtbl->AddSnapshotToRecoverySet(This,snapshotId,dwFlags,pwszDestinationVolume)
#define IVssBackupComponentsEx4_RecoverSet(This,dwFlags,ppAsync) (This)->lpVtbl->RecoverSet(This,dwFlags,ppAsync)
#define IVssBackupComponentsEx4_GetSessionId(This,idSession) (This)->lpVtbl->GetSessionId(This,idSession)
/*** IVssBackupComponentsEx4 methods ***/
#define IVssBackupComponentsEx4_GetRootAndLogicalPrefixPaths(This,pwszFilePath,ppwszRootPath,ppwszLogicalPrefix,bNormalizeFQDNforRootPath) (This)->lpVtbl->GetRootAndLogicalPrefixPaths(This,pwszFilePath,ppwszRootPath,ppwszLogicalPrefix,bNormalizeFQDNforRootPath)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_QueryInterface(IVssBackupComponentsEx4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVssBackupComponentsEx4_AddRef(IVssBackupComponentsEx4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVssBackupComponentsEx4_Release(IVssBackupComponentsEx4* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssBackupComponents methods ***/
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_GetWriterComponentsCount(IVssBackupComponentsEx4* This,UINT *pcComponents) {
    return This->lpVtbl->GetWriterComponentsCount(This,pcComponents);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_GetWriterComponents(IVssBackupComponentsEx4* This,UINT iWriter,IVssWriterComponentsExt **ppWriter) {
    return This->lpVtbl->GetWriterComponents(This,iWriter,ppWriter);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_InitializeForBackup(IVssBackupComponentsEx4* This,BSTR bstrXML) {
    return This->lpVtbl->InitializeForBackup(This,bstrXML);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_SetBackupState(IVssBackupComponentsEx4* This,boolean bSelectComponents,boolean bBackupBootableSystemState,VSS_BACKUP_TYPE backupType,boolean bPartialFileSupport) {
    return This->lpVtbl->SetBackupState(This,bSelectComponents,bBackupBootableSystemState,backupType,bPartialFileSupport);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_InitializeForRestore(IVssBackupComponentsEx4* This,BSTR bstrXML) {
    return This->lpVtbl->InitializeForRestore(This,bstrXML);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_SetRestoreState(IVssBackupComponentsEx4* This,VSS_RESTORE_TYPE restoreType) {
    return This->lpVtbl->SetRestoreState(This,restoreType);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_GatherWriterMetadata(IVssBackupComponentsEx4* This,IVssAsync **pAsync) {
    return This->lpVtbl->GatherWriterMetadata(This,pAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_GetWriterMetadataCount(IVssBackupComponentsEx4* This,UINT *pcWriters) {
    return This->lpVtbl->GetWriterMetadataCount(This,pcWriters);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_GetWriterMetadata(IVssBackupComponentsEx4* This,UINT iWriter,VSS_ID *pidInstance,IVssExamineWriterMetadata **ppMetadata) {
    return This->lpVtbl->GetWriterMetadata(This,iWriter,pidInstance,ppMetadata);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_FreeWriterMetadata(IVssBackupComponentsEx4* This) {
    return This->lpVtbl->FreeWriterMetadata(This);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_AddComponent(IVssBackupComponentsEx4* This,VSS_ID instanceId,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName) {
    return This->lpVtbl->AddComponent(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_PrepareForBackup(IVssBackupComponentsEx4* This,IVssAsync **ppAsync) {
    return This->lpVtbl->PrepareForBackup(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_AbortBackup(IVssBackupComponentsEx4* This) {
    return This->lpVtbl->AbortBackup(This);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_GatherWriterStatus(IVssBackupComponentsEx4* This,IVssAsync **pAsync) {
    return This->lpVtbl->GatherWriterStatus(This,pAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_GetWriterStatusCount(IVssBackupComponentsEx4* This,UINT *pcWriters) {
    return This->lpVtbl->GetWriterStatusCount(This,pcWriters);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_FreeWriterStatus(IVssBackupComponentsEx4* This) {
    return This->lpVtbl->FreeWriterStatus(This);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_GetWriterStatus(IVssBackupComponentsEx4* This,UINT iWriter,VSS_ID *pidInstance,VSS_ID *pidWriter,BSTR *pbstrWriter,VSS_WRITER_STATE *pnStatus,HRESULT *phResultFailure) {
    return This->lpVtbl->GetWriterStatus(This,iWriter,pidInstance,pidWriter,pbstrWriter,pnStatus,phResultFailure);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_SetBackupSucceeded(IVssBackupComponentsEx4* This,VSS_ID instanceId,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,boolean bSucceded) {
    return This->lpVtbl->SetBackupSucceeded(This,instanceId,writerId,ct,wszLogicalPath,wszComponentName,bSucceded);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_SetBackupOptions(IVssBackupComponentsEx4* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszBackupOptions) {
    return This->lpVtbl->SetBackupOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszBackupOptions);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_SetSelectedForRestore(IVssBackupComponentsEx4* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,boolean bSelectedForRestore) {
    return This->lpVtbl->SetSelectedForRestore(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_SetRestoreOptions(IVssBackupComponentsEx4* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszRestoreOptions) {
    return This->lpVtbl->SetRestoreOptions(This,writerId,ct,wszLogicalPath,wszComponentName,wszRestoreOptions);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_SetAdditionalRestores(IVssBackupComponentsEx4* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,boolean bAdditionalRestores) {
    return This->lpVtbl->SetAdditionalRestores(This,writerId,ct,wszLogicalPath,wszComponentName,bAdditionalRestores);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_SetPreviousBackupStamp(IVssBackupComponentsEx4* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszPreviousBackupStamp) {
    return This->lpVtbl->SetPreviousBackupStamp(This,writerId,ct,wszLogicalPath,wszComponentName,wszPreviousBackupStamp);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_SaveAsXML(IVssBackupComponentsEx4* This,BSTR *pbstrXML) {
    return This->lpVtbl->SaveAsXML(This,pbstrXML);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_BackupComplete(IVssBackupComponentsEx4* This,IVssAsync **ppAsync) {
    return This->lpVtbl->BackupComplete(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_AddAlternativeLocationMapping(IVssBackupComponentsEx4* This,VSS_ID writerId,VSS_COMPONENT_TYPE componentType,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszPath,LPCWSTR wszFilespec,boolean bRecursive,LPCWSTR wszDestination) {
    return This->lpVtbl->AddAlternativeLocationMapping(This,writerId,componentType,wszLogicalPath,wszComponentName,wszPath,wszFilespec,bRecursive,wszDestination);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_AddRestoreSubcomponent(IVssBackupComponentsEx4* This,VSS_ID writerId,VSS_COMPONENT_TYPE componentType,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszSubComponentLogicalPath,LPCWSTR wszSubComponentName,boolean bRepair) {
    return This->lpVtbl->AddRestoreSubcomponent(This,writerId,componentType,wszLogicalPath,wszComponentName,wszSubComponentLogicalPath,wszSubComponentName,bRepair);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_SetFileRestoreStatus(IVssBackupComponentsEx4* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,VSS_FILE_RESTORE_STATUS status) {
    return This->lpVtbl->SetFileRestoreStatus(This,writerId,ct,wszLogicalPath,wszComponentName,status);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_AddNewTarget(IVssBackupComponentsEx4* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszPath,LPCWSTR wszFileName,boolean bRecursive,LPCWSTR wszAlternatePath) {
    return This->lpVtbl->AddNewTarget(This,writerId,ct,wszLogicalPath,wszComponentName,wszPath,wszFileName,bRecursive,wszAlternatePath);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_SetRangesFilePath(IVssBackupComponentsEx4* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,UINT iPartialFile,LPCWSTR wszRangesFile) {
    return This->lpVtbl->SetRangesFilePath(This,writerId,ct,wszLogicalPath,wszComponentName,iPartialFile,wszRangesFile);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_PreRestore(IVssBackupComponentsEx4* This,IVssAsync **ppAsync) {
    return This->lpVtbl->PreRestore(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_PostRestore(IVssBackupComponentsEx4* This,IVssAsync **ppAsync) {
    return This->lpVtbl->PostRestore(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_SetContext(IVssBackupComponentsEx4* This,LONG lContext) {
    return This->lpVtbl->SetContext(This,lContext);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_StartSnapshotSet(IVssBackupComponentsEx4* This,VSS_ID *pSnapshotSetId) {
    return This->lpVtbl->StartSnapshotSet(This,pSnapshotSetId);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_AddToSnapshotSet(IVssBackupComponentsEx4* This,VSS_PWSZ pwszVolumeName,VSS_ID ProviderId,VSS_ID *pidSnapshot) {
    return This->lpVtbl->AddToSnapshotSet(This,pwszVolumeName,ProviderId,pidSnapshot);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_DoSnapshotSet(IVssBackupComponentsEx4* This,IVssAsync **ppAsync) {
    return This->lpVtbl->DoSnapshotSet(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_DeleteSnapshots(IVssBackupComponentsEx4* 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 IVssBackupComponentsEx4_ImportSnapshots(IVssBackupComponentsEx4* This,IVssAsync **ppAsync) {
    return This->lpVtbl->ImportSnapshots(This,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_BreakSnapshotSet(IVssBackupComponentsEx4* This,VSS_ID SnapshotSetId) {
    return This->lpVtbl->BreakSnapshotSet(This,SnapshotSetId);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_GetSnapshotProperties(IVssBackupComponentsEx4* This,VSS_ID SnapshotId,VSS_SNAPSHOT_PROP *pProp) {
    return This->lpVtbl->GetSnapshotProperties(This,SnapshotId,pProp);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_Query(IVssBackupComponentsEx4* 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 IVssBackupComponentsEx4_IsVolumeSupported(IVssBackupComponentsEx4* This,VSS_ID ProviderId,VSS_PWSZ pwszVolumeName,WINBOOL *pbSupportedByThisProvider) {
    return This->lpVtbl->IsVolumeSupported(This,ProviderId,pwszVolumeName,pbSupportedByThisProvider);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_DisableWriterClasses(IVssBackupComponentsEx4* This,const VSS_ID *rgWriterClassId,UINT cClassId) {
    return This->lpVtbl->DisableWriterClasses(This,rgWriterClassId,cClassId);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_EnableWriterClasses(IVssBackupComponentsEx4* This,const VSS_ID *rgWriterClassId,UINT cClassId) {
    return This->lpVtbl->EnableWriterClasses(This,rgWriterClassId,cClassId);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_DisableWriterInstances(IVssBackupComponentsEx4* This,const VSS_ID *rgWriterInstanceId,UINT cInstanceId) {
    return This->lpVtbl->DisableWriterInstances(This,rgWriterInstanceId,cInstanceId);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_ExposeSnapshot(IVssBackupComponentsEx4* This,VSS_ID SnapshotId,VSS_PWSZ wszPathFromRoot,LONG lAttributes,VSS_PWSZ wszExpose,VSS_PWSZ *pwszExposed) {
    return This->lpVtbl->ExposeSnapshot(This,SnapshotId,wszPathFromRoot,lAttributes,wszExpose,pwszExposed);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_RevertToSnapshot(IVssBackupComponentsEx4* This,VSS_ID SnapshotId,WINBOOL bForceDismount) {
    return This->lpVtbl->RevertToSnapshot(This,SnapshotId,bForceDismount);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_QueryRevertStatus(IVssBackupComponentsEx4* This,VSS_PWSZ pwszVolume,IVssAsync **ppAsync) {
    return This->lpVtbl->QueryRevertStatus(This,pwszVolume,ppAsync);
}
/*** IVssBackupComponentsEx methods ***/
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_GetWriterMetadataEx(IVssBackupComponentsEx4* This,UINT iWriter,VSS_ID *pidInstance,IVssExamineWriterMetadataEx **ppMetadata) {
    return This->lpVtbl->GetWriterMetadataEx(This,iWriter,pidInstance,ppMetadata);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_SetSelectedForRestoreEx(IVssBackupComponentsEx4* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,boolean bSelectedForRestore,VSS_ID instanceId) {
    return This->lpVtbl->SetSelectedForRestoreEx(This,writerId,ct,wszLogicalPath,wszComponentName,bSelectedForRestore,instanceId);
}
/*** IVssBackupComponentsEx2 methods ***/
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_UnexposeSnapshot(IVssBackupComponentsEx4* This,VSS_ID snapshotId) {
    return This->lpVtbl->UnexposeSnapshot(This,snapshotId);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_SetAuthoritativeRestore(IVssBackupComponentsEx4* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,boolean bAuth) {
    return This->lpVtbl->SetAuthoritativeRestore(This,writerId,ct,wszLogicalPath,wszComponentName,bAuth);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_SetRollForward(IVssBackupComponentsEx4* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,VSS_ROLLFORWARD_TYPE rollType,LPCWSTR wszRollForwardPoint) {
    return This->lpVtbl->SetRollForward(This,writerId,ct,wszLogicalPath,wszComponentName,rollType,wszRollForwardPoint);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_SetRestoreName(IVssBackupComponentsEx4* This,VSS_ID writerId,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszRestoreName) {
    return This->lpVtbl->SetRestoreName(This,writerId,ct,wszLogicalPath,wszComponentName,wszRestoreName);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_BreakSnapshotSetEx(IVssBackupComponentsEx4* This,VSS_ID SnapshotSetID,DWORD dwBreakFlags,IVssAsync **ppAsync) {
    return This->lpVtbl->BreakSnapshotSetEx(This,SnapshotSetID,dwBreakFlags,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_PreFastRecovery(IVssBackupComponentsEx4* This,VSS_ID SnapshotSetID,DWORD dwPreFastRecoveryFlags,IVssAsync **ppAsync) {
    return This->lpVtbl->PreFastRecovery(This,SnapshotSetID,dwPreFastRecoveryFlags,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_FastRecovery(IVssBackupComponentsEx4* This,VSS_ID SnapshotSetID,DWORD dwFastRecoveryFlags,IVssAsync **ppAsync) {
    return This->lpVtbl->FastRecovery(This,SnapshotSetID,dwFastRecoveryFlags,ppAsync);
}
/*** IVssBackupComponentsEx3 methods ***/
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_GetWriterStatusEx(IVssBackupComponentsEx4* This,UINT iWriter,VSS_ID *pidInstance,VSS_ID *pidWriter,BSTR *pbstrWriter,VSS_WRITER_STATE *pnStatus,HRESULT *phrFailureWriter,HRESULT *phrApplication,BSTR *pbstrApplicationMessage) {
    return This->lpVtbl->GetWriterStatusEx(This,iWriter,pidInstance,pidWriter,pbstrWriter,pnStatus,phrFailureWriter,phrApplication,pbstrApplicationMessage);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_AddSnapshotToRecoverySet(IVssBackupComponentsEx4* This,VSS_ID snapshotId,DWORD dwFlags,VSS_PWSZ pwszDestinationVolume) {
    return This->lpVtbl->AddSnapshotToRecoverySet(This,snapshotId,dwFlags,pwszDestinationVolume);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_RecoverSet(IVssBackupComponentsEx4* This,DWORD dwFlags,IVssAsync **ppAsync) {
    return This->lpVtbl->RecoverSet(This,dwFlags,ppAsync);
}
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_GetSessionId(IVssBackupComponentsEx4* This,VSS_ID *idSession) {
    return This->lpVtbl->GetSessionId(This,idSession);
}
/*** IVssBackupComponentsEx4 methods ***/
static __WIDL_INLINE HRESULT IVssBackupComponentsEx4_GetRootAndLogicalPrefixPaths(IVssBackupComponentsEx4* This,VSS_PWSZ pwszFilePath,VSS_PWSZ *ppwszRootPath,VSS_PWSZ *ppwszLogicalPrefix,WINBOOL bNormalizeFQDNforRootPath) {
    return This->lpVtbl->GetRootAndLogicalPrefixPaths(This,pwszFilePath,ppwszRootPath,ppwszLogicalPrefix,bNormalizeFQDNforRootPath);
}
#endif
#endif

#endif


#endif  /* __IVssBackupComponentsEx4_INTERFACE_DEFINED__ */

#define VSS_SW_BOOTABLE_STATE (1 << 0)
HRESULT STDAPICALLTYPE CreateVssBackupComponentsInternal(IVssBackupComponents **ppBackup);
HRESULT STDAPICALLTYPE CreateVssExamineWriterMetadataInternal(BSTR bstrXML, IVssExamineWriterMetadata **ppMetadata);
HRESULT APIENTRY IsVolumeSnapshottedInternal(VSS_PWSZ pwszVolumeName, WINBOOL *pbSnapshotsPresent, LONG *plSnapshotCapability);
void APIENTRY VssFreeSnapshotPropertiesInternal(VSS_SNAPSHOT_PROP *pProp);
HRESULT APIENTRY GetProviderMgmtInterfaceInternal(VSS_ID ProviderId, IID InterfaceId, IUnknown **ppItf);
HRESULT APIENTRY ShouldBlockRevertInternal(LPCWSTR wszVolumeName, boolean *pbBlock);
static __inline HRESULT CreateVssBackupComponents(IVssBackupComponents **ppBackup) { return CreateVssBackupComponentsInternal(ppBackup); }
static __inline HRESULT CreateVssExamineWriterMetadata(BSTR bstrXML, IVssExamineWriterMetadata **ppMetadata) { return CreateVssExamineWriterMetadataInternal(bstrXML, ppMetadata); }
static __inline HRESULT IsVolumeSnapshotted(VSS_PWSZ pwszVolumeName, WINBOOL *pbSnapshotsPresent, LONG *plSnapshotCapability) { return IsVolumeSnapshottedInternal(pwszVolumeName, pbSnapshotsPresent, plSnapshotCapability); }
static __inline void VssFreeSnapshotProperties(VSS_SNAPSHOT_PROP *pProp) { return VssFreeSnapshotPropertiesInternal(pProp); }
static __inline HRESULT GetProviderMgmtInterface(VSS_ID ProviderId, IID InterfaceId, IUnknown **ppItf) { return GetProviderMgmtInterfaceInternal(ProviderId, InterfaceId, ppItf); }
static __inline HRESULT ShouldBlockRevert(LPCWSTR wszVolumeName, boolean *pbBlock) { return ShouldBlockRevertInternal(wszVolumeName, pbBlock); }
#endif /* WINAPI_PARTITION_DESKTOP */
/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
unsigned char * __RPC_USER BSTR_UserMarshal  (ULONG *, unsigned char *, BSTR *);
unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *);
void            __RPC_USER BSTR_UserFree     (ULONG *, BSTR *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __vsbackup_h__ */
