/*** Autogenerated by WIDL 8.21 from include/vswriter.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 __vswriter_h__
#define __vswriter_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 __IVssWMFiledesc_FWD_DEFINED__
#define __IVssWMFiledesc_FWD_DEFINED__
typedef interface IVssWMFiledesc IVssWMFiledesc;
#ifdef __cplusplus
interface IVssWMFiledesc;
#endif /* __cplusplus */
#endif

#ifndef __IVssWMDependency_FWD_DEFINED__
#define __IVssWMDependency_FWD_DEFINED__
typedef interface IVssWMDependency IVssWMDependency;
#ifdef __cplusplus
interface IVssWMDependency;
#endif /* __cplusplus */
#endif

#ifndef __IVssComponent_FWD_DEFINED__
#define __IVssComponent_FWD_DEFINED__
typedef interface IVssComponent IVssComponent;
#ifdef __cplusplus
interface IVssComponent;
#endif /* __cplusplus */
#endif

#ifndef __IVssWriterComponents_FWD_DEFINED__
#define __IVssWriterComponents_FWD_DEFINED__
typedef interface IVssWriterComponents IVssWriterComponents;
#ifdef __cplusplus
interface IVssWriterComponents;
#endif /* __cplusplus */
#endif

#ifndef __IVssComponentEx_FWD_DEFINED__
#define __IVssComponentEx_FWD_DEFINED__
typedef interface IVssComponentEx IVssComponentEx;
#ifdef __cplusplus
interface IVssComponentEx;
#endif /* __cplusplus */
#endif

#ifndef __IVssComponentEx2_FWD_DEFINED__
#define __IVssComponentEx2_FWD_DEFINED__
typedef interface IVssComponentEx2 IVssComponentEx2;
#ifdef __cplusplus
interface IVssComponentEx2;
#endif /* __cplusplus */
#endif

#ifndef __IVssCreateWriterMetadata_FWD_DEFINED__
#define __IVssCreateWriterMetadata_FWD_DEFINED__
typedef interface IVssCreateWriterMetadata IVssCreateWriterMetadata;
#ifdef __cplusplus
interface IVssCreateWriterMetadata;
#endif /* __cplusplus */
#endif

#ifndef __IVssCreateWriterMetadataEx_FWD_DEFINED__
#define __IVssCreateWriterMetadataEx_FWD_DEFINED__
typedef interface IVssCreateWriterMetadataEx IVssCreateWriterMetadataEx;
#ifdef __cplusplus
interface IVssCreateWriterMetadataEx;
#endif /* __cplusplus */
#endif

#ifndef __IVssWriterImpl_FWD_DEFINED__
#define __IVssWriterImpl_FWD_DEFINED__
typedef interface IVssWriterImpl IVssWriterImpl;
#ifdef __cplusplus
interface IVssWriterImpl;
#endif /* __cplusplus */
#endif

#ifndef __IVssCreateExpressWriterMetadata_FWD_DEFINED__
#define __IVssCreateExpressWriterMetadata_FWD_DEFINED__
typedef interface IVssCreateExpressWriterMetadata IVssCreateExpressWriterMetadata;
#ifdef __cplusplus
interface IVssCreateExpressWriterMetadata;
#endif /* __cplusplus */
#endif

#ifndef __IVssExpressWriter_FWD_DEFINED__
#define __IVssExpressWriter_FWD_DEFINED__
typedef interface IVssExpressWriter IVssExpressWriter;
#ifdef __cplusplus
interface IVssExpressWriter;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

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

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
#include "vsserror.h" 
typedef enum VSS_USAGE_TYPE {
    VSS_UT_UNDEFINED = 0,
    VSS_UT_BOOTABLESYSTEMSTATE = 1,
    VSS_UT_SYSTEMSERVICE = 2,
    VSS_UT_USERDATA = 3,
    VSS_UT_OTHER = 4
} VSS_USAGE_TYPE;
typedef enum VSS_SOURCE_TYPE {
    VSS_ST_UNDEFINED = 0,
    VSS_ST_TRANSACTEDDB = 1,
    VSS_ST_NONTRANSACTEDDB = 2,
    VSS_ST_OTHER = 3
} VSS_SOURCE_TYPE;
typedef enum VSS_RESTOREMETHOD_ENUM {
    VSS_RME_UNDEFINED = 0,
    VSS_RME_RESTORE_IF_NOT_THERE = 1,
    VSS_RME_RESTORE_IF_CAN_REPLACE = 2,
    VSS_RME_STOP_RESTORE_START = 3,
    VSS_RME_RESTORE_TO_ALTERNATE_LOCATION = 4,
    VSS_RME_RESTORE_AT_REBOOT = 5,
    VSS_RME_RESTORE_AT_REBOOT_IF_CANNOT_REPLACE = 6,
    VSS_RME_CUSTOM = 7,
    VSS_RME_RESTORE_STOP_START = 8
} VSS_RESTOREMETHOD_ENUM;
typedef enum VSS_WRITERRESTORE_ENUM {
    VSS_WRE_UNDEFINED = 0,
    VSS_WRE_NEVER = 1,
    VSS_WRE_IF_REPLACE_FAILS = 2,
    VSS_WRE_ALWAYS = 3
} VSS_WRITERRESTORE_ENUM;
typedef enum VSS_COMPONENT_TYPE {
    VSS_CT_UNDEFINED = 0,
    VSS_CT_DATABASE = 1,
    VSS_CT_FILEGROUP = 2
} VSS_COMPONENT_TYPE;
typedef enum VSS_ALTERNATE_WRITER_STATE {
    VSS_AWS_UNDEFINED = 0,
    VSS_AWS_NO_ALTERNATE_WRITER = 1,
    VSS_AWS_ALTERNATE_WRITER_EXISTS = 2,
    VSS_AWS_THIS_IS_ALTERNATE_WRITER = 3
} VSS_ALTERNATE_WRITER_STATE;
typedef enum VSS_SUBSCRIBE_MASK {
    VSS_SM_POST_SNAPSHOT_FLAG = 0x1,
    VSS_SM_BACKUP_EVENTS_FLAG = 0x2,
    VSS_SM_RESTORE_EVENTS_FLAG = 0x4,
    VSS_SM_IO_THROTTLING_FLAG = 0x8,
    VSS_SM_ALL_FLAGS = 0xffffffff
} VSS_SUBSCRIBE_MASK;
typedef enum VSS_RESTORE_TARGET {
    VSS_RT_UNDEFINED = 0,
    VSS_RT_ORIGINAL = 1,
    VSS_RT_ALTERNATE = 2,
    VSS_RT_DIRECTED = 3,
    VSS_RT_ORIGINAL_LOCATION = 4
} VSS_RESTORE_TARGET;
typedef enum VSS_FILE_RESTORE_STATUS {
    VSS_RS_UNDEFINED = 0,
    VSS_RS_NONE = 1,
    VSS_RS_ALL = 2,
    VSS_RS_FAILED = 3
} VSS_FILE_RESTORE_STATUS;
typedef enum VSS_COMPONENT_FLAGS {
    VSS_CF_BACKUP_RECOVERY = 0x1,
    VSS_CF_APP_ROLLBACK_RECOVERY = 0x2,
    VSS_CF_NOT_SYSTEM_STATE = 0x4
} VSS_COMPONENT_FLAGS;
#ifndef __IVssExamineWriterMetadata_FWD_DEFINED__
#define __IVssExamineWriterMetadata_FWD_DEFINED__
typedef interface IVssExamineWriterMetadata IVssExamineWriterMetadata;
#ifdef __cplusplus
interface IVssExamineWriterMetadata;
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * IVssWMFiledesc interface
 */
#ifndef __IVssWMFiledesc_INTERFACE_DEFINED__
#define __IVssWMFiledesc_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssWMFiledesc, 0x00000000, 0x0000, 0x0000, 0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00000000-0000-0000-0000-000000000000")
IVssWMFiledesc : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetPath(
        BSTR *pbstrPath) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFilespec(
        BSTR *pbstrFilespec) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRecursive(
        boolean *pbRecursive) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAlternateLocation(
        BSTR *pbstrAlternateLocation) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBackupTypeMask(
        DWORD *pdwTypeMask) = 0;

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

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

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

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

    /*** IVssWMFiledesc methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPath)(
        IVssWMFiledesc *This,
        BSTR *pbstrPath);

    HRESULT (STDMETHODCALLTYPE *GetFilespec)(
        IVssWMFiledesc *This,
        BSTR *pbstrFilespec);

    HRESULT (STDMETHODCALLTYPE *GetRecursive)(
        IVssWMFiledesc *This,
        boolean *pbRecursive);

    HRESULT (STDMETHODCALLTYPE *GetAlternateLocation)(
        IVssWMFiledesc *This,
        BSTR *pbstrAlternateLocation);

    HRESULT (STDMETHODCALLTYPE *GetBackupTypeMask)(
        IVssWMFiledesc *This,
        DWORD *pdwTypeMask);

    END_INTERFACE
} IVssWMFiledescVtbl;

interface IVssWMFiledesc {
    CONST_VTBL IVssWMFiledescVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssWMFiledesc_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssWMFiledesc_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssWMFiledesc_Release(This) (This)->lpVtbl->Release(This)
/*** IVssWMFiledesc methods ***/
#define IVssWMFiledesc_GetPath(This,pbstrPath) (This)->lpVtbl->GetPath(This,pbstrPath)
#define IVssWMFiledesc_GetFilespec(This,pbstrFilespec) (This)->lpVtbl->GetFilespec(This,pbstrFilespec)
#define IVssWMFiledesc_GetRecursive(This,pbRecursive) (This)->lpVtbl->GetRecursive(This,pbRecursive)
#define IVssWMFiledesc_GetAlternateLocation(This,pbstrAlternateLocation) (This)->lpVtbl->GetAlternateLocation(This,pbstrAlternateLocation)
#define IVssWMFiledesc_GetBackupTypeMask(This,pdwTypeMask) (This)->lpVtbl->GetBackupTypeMask(This,pdwTypeMask)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVssWMFiledesc_QueryInterface(IVssWMFiledesc* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVssWMFiledesc_AddRef(IVssWMFiledesc* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVssWMFiledesc_Release(IVssWMFiledesc* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssWMFiledesc methods ***/
static __WIDL_INLINE HRESULT IVssWMFiledesc_GetPath(IVssWMFiledesc* This,BSTR *pbstrPath) {
    return This->lpVtbl->GetPath(This,pbstrPath);
}
static __WIDL_INLINE HRESULT IVssWMFiledesc_GetFilespec(IVssWMFiledesc* This,BSTR *pbstrFilespec) {
    return This->lpVtbl->GetFilespec(This,pbstrFilespec);
}
static __WIDL_INLINE HRESULT IVssWMFiledesc_GetRecursive(IVssWMFiledesc* This,boolean *pbRecursive) {
    return This->lpVtbl->GetRecursive(This,pbRecursive);
}
static __WIDL_INLINE HRESULT IVssWMFiledesc_GetAlternateLocation(IVssWMFiledesc* This,BSTR *pbstrAlternateLocation) {
    return This->lpVtbl->GetAlternateLocation(This,pbstrAlternateLocation);
}
static __WIDL_INLINE HRESULT IVssWMFiledesc_GetBackupTypeMask(IVssWMFiledesc* This,DWORD *pdwTypeMask) {
    return This->lpVtbl->GetBackupTypeMask(This,pdwTypeMask);
}
#endif
#endif

#endif


#endif  /* __IVssWMFiledesc_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssWMDependency interface
 */
#ifndef __IVssWMDependency_INTERFACE_DEFINED__
#define __IVssWMDependency_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssWMDependency, 0x00000000, 0x0000, 0x0000, 0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00000000-0000-0000-0000-000000000000")
IVssWMDependency : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetWriterId(
        VSS_ID *pWriterId) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLogicalPath(
        BSTR *pbstrLogicalPath) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetComponentName(
        BSTR *pbstrComponentName) = 0;

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

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

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

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

    /*** IVssWMDependency methods ***/
    HRESULT (STDMETHODCALLTYPE *GetWriterId)(
        IVssWMDependency *This,
        VSS_ID *pWriterId);

    HRESULT (STDMETHODCALLTYPE *GetLogicalPath)(
        IVssWMDependency *This,
        BSTR *pbstrLogicalPath);

    HRESULT (STDMETHODCALLTYPE *GetComponentName)(
        IVssWMDependency *This,
        BSTR *pbstrComponentName);

    END_INTERFACE
} IVssWMDependencyVtbl;

interface IVssWMDependency {
    CONST_VTBL IVssWMDependencyVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssWMDependency_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssWMDependency_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssWMDependency_Release(This) (This)->lpVtbl->Release(This)
/*** IVssWMDependency methods ***/
#define IVssWMDependency_GetWriterId(This,pWriterId) (This)->lpVtbl->GetWriterId(This,pWriterId)
#define IVssWMDependency_GetLogicalPath(This,pbstrLogicalPath) (This)->lpVtbl->GetLogicalPath(This,pbstrLogicalPath)
#define IVssWMDependency_GetComponentName(This,pbstrComponentName) (This)->lpVtbl->GetComponentName(This,pbstrComponentName)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVssWMDependency_QueryInterface(IVssWMDependency* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVssWMDependency_AddRef(IVssWMDependency* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVssWMDependency_Release(IVssWMDependency* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssWMDependency methods ***/
static __WIDL_INLINE HRESULT IVssWMDependency_GetWriterId(IVssWMDependency* This,VSS_ID *pWriterId) {
    return This->lpVtbl->GetWriterId(This,pWriterId);
}
static __WIDL_INLINE HRESULT IVssWMDependency_GetLogicalPath(IVssWMDependency* This,BSTR *pbstrLogicalPath) {
    return This->lpVtbl->GetLogicalPath(This,pbstrLogicalPath);
}
static __WIDL_INLINE HRESULT IVssWMDependency_GetComponentName(IVssWMDependency* This,BSTR *pbstrComponentName) {
    return This->lpVtbl->GetComponentName(This,pbstrComponentName);
}
#endif
#endif

#endif


#endif  /* __IVssWMDependency_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssComponent interface
 */
#ifndef __IVssComponent_INTERFACE_DEFINED__
#define __IVssComponent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssComponent, 0xd2c72c96, 0xc121, 0x4518, 0xb6,0x27, 0xe5,0xa9,0x3d,0x01,0x0e,0xad);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d2c72c96-c121-4518-b627-e5a93d010ead")
IVssComponent : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetLogicalPath(
        BSTR *pbstrPath) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetComponentType(
        VSS_COMPONENT_TYPE *pct) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetComponentName(
        BSTR *pbstrName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBackupSucceeded(
        boolean *pbSucceeded) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAlternateLocationMappingCount(
        UINT *pcMappings) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE SetBackupMetadata(
        LPCWSTR wszData) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBackupMetadata(
        BSTR *pbstrData) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddPartialFile(
        LPCWSTR wszPath,
        LPCWSTR wszFilename,
        LPCWSTR wszRanges,
        LPCWSTR wszMetadata) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPartialFileCount(
        UINT *pcPartialFiles) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPartialFile(
        UINT iPartialFile,
        BSTR *pbstrPath,
        BSTR *pbstrFilename,
        BSTR *pbstrRange,
        BSTR *pbstrMetadata) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsSelectedForRestore(
        boolean *pbSelectedForRestore) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAdditionalRestores(
        boolean *pbAdditionalRestores) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNewTargetCount(
        UINT *pcNewTarget) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNewTarget(
        UINT iNewTarget,
        IVssWMFiledesc **ppFiledesc) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddDirectedTarget(
        LPCWSTR wszSourcePath,
        LPCWSTR wszSourceFilename,
        LPCWSTR wszSourceRangeList,
        LPCWSTR wszDestinationPath,
        LPCWSTR wszDestinationFilename,
        LPCWSTR wszDestinationRangeList) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDirectedTargetCount(
        UINT *pcDirectedTarget) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDirectedTarget(
        UINT iDirectedTarget,
        BSTR *pbstrSourcePath,
        BSTR *pbstrSourceFileName,
        BSTR *pbstrSourceRangeList,
        BSTR *pbstrDestinationPath,
        BSTR *pbstrDestinationFilename,
        BSTR *pbstrDestinationRangeList) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRestoreMetadata(
        LPCWSTR wszRestoreMetadata) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRestoreMetadata(
        BSTR *pbstrRestoreMetadata) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRestoreTarget(
        VSS_RESTORE_TARGET target) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRestoreTarget(
        VSS_RESTORE_TARGET *pTarget) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPreRestoreFailureMsg(
        LPCWSTR wszPreRestoreFailureMsg) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPreRestoreFailureMsg(
        BSTR *pbstrPreRestoreFailureMsg) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPostRestoreFailureMsg(
        LPCWSTR wszPostRestoreFailureMsg) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPostRestoreFailureMsg(
        BSTR *pbstrPostRestoreFailureMsg) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBackupStamp(
        LPCWSTR wszBackupStamp) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBackupStamp(
        BSTR *pbstrBackupStamp) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPreviousBackupStamp(
        BSTR *pbstrBackupStamp) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBackupOptions(
        BSTR *pbstrBackupOptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRestoreOptions(
        BSTR *pbstrRestoreOptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRestoreSubcomponentCount(
        UINT *pcRestoreSubcomponent) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRestoreSubcomponent(
        UINT iComponent,
        BSTR *pbstrLogicalPath,
        BSTR *pbstrComponentName,
        boolean *pbRepair) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFileRestoreStatus(
        VSS_FILE_RESTORE_STATUS *pStatus) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddDifferencedFilesByLastModifyTime(
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        WINBOOL bRecursive,
        FILETIME ftLastModifyTime) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddDifferencedFilesByLastModifyLSN(
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        WINBOOL bRecursive,
        BSTR bstrLsnString) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDifferencedFilesCount(
        UINT *pcDifferencedFiles) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDifferencedFile(
        UINT iDifferencedFile,
        BSTR *pbstrPath,
        BSTR *pbstrFilespec,
        WINBOOL *pbRecursive,
        BSTR *pbstrLsnString,
        FILETIME *pftLastModifyTime) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssComponent, 0xd2c72c96, 0xc121, 0x4518, 0xb6,0x27, 0xe5,0xa9,0x3d,0x01,0x0e,0xad)
#endif
#else
typedef struct IVssComponentVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVssComponent methods ***/
    HRESULT (STDMETHODCALLTYPE *GetLogicalPath)(
        IVssComponent *This,
        BSTR *pbstrPath);

    HRESULT (STDMETHODCALLTYPE *GetComponentType)(
        IVssComponent *This,
        VSS_COMPONENT_TYPE *pct);

    HRESULT (STDMETHODCALLTYPE *GetComponentName)(
        IVssComponent *This,
        BSTR *pbstrName);

    HRESULT (STDMETHODCALLTYPE *GetBackupSucceeded)(
        IVssComponent *This,
        boolean *pbSucceeded);

    HRESULT (STDMETHODCALLTYPE *GetAlternateLocationMappingCount)(
        IVssComponent *This,
        UINT *pcMappings);

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

    HRESULT (STDMETHODCALLTYPE *SetBackupMetadata)(
        IVssComponent *This,
        LPCWSTR wszData);

    HRESULT (STDMETHODCALLTYPE *GetBackupMetadata)(
        IVssComponent *This,
        BSTR *pbstrData);

    HRESULT (STDMETHODCALLTYPE *AddPartialFile)(
        IVssComponent *This,
        LPCWSTR wszPath,
        LPCWSTR wszFilename,
        LPCWSTR wszRanges,
        LPCWSTR wszMetadata);

    HRESULT (STDMETHODCALLTYPE *GetPartialFileCount)(
        IVssComponent *This,
        UINT *pcPartialFiles);

    HRESULT (STDMETHODCALLTYPE *GetPartialFile)(
        IVssComponent *This,
        UINT iPartialFile,
        BSTR *pbstrPath,
        BSTR *pbstrFilename,
        BSTR *pbstrRange,
        BSTR *pbstrMetadata);

    HRESULT (STDMETHODCALLTYPE *IsSelectedForRestore)(
        IVssComponent *This,
        boolean *pbSelectedForRestore);

    HRESULT (STDMETHODCALLTYPE *GetAdditionalRestores)(
        IVssComponent *This,
        boolean *pbAdditionalRestores);

    HRESULT (STDMETHODCALLTYPE *GetNewTargetCount)(
        IVssComponent *This,
        UINT *pcNewTarget);

    HRESULT (STDMETHODCALLTYPE *GetNewTarget)(
        IVssComponent *This,
        UINT iNewTarget,
        IVssWMFiledesc **ppFiledesc);

    HRESULT (STDMETHODCALLTYPE *AddDirectedTarget)(
        IVssComponent *This,
        LPCWSTR wszSourcePath,
        LPCWSTR wszSourceFilename,
        LPCWSTR wszSourceRangeList,
        LPCWSTR wszDestinationPath,
        LPCWSTR wszDestinationFilename,
        LPCWSTR wszDestinationRangeList);

    HRESULT (STDMETHODCALLTYPE *GetDirectedTargetCount)(
        IVssComponent *This,
        UINT *pcDirectedTarget);

    HRESULT (STDMETHODCALLTYPE *GetDirectedTarget)(
        IVssComponent *This,
        UINT iDirectedTarget,
        BSTR *pbstrSourcePath,
        BSTR *pbstrSourceFileName,
        BSTR *pbstrSourceRangeList,
        BSTR *pbstrDestinationPath,
        BSTR *pbstrDestinationFilename,
        BSTR *pbstrDestinationRangeList);

    HRESULT (STDMETHODCALLTYPE *SetRestoreMetadata)(
        IVssComponent *This,
        LPCWSTR wszRestoreMetadata);

    HRESULT (STDMETHODCALLTYPE *GetRestoreMetadata)(
        IVssComponent *This,
        BSTR *pbstrRestoreMetadata);

    HRESULT (STDMETHODCALLTYPE *SetRestoreTarget)(
        IVssComponent *This,
        VSS_RESTORE_TARGET target);

    HRESULT (STDMETHODCALLTYPE *GetRestoreTarget)(
        IVssComponent *This,
        VSS_RESTORE_TARGET *pTarget);

    HRESULT (STDMETHODCALLTYPE *SetPreRestoreFailureMsg)(
        IVssComponent *This,
        LPCWSTR wszPreRestoreFailureMsg);

    HRESULT (STDMETHODCALLTYPE *GetPreRestoreFailureMsg)(
        IVssComponent *This,
        BSTR *pbstrPreRestoreFailureMsg);

    HRESULT (STDMETHODCALLTYPE *SetPostRestoreFailureMsg)(
        IVssComponent *This,
        LPCWSTR wszPostRestoreFailureMsg);

    HRESULT (STDMETHODCALLTYPE *GetPostRestoreFailureMsg)(
        IVssComponent *This,
        BSTR *pbstrPostRestoreFailureMsg);

    HRESULT (STDMETHODCALLTYPE *SetBackupStamp)(
        IVssComponent *This,
        LPCWSTR wszBackupStamp);

    HRESULT (STDMETHODCALLTYPE *GetBackupStamp)(
        IVssComponent *This,
        BSTR *pbstrBackupStamp);

    HRESULT (STDMETHODCALLTYPE *GetPreviousBackupStamp)(
        IVssComponent *This,
        BSTR *pbstrBackupStamp);

    HRESULT (STDMETHODCALLTYPE *GetBackupOptions)(
        IVssComponent *This,
        BSTR *pbstrBackupOptions);

    HRESULT (STDMETHODCALLTYPE *GetRestoreOptions)(
        IVssComponent *This,
        BSTR *pbstrRestoreOptions);

    HRESULT (STDMETHODCALLTYPE *GetRestoreSubcomponentCount)(
        IVssComponent *This,
        UINT *pcRestoreSubcomponent);

    HRESULT (STDMETHODCALLTYPE *GetRestoreSubcomponent)(
        IVssComponent *This,
        UINT iComponent,
        BSTR *pbstrLogicalPath,
        BSTR *pbstrComponentName,
        boolean *pbRepair);

    HRESULT (STDMETHODCALLTYPE *GetFileRestoreStatus)(
        IVssComponent *This,
        VSS_FILE_RESTORE_STATUS *pStatus);

    HRESULT (STDMETHODCALLTYPE *AddDifferencedFilesByLastModifyTime)(
        IVssComponent *This,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        WINBOOL bRecursive,
        FILETIME ftLastModifyTime);

    HRESULT (STDMETHODCALLTYPE *AddDifferencedFilesByLastModifyLSN)(
        IVssComponent *This,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        WINBOOL bRecursive,
        BSTR bstrLsnString);

    HRESULT (STDMETHODCALLTYPE *GetDifferencedFilesCount)(
        IVssComponent *This,
        UINT *pcDifferencedFiles);

    HRESULT (STDMETHODCALLTYPE *GetDifferencedFile)(
        IVssComponent *This,
        UINT iDifferencedFile,
        BSTR *pbstrPath,
        BSTR *pbstrFilespec,
        WINBOOL *pbRecursive,
        BSTR *pbstrLsnString,
        FILETIME *pftLastModifyTime);

    END_INTERFACE
} IVssComponentVtbl;

interface IVssComponent {
    CONST_VTBL IVssComponentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssComponent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssComponent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssComponent_Release(This) (This)->lpVtbl->Release(This)
/*** IVssComponent methods ***/
#define IVssComponent_GetLogicalPath(This,pbstrPath) (This)->lpVtbl->GetLogicalPath(This,pbstrPath)
#define IVssComponent_GetComponentType(This,pct) (This)->lpVtbl->GetComponentType(This,pct)
#define IVssComponent_GetComponentName(This,pbstrName) (This)->lpVtbl->GetComponentName(This,pbstrName)
#define IVssComponent_GetBackupSucceeded(This,pbSucceeded) (This)->lpVtbl->GetBackupSucceeded(This,pbSucceeded)
#define IVssComponent_GetAlternateLocationMappingCount(This,pcMappings) (This)->lpVtbl->GetAlternateLocationMappingCount(This,pcMappings)
#define IVssComponent_GetAlternateLocationMapping(This,iMapping,ppFiledesc) (This)->lpVtbl->GetAlternateLocationMapping(This,iMapping,ppFiledesc)
#define IVssComponent_SetBackupMetadata(This,wszData) (This)->lpVtbl->SetBackupMetadata(This,wszData)
#define IVssComponent_GetBackupMetadata(This,pbstrData) (This)->lpVtbl->GetBackupMetadata(This,pbstrData)
#define IVssComponent_AddPartialFile(This,wszPath,wszFilename,wszRanges,wszMetadata) (This)->lpVtbl->AddPartialFile(This,wszPath,wszFilename,wszRanges,wszMetadata)
#define IVssComponent_GetPartialFileCount(This,pcPartialFiles) (This)->lpVtbl->GetPartialFileCount(This,pcPartialFiles)
#define IVssComponent_GetPartialFile(This,iPartialFile,pbstrPath,pbstrFilename,pbstrRange,pbstrMetadata) (This)->lpVtbl->GetPartialFile(This,iPartialFile,pbstrPath,pbstrFilename,pbstrRange,pbstrMetadata)
#define IVssComponent_IsSelectedForRestore(This,pbSelectedForRestore) (This)->lpVtbl->IsSelectedForRestore(This,pbSelectedForRestore)
#define IVssComponent_GetAdditionalRestores(This,pbAdditionalRestores) (This)->lpVtbl->GetAdditionalRestores(This,pbAdditionalRestores)
#define IVssComponent_GetNewTargetCount(This,pcNewTarget) (This)->lpVtbl->GetNewTargetCount(This,pcNewTarget)
#define IVssComponent_GetNewTarget(This,iNewTarget,ppFiledesc) (This)->lpVtbl->GetNewTarget(This,iNewTarget,ppFiledesc)
#define IVssComponent_AddDirectedTarget(This,wszSourcePath,wszSourceFilename,wszSourceRangeList,wszDestinationPath,wszDestinationFilename,wszDestinationRangeList) (This)->lpVtbl->AddDirectedTarget(This,wszSourcePath,wszSourceFilename,wszSourceRangeList,wszDestinationPath,wszDestinationFilename,wszDestinationRangeList)
#define IVssComponent_GetDirectedTargetCount(This,pcDirectedTarget) (This)->lpVtbl->GetDirectedTargetCount(This,pcDirectedTarget)
#define IVssComponent_GetDirectedTarget(This,iDirectedTarget,pbstrSourcePath,pbstrSourceFileName,pbstrSourceRangeList,pbstrDestinationPath,pbstrDestinationFilename,pbstrDestinationRangeList) (This)->lpVtbl->GetDirectedTarget(This,iDirectedTarget,pbstrSourcePath,pbstrSourceFileName,pbstrSourceRangeList,pbstrDestinationPath,pbstrDestinationFilename,pbstrDestinationRangeList)
#define IVssComponent_SetRestoreMetadata(This,wszRestoreMetadata) (This)->lpVtbl->SetRestoreMetadata(This,wszRestoreMetadata)
#define IVssComponent_GetRestoreMetadata(This,pbstrRestoreMetadata) (This)->lpVtbl->GetRestoreMetadata(This,pbstrRestoreMetadata)
#define IVssComponent_SetRestoreTarget(This,target) (This)->lpVtbl->SetRestoreTarget(This,target)
#define IVssComponent_GetRestoreTarget(This,pTarget) (This)->lpVtbl->GetRestoreTarget(This,pTarget)
#define IVssComponent_SetPreRestoreFailureMsg(This,wszPreRestoreFailureMsg) (This)->lpVtbl->SetPreRestoreFailureMsg(This,wszPreRestoreFailureMsg)
#define IVssComponent_GetPreRestoreFailureMsg(This,pbstrPreRestoreFailureMsg) (This)->lpVtbl->GetPreRestoreFailureMsg(This,pbstrPreRestoreFailureMsg)
#define IVssComponent_SetPostRestoreFailureMsg(This,wszPostRestoreFailureMsg) (This)->lpVtbl->SetPostRestoreFailureMsg(This,wszPostRestoreFailureMsg)
#define IVssComponent_GetPostRestoreFailureMsg(This,pbstrPostRestoreFailureMsg) (This)->lpVtbl->GetPostRestoreFailureMsg(This,pbstrPostRestoreFailureMsg)
#define IVssComponent_SetBackupStamp(This,wszBackupStamp) (This)->lpVtbl->SetBackupStamp(This,wszBackupStamp)
#define IVssComponent_GetBackupStamp(This,pbstrBackupStamp) (This)->lpVtbl->GetBackupStamp(This,pbstrBackupStamp)
#define IVssComponent_GetPreviousBackupStamp(This,pbstrBackupStamp) (This)->lpVtbl->GetPreviousBackupStamp(This,pbstrBackupStamp)
#define IVssComponent_GetBackupOptions(This,pbstrBackupOptions) (This)->lpVtbl->GetBackupOptions(This,pbstrBackupOptions)
#define IVssComponent_GetRestoreOptions(This,pbstrRestoreOptions) (This)->lpVtbl->GetRestoreOptions(This,pbstrRestoreOptions)
#define IVssComponent_GetRestoreSubcomponentCount(This,pcRestoreSubcomponent) (This)->lpVtbl->GetRestoreSubcomponentCount(This,pcRestoreSubcomponent)
#define IVssComponent_GetRestoreSubcomponent(This,iComponent,pbstrLogicalPath,pbstrComponentName,pbRepair) (This)->lpVtbl->GetRestoreSubcomponent(This,iComponent,pbstrLogicalPath,pbstrComponentName,pbRepair)
#define IVssComponent_GetFileRestoreStatus(This,pStatus) (This)->lpVtbl->GetFileRestoreStatus(This,pStatus)
#define IVssComponent_AddDifferencedFilesByLastModifyTime(This,wszPath,wszFilespec,bRecursive,ftLastModifyTime) (This)->lpVtbl->AddDifferencedFilesByLastModifyTime(This,wszPath,wszFilespec,bRecursive,ftLastModifyTime)
#define IVssComponent_AddDifferencedFilesByLastModifyLSN(This,wszPath,wszFilespec,bRecursive,bstrLsnString) (This)->lpVtbl->AddDifferencedFilesByLastModifyLSN(This,wszPath,wszFilespec,bRecursive,bstrLsnString)
#define IVssComponent_GetDifferencedFilesCount(This,pcDifferencedFiles) (This)->lpVtbl->GetDifferencedFilesCount(This,pcDifferencedFiles)
#define IVssComponent_GetDifferencedFile(This,iDifferencedFile,pbstrPath,pbstrFilespec,pbRecursive,pbstrLsnString,pftLastModifyTime) (This)->lpVtbl->GetDifferencedFile(This,iDifferencedFile,pbstrPath,pbstrFilespec,pbRecursive,pbstrLsnString,pftLastModifyTime)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVssComponent_QueryInterface(IVssComponent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVssComponent_AddRef(IVssComponent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVssComponent_Release(IVssComponent* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssComponent methods ***/
static __WIDL_INLINE HRESULT IVssComponent_GetLogicalPath(IVssComponent* This,BSTR *pbstrPath) {
    return This->lpVtbl->GetLogicalPath(This,pbstrPath);
}
static __WIDL_INLINE HRESULT IVssComponent_GetComponentType(IVssComponent* This,VSS_COMPONENT_TYPE *pct) {
    return This->lpVtbl->GetComponentType(This,pct);
}
static __WIDL_INLINE HRESULT IVssComponent_GetComponentName(IVssComponent* This,BSTR *pbstrName) {
    return This->lpVtbl->GetComponentName(This,pbstrName);
}
static __WIDL_INLINE HRESULT IVssComponent_GetBackupSucceeded(IVssComponent* This,boolean *pbSucceeded) {
    return This->lpVtbl->GetBackupSucceeded(This,pbSucceeded);
}
static __WIDL_INLINE HRESULT IVssComponent_GetAlternateLocationMappingCount(IVssComponent* This,UINT *pcMappings) {
    return This->lpVtbl->GetAlternateLocationMappingCount(This,pcMappings);
}
static __WIDL_INLINE HRESULT IVssComponent_GetAlternateLocationMapping(IVssComponent* This,UINT iMapping,IVssWMFiledesc **ppFiledesc) {
    return This->lpVtbl->GetAlternateLocationMapping(This,iMapping,ppFiledesc);
}
static __WIDL_INLINE HRESULT IVssComponent_SetBackupMetadata(IVssComponent* This,LPCWSTR wszData) {
    return This->lpVtbl->SetBackupMetadata(This,wszData);
}
static __WIDL_INLINE HRESULT IVssComponent_GetBackupMetadata(IVssComponent* This,BSTR *pbstrData) {
    return This->lpVtbl->GetBackupMetadata(This,pbstrData);
}
static __WIDL_INLINE HRESULT IVssComponent_AddPartialFile(IVssComponent* This,LPCWSTR wszPath,LPCWSTR wszFilename,LPCWSTR wszRanges,LPCWSTR wszMetadata) {
    return This->lpVtbl->AddPartialFile(This,wszPath,wszFilename,wszRanges,wszMetadata);
}
static __WIDL_INLINE HRESULT IVssComponent_GetPartialFileCount(IVssComponent* This,UINT *pcPartialFiles) {
    return This->lpVtbl->GetPartialFileCount(This,pcPartialFiles);
}
static __WIDL_INLINE HRESULT IVssComponent_GetPartialFile(IVssComponent* This,UINT iPartialFile,BSTR *pbstrPath,BSTR *pbstrFilename,BSTR *pbstrRange,BSTR *pbstrMetadata) {
    return This->lpVtbl->GetPartialFile(This,iPartialFile,pbstrPath,pbstrFilename,pbstrRange,pbstrMetadata);
}
static __WIDL_INLINE HRESULT IVssComponent_IsSelectedForRestore(IVssComponent* This,boolean *pbSelectedForRestore) {
    return This->lpVtbl->IsSelectedForRestore(This,pbSelectedForRestore);
}
static __WIDL_INLINE HRESULT IVssComponent_GetAdditionalRestores(IVssComponent* This,boolean *pbAdditionalRestores) {
    return This->lpVtbl->GetAdditionalRestores(This,pbAdditionalRestores);
}
static __WIDL_INLINE HRESULT IVssComponent_GetNewTargetCount(IVssComponent* This,UINT *pcNewTarget) {
    return This->lpVtbl->GetNewTargetCount(This,pcNewTarget);
}
static __WIDL_INLINE HRESULT IVssComponent_GetNewTarget(IVssComponent* This,UINT iNewTarget,IVssWMFiledesc **ppFiledesc) {
    return This->lpVtbl->GetNewTarget(This,iNewTarget,ppFiledesc);
}
static __WIDL_INLINE HRESULT IVssComponent_AddDirectedTarget(IVssComponent* This,LPCWSTR wszSourcePath,LPCWSTR wszSourceFilename,LPCWSTR wszSourceRangeList,LPCWSTR wszDestinationPath,LPCWSTR wszDestinationFilename,LPCWSTR wszDestinationRangeList) {
    return This->lpVtbl->AddDirectedTarget(This,wszSourcePath,wszSourceFilename,wszSourceRangeList,wszDestinationPath,wszDestinationFilename,wszDestinationRangeList);
}
static __WIDL_INLINE HRESULT IVssComponent_GetDirectedTargetCount(IVssComponent* This,UINT *pcDirectedTarget) {
    return This->lpVtbl->GetDirectedTargetCount(This,pcDirectedTarget);
}
static __WIDL_INLINE HRESULT IVssComponent_GetDirectedTarget(IVssComponent* This,UINT iDirectedTarget,BSTR *pbstrSourcePath,BSTR *pbstrSourceFileName,BSTR *pbstrSourceRangeList,BSTR *pbstrDestinationPath,BSTR *pbstrDestinationFilename,BSTR *pbstrDestinationRangeList) {
    return This->lpVtbl->GetDirectedTarget(This,iDirectedTarget,pbstrSourcePath,pbstrSourceFileName,pbstrSourceRangeList,pbstrDestinationPath,pbstrDestinationFilename,pbstrDestinationRangeList);
}
static __WIDL_INLINE HRESULT IVssComponent_SetRestoreMetadata(IVssComponent* This,LPCWSTR wszRestoreMetadata) {
    return This->lpVtbl->SetRestoreMetadata(This,wszRestoreMetadata);
}
static __WIDL_INLINE HRESULT IVssComponent_GetRestoreMetadata(IVssComponent* This,BSTR *pbstrRestoreMetadata) {
    return This->lpVtbl->GetRestoreMetadata(This,pbstrRestoreMetadata);
}
static __WIDL_INLINE HRESULT IVssComponent_SetRestoreTarget(IVssComponent* This,VSS_RESTORE_TARGET target) {
    return This->lpVtbl->SetRestoreTarget(This,target);
}
static __WIDL_INLINE HRESULT IVssComponent_GetRestoreTarget(IVssComponent* This,VSS_RESTORE_TARGET *pTarget) {
    return This->lpVtbl->GetRestoreTarget(This,pTarget);
}
static __WIDL_INLINE HRESULT IVssComponent_SetPreRestoreFailureMsg(IVssComponent* This,LPCWSTR wszPreRestoreFailureMsg) {
    return This->lpVtbl->SetPreRestoreFailureMsg(This,wszPreRestoreFailureMsg);
}
static __WIDL_INLINE HRESULT IVssComponent_GetPreRestoreFailureMsg(IVssComponent* This,BSTR *pbstrPreRestoreFailureMsg) {
    return This->lpVtbl->GetPreRestoreFailureMsg(This,pbstrPreRestoreFailureMsg);
}
static __WIDL_INLINE HRESULT IVssComponent_SetPostRestoreFailureMsg(IVssComponent* This,LPCWSTR wszPostRestoreFailureMsg) {
    return This->lpVtbl->SetPostRestoreFailureMsg(This,wszPostRestoreFailureMsg);
}
static __WIDL_INLINE HRESULT IVssComponent_GetPostRestoreFailureMsg(IVssComponent* This,BSTR *pbstrPostRestoreFailureMsg) {
    return This->lpVtbl->GetPostRestoreFailureMsg(This,pbstrPostRestoreFailureMsg);
}
static __WIDL_INLINE HRESULT IVssComponent_SetBackupStamp(IVssComponent* This,LPCWSTR wszBackupStamp) {
    return This->lpVtbl->SetBackupStamp(This,wszBackupStamp);
}
static __WIDL_INLINE HRESULT IVssComponent_GetBackupStamp(IVssComponent* This,BSTR *pbstrBackupStamp) {
    return This->lpVtbl->GetBackupStamp(This,pbstrBackupStamp);
}
static __WIDL_INLINE HRESULT IVssComponent_GetPreviousBackupStamp(IVssComponent* This,BSTR *pbstrBackupStamp) {
    return This->lpVtbl->GetPreviousBackupStamp(This,pbstrBackupStamp);
}
static __WIDL_INLINE HRESULT IVssComponent_GetBackupOptions(IVssComponent* This,BSTR *pbstrBackupOptions) {
    return This->lpVtbl->GetBackupOptions(This,pbstrBackupOptions);
}
static __WIDL_INLINE HRESULT IVssComponent_GetRestoreOptions(IVssComponent* This,BSTR *pbstrRestoreOptions) {
    return This->lpVtbl->GetRestoreOptions(This,pbstrRestoreOptions);
}
static __WIDL_INLINE HRESULT IVssComponent_GetRestoreSubcomponentCount(IVssComponent* This,UINT *pcRestoreSubcomponent) {
    return This->lpVtbl->GetRestoreSubcomponentCount(This,pcRestoreSubcomponent);
}
static __WIDL_INLINE HRESULT IVssComponent_GetRestoreSubcomponent(IVssComponent* This,UINT iComponent,BSTR *pbstrLogicalPath,BSTR *pbstrComponentName,boolean *pbRepair) {
    return This->lpVtbl->GetRestoreSubcomponent(This,iComponent,pbstrLogicalPath,pbstrComponentName,pbRepair);
}
static __WIDL_INLINE HRESULT IVssComponent_GetFileRestoreStatus(IVssComponent* This,VSS_FILE_RESTORE_STATUS *pStatus) {
    return This->lpVtbl->GetFileRestoreStatus(This,pStatus);
}
static __WIDL_INLINE HRESULT IVssComponent_AddDifferencedFilesByLastModifyTime(IVssComponent* This,LPCWSTR wszPath,LPCWSTR wszFilespec,WINBOOL bRecursive,FILETIME ftLastModifyTime) {
    return This->lpVtbl->AddDifferencedFilesByLastModifyTime(This,wszPath,wszFilespec,bRecursive,ftLastModifyTime);
}
static __WIDL_INLINE HRESULT IVssComponent_AddDifferencedFilesByLastModifyLSN(IVssComponent* This,LPCWSTR wszPath,LPCWSTR wszFilespec,WINBOOL bRecursive,BSTR bstrLsnString) {
    return This->lpVtbl->AddDifferencedFilesByLastModifyLSN(This,wszPath,wszFilespec,bRecursive,bstrLsnString);
}
static __WIDL_INLINE HRESULT IVssComponent_GetDifferencedFilesCount(IVssComponent* This,UINT *pcDifferencedFiles) {
    return This->lpVtbl->GetDifferencedFilesCount(This,pcDifferencedFiles);
}
static __WIDL_INLINE HRESULT IVssComponent_GetDifferencedFile(IVssComponent* This,UINT iDifferencedFile,BSTR *pbstrPath,BSTR *pbstrFilespec,WINBOOL *pbRecursive,BSTR *pbstrLsnString,FILETIME *pftLastModifyTime) {
    return This->lpVtbl->GetDifferencedFile(This,iDifferencedFile,pbstrPath,pbstrFilespec,pbRecursive,pbstrLsnString,pftLastModifyTime);
}
#endif
#endif

#endif


#endif  /* __IVssComponent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssWriterComponents interface
 */
#ifndef __IVssWriterComponents_INTERFACE_DEFINED__
#define __IVssWriterComponents_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssWriterComponents, 0x00000000, 0x0000, 0x0000, 0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00000000-0000-0000-0000-000000000000")
IVssWriterComponents
{

    BEGIN_INTERFACE

    virtual HRESULT STDMETHODCALLTYPE GetComponentCount(
        UINT *pcComponents) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetWriterInfo(
        VSS_ID *pidInstance,
        VSS_ID *pidWriter) = 0;

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

    END_INTERFACE

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

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

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

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

    END_INTERFACE
} IVssWriterComponentsVtbl;

interface IVssWriterComponents {
    CONST_VTBL IVssWriterComponentsVtbl* lpVtbl;
};

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

#endif


#endif  /* __IVssWriterComponents_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssComponentEx interface
 */
#ifndef __IVssComponentEx_INTERFACE_DEFINED__
#define __IVssComponentEx_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssComponentEx, 0x156c8b5e, 0xf131, 0x4bd7, 0x9c,0x97, 0xd1,0x92,0x3b,0xe7,0xe1,0xfa);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("156c8b5e-f131-4bd7-9c97-d1923be7e1fa")
IVssComponentEx : public IVssComponent
{
    virtual HRESULT STDMETHODCALLTYPE SetPrepareForBackupFailureMsg(
        LPCWSTR wszFailureMsg) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPostSnapshotFailureMsg(
        LPCWSTR wszFailureMsg) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPrepareForBackupFailureMsg(
        BSTR *pbstrFailureMsg) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPostSnapshotFailureMsg(
        BSTR *pbstrFailureMsg) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAuthoritativeRestore(
        boolean *pbAuth) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRollForward(
        VSS_ROLLFORWARD_TYPE *pRollType,
        BSTR *pbstrPoint) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRestoreName(
        BSTR *pbstrName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssComponentEx, 0x156c8b5e, 0xf131, 0x4bd7, 0x9c,0x97, 0xd1,0x92,0x3b,0xe7,0xe1,0xfa)
#endif
#else
typedef struct IVssComponentExVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVssComponent methods ***/
    HRESULT (STDMETHODCALLTYPE *GetLogicalPath)(
        IVssComponentEx *This,
        BSTR *pbstrPath);

    HRESULT (STDMETHODCALLTYPE *GetComponentType)(
        IVssComponentEx *This,
        VSS_COMPONENT_TYPE *pct);

    HRESULT (STDMETHODCALLTYPE *GetComponentName)(
        IVssComponentEx *This,
        BSTR *pbstrName);

    HRESULT (STDMETHODCALLTYPE *GetBackupSucceeded)(
        IVssComponentEx *This,
        boolean *pbSucceeded);

    HRESULT (STDMETHODCALLTYPE *GetAlternateLocationMappingCount)(
        IVssComponentEx *This,
        UINT *pcMappings);

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

    HRESULT (STDMETHODCALLTYPE *SetBackupMetadata)(
        IVssComponentEx *This,
        LPCWSTR wszData);

    HRESULT (STDMETHODCALLTYPE *GetBackupMetadata)(
        IVssComponentEx *This,
        BSTR *pbstrData);

    HRESULT (STDMETHODCALLTYPE *AddPartialFile)(
        IVssComponentEx *This,
        LPCWSTR wszPath,
        LPCWSTR wszFilename,
        LPCWSTR wszRanges,
        LPCWSTR wszMetadata);

    HRESULT (STDMETHODCALLTYPE *GetPartialFileCount)(
        IVssComponentEx *This,
        UINT *pcPartialFiles);

    HRESULT (STDMETHODCALLTYPE *GetPartialFile)(
        IVssComponentEx *This,
        UINT iPartialFile,
        BSTR *pbstrPath,
        BSTR *pbstrFilename,
        BSTR *pbstrRange,
        BSTR *pbstrMetadata);

    HRESULT (STDMETHODCALLTYPE *IsSelectedForRestore)(
        IVssComponentEx *This,
        boolean *pbSelectedForRestore);

    HRESULT (STDMETHODCALLTYPE *GetAdditionalRestores)(
        IVssComponentEx *This,
        boolean *pbAdditionalRestores);

    HRESULT (STDMETHODCALLTYPE *GetNewTargetCount)(
        IVssComponentEx *This,
        UINT *pcNewTarget);

    HRESULT (STDMETHODCALLTYPE *GetNewTarget)(
        IVssComponentEx *This,
        UINT iNewTarget,
        IVssWMFiledesc **ppFiledesc);

    HRESULT (STDMETHODCALLTYPE *AddDirectedTarget)(
        IVssComponentEx *This,
        LPCWSTR wszSourcePath,
        LPCWSTR wszSourceFilename,
        LPCWSTR wszSourceRangeList,
        LPCWSTR wszDestinationPath,
        LPCWSTR wszDestinationFilename,
        LPCWSTR wszDestinationRangeList);

    HRESULT (STDMETHODCALLTYPE *GetDirectedTargetCount)(
        IVssComponentEx *This,
        UINT *pcDirectedTarget);

    HRESULT (STDMETHODCALLTYPE *GetDirectedTarget)(
        IVssComponentEx *This,
        UINT iDirectedTarget,
        BSTR *pbstrSourcePath,
        BSTR *pbstrSourceFileName,
        BSTR *pbstrSourceRangeList,
        BSTR *pbstrDestinationPath,
        BSTR *pbstrDestinationFilename,
        BSTR *pbstrDestinationRangeList);

    HRESULT (STDMETHODCALLTYPE *SetRestoreMetadata)(
        IVssComponentEx *This,
        LPCWSTR wszRestoreMetadata);

    HRESULT (STDMETHODCALLTYPE *GetRestoreMetadata)(
        IVssComponentEx *This,
        BSTR *pbstrRestoreMetadata);

    HRESULT (STDMETHODCALLTYPE *SetRestoreTarget)(
        IVssComponentEx *This,
        VSS_RESTORE_TARGET target);

    HRESULT (STDMETHODCALLTYPE *GetRestoreTarget)(
        IVssComponentEx *This,
        VSS_RESTORE_TARGET *pTarget);

    HRESULT (STDMETHODCALLTYPE *SetPreRestoreFailureMsg)(
        IVssComponentEx *This,
        LPCWSTR wszPreRestoreFailureMsg);

    HRESULT (STDMETHODCALLTYPE *GetPreRestoreFailureMsg)(
        IVssComponentEx *This,
        BSTR *pbstrPreRestoreFailureMsg);

    HRESULT (STDMETHODCALLTYPE *SetPostRestoreFailureMsg)(
        IVssComponentEx *This,
        LPCWSTR wszPostRestoreFailureMsg);

    HRESULT (STDMETHODCALLTYPE *GetPostRestoreFailureMsg)(
        IVssComponentEx *This,
        BSTR *pbstrPostRestoreFailureMsg);

    HRESULT (STDMETHODCALLTYPE *SetBackupStamp)(
        IVssComponentEx *This,
        LPCWSTR wszBackupStamp);

    HRESULT (STDMETHODCALLTYPE *GetBackupStamp)(
        IVssComponentEx *This,
        BSTR *pbstrBackupStamp);

    HRESULT (STDMETHODCALLTYPE *GetPreviousBackupStamp)(
        IVssComponentEx *This,
        BSTR *pbstrBackupStamp);

    HRESULT (STDMETHODCALLTYPE *GetBackupOptions)(
        IVssComponentEx *This,
        BSTR *pbstrBackupOptions);

    HRESULT (STDMETHODCALLTYPE *GetRestoreOptions)(
        IVssComponentEx *This,
        BSTR *pbstrRestoreOptions);

    HRESULT (STDMETHODCALLTYPE *GetRestoreSubcomponentCount)(
        IVssComponentEx *This,
        UINT *pcRestoreSubcomponent);

    HRESULT (STDMETHODCALLTYPE *GetRestoreSubcomponent)(
        IVssComponentEx *This,
        UINT iComponent,
        BSTR *pbstrLogicalPath,
        BSTR *pbstrComponentName,
        boolean *pbRepair);

    HRESULT (STDMETHODCALLTYPE *GetFileRestoreStatus)(
        IVssComponentEx *This,
        VSS_FILE_RESTORE_STATUS *pStatus);

    HRESULT (STDMETHODCALLTYPE *AddDifferencedFilesByLastModifyTime)(
        IVssComponentEx *This,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        WINBOOL bRecursive,
        FILETIME ftLastModifyTime);

    HRESULT (STDMETHODCALLTYPE *AddDifferencedFilesByLastModifyLSN)(
        IVssComponentEx *This,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        WINBOOL bRecursive,
        BSTR bstrLsnString);

    HRESULT (STDMETHODCALLTYPE *GetDifferencedFilesCount)(
        IVssComponentEx *This,
        UINT *pcDifferencedFiles);

    HRESULT (STDMETHODCALLTYPE *GetDifferencedFile)(
        IVssComponentEx *This,
        UINT iDifferencedFile,
        BSTR *pbstrPath,
        BSTR *pbstrFilespec,
        WINBOOL *pbRecursive,
        BSTR *pbstrLsnString,
        FILETIME *pftLastModifyTime);

    /*** IVssComponentEx methods ***/
    HRESULT (STDMETHODCALLTYPE *SetPrepareForBackupFailureMsg)(
        IVssComponentEx *This,
        LPCWSTR wszFailureMsg);

    HRESULT (STDMETHODCALLTYPE *SetPostSnapshotFailureMsg)(
        IVssComponentEx *This,
        LPCWSTR wszFailureMsg);

    HRESULT (STDMETHODCALLTYPE *GetPrepareForBackupFailureMsg)(
        IVssComponentEx *This,
        BSTR *pbstrFailureMsg);

    HRESULT (STDMETHODCALLTYPE *GetPostSnapshotFailureMsg)(
        IVssComponentEx *This,
        BSTR *pbstrFailureMsg);

    HRESULT (STDMETHODCALLTYPE *GetAuthoritativeRestore)(
        IVssComponentEx *This,
        boolean *pbAuth);

    HRESULT (STDMETHODCALLTYPE *GetRollForward)(
        IVssComponentEx *This,
        VSS_ROLLFORWARD_TYPE *pRollType,
        BSTR *pbstrPoint);

    HRESULT (STDMETHODCALLTYPE *GetRestoreName)(
        IVssComponentEx *This,
        BSTR *pbstrName);

    END_INTERFACE
} IVssComponentExVtbl;

interface IVssComponentEx {
    CONST_VTBL IVssComponentExVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssComponentEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssComponentEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssComponentEx_Release(This) (This)->lpVtbl->Release(This)
/*** IVssComponent methods ***/
#define IVssComponentEx_GetLogicalPath(This,pbstrPath) (This)->lpVtbl->GetLogicalPath(This,pbstrPath)
#define IVssComponentEx_GetComponentType(This,pct) (This)->lpVtbl->GetComponentType(This,pct)
#define IVssComponentEx_GetComponentName(This,pbstrName) (This)->lpVtbl->GetComponentName(This,pbstrName)
#define IVssComponentEx_GetBackupSucceeded(This,pbSucceeded) (This)->lpVtbl->GetBackupSucceeded(This,pbSucceeded)
#define IVssComponentEx_GetAlternateLocationMappingCount(This,pcMappings) (This)->lpVtbl->GetAlternateLocationMappingCount(This,pcMappings)
#define IVssComponentEx_GetAlternateLocationMapping(This,iMapping,ppFiledesc) (This)->lpVtbl->GetAlternateLocationMapping(This,iMapping,ppFiledesc)
#define IVssComponentEx_SetBackupMetadata(This,wszData) (This)->lpVtbl->SetBackupMetadata(This,wszData)
#define IVssComponentEx_GetBackupMetadata(This,pbstrData) (This)->lpVtbl->GetBackupMetadata(This,pbstrData)
#define IVssComponentEx_AddPartialFile(This,wszPath,wszFilename,wszRanges,wszMetadata) (This)->lpVtbl->AddPartialFile(This,wszPath,wszFilename,wszRanges,wszMetadata)
#define IVssComponentEx_GetPartialFileCount(This,pcPartialFiles) (This)->lpVtbl->GetPartialFileCount(This,pcPartialFiles)
#define IVssComponentEx_GetPartialFile(This,iPartialFile,pbstrPath,pbstrFilename,pbstrRange,pbstrMetadata) (This)->lpVtbl->GetPartialFile(This,iPartialFile,pbstrPath,pbstrFilename,pbstrRange,pbstrMetadata)
#define IVssComponentEx_IsSelectedForRestore(This,pbSelectedForRestore) (This)->lpVtbl->IsSelectedForRestore(This,pbSelectedForRestore)
#define IVssComponentEx_GetAdditionalRestores(This,pbAdditionalRestores) (This)->lpVtbl->GetAdditionalRestores(This,pbAdditionalRestores)
#define IVssComponentEx_GetNewTargetCount(This,pcNewTarget) (This)->lpVtbl->GetNewTargetCount(This,pcNewTarget)
#define IVssComponentEx_GetNewTarget(This,iNewTarget,ppFiledesc) (This)->lpVtbl->GetNewTarget(This,iNewTarget,ppFiledesc)
#define IVssComponentEx_AddDirectedTarget(This,wszSourcePath,wszSourceFilename,wszSourceRangeList,wszDestinationPath,wszDestinationFilename,wszDestinationRangeList) (This)->lpVtbl->AddDirectedTarget(This,wszSourcePath,wszSourceFilename,wszSourceRangeList,wszDestinationPath,wszDestinationFilename,wszDestinationRangeList)
#define IVssComponentEx_GetDirectedTargetCount(This,pcDirectedTarget) (This)->lpVtbl->GetDirectedTargetCount(This,pcDirectedTarget)
#define IVssComponentEx_GetDirectedTarget(This,iDirectedTarget,pbstrSourcePath,pbstrSourceFileName,pbstrSourceRangeList,pbstrDestinationPath,pbstrDestinationFilename,pbstrDestinationRangeList) (This)->lpVtbl->GetDirectedTarget(This,iDirectedTarget,pbstrSourcePath,pbstrSourceFileName,pbstrSourceRangeList,pbstrDestinationPath,pbstrDestinationFilename,pbstrDestinationRangeList)
#define IVssComponentEx_SetRestoreMetadata(This,wszRestoreMetadata) (This)->lpVtbl->SetRestoreMetadata(This,wszRestoreMetadata)
#define IVssComponentEx_GetRestoreMetadata(This,pbstrRestoreMetadata) (This)->lpVtbl->GetRestoreMetadata(This,pbstrRestoreMetadata)
#define IVssComponentEx_SetRestoreTarget(This,target) (This)->lpVtbl->SetRestoreTarget(This,target)
#define IVssComponentEx_GetRestoreTarget(This,pTarget) (This)->lpVtbl->GetRestoreTarget(This,pTarget)
#define IVssComponentEx_SetPreRestoreFailureMsg(This,wszPreRestoreFailureMsg) (This)->lpVtbl->SetPreRestoreFailureMsg(This,wszPreRestoreFailureMsg)
#define IVssComponentEx_GetPreRestoreFailureMsg(This,pbstrPreRestoreFailureMsg) (This)->lpVtbl->GetPreRestoreFailureMsg(This,pbstrPreRestoreFailureMsg)
#define IVssComponentEx_SetPostRestoreFailureMsg(This,wszPostRestoreFailureMsg) (This)->lpVtbl->SetPostRestoreFailureMsg(This,wszPostRestoreFailureMsg)
#define IVssComponentEx_GetPostRestoreFailureMsg(This,pbstrPostRestoreFailureMsg) (This)->lpVtbl->GetPostRestoreFailureMsg(This,pbstrPostRestoreFailureMsg)
#define IVssComponentEx_SetBackupStamp(This,wszBackupStamp) (This)->lpVtbl->SetBackupStamp(This,wszBackupStamp)
#define IVssComponentEx_GetBackupStamp(This,pbstrBackupStamp) (This)->lpVtbl->GetBackupStamp(This,pbstrBackupStamp)
#define IVssComponentEx_GetPreviousBackupStamp(This,pbstrBackupStamp) (This)->lpVtbl->GetPreviousBackupStamp(This,pbstrBackupStamp)
#define IVssComponentEx_GetBackupOptions(This,pbstrBackupOptions) (This)->lpVtbl->GetBackupOptions(This,pbstrBackupOptions)
#define IVssComponentEx_GetRestoreOptions(This,pbstrRestoreOptions) (This)->lpVtbl->GetRestoreOptions(This,pbstrRestoreOptions)
#define IVssComponentEx_GetRestoreSubcomponentCount(This,pcRestoreSubcomponent) (This)->lpVtbl->GetRestoreSubcomponentCount(This,pcRestoreSubcomponent)
#define IVssComponentEx_GetRestoreSubcomponent(This,iComponent,pbstrLogicalPath,pbstrComponentName,pbRepair) (This)->lpVtbl->GetRestoreSubcomponent(This,iComponent,pbstrLogicalPath,pbstrComponentName,pbRepair)
#define IVssComponentEx_GetFileRestoreStatus(This,pStatus) (This)->lpVtbl->GetFileRestoreStatus(This,pStatus)
#define IVssComponentEx_AddDifferencedFilesByLastModifyTime(This,wszPath,wszFilespec,bRecursive,ftLastModifyTime) (This)->lpVtbl->AddDifferencedFilesByLastModifyTime(This,wszPath,wszFilespec,bRecursive,ftLastModifyTime)
#define IVssComponentEx_AddDifferencedFilesByLastModifyLSN(This,wszPath,wszFilespec,bRecursive,bstrLsnString) (This)->lpVtbl->AddDifferencedFilesByLastModifyLSN(This,wszPath,wszFilespec,bRecursive,bstrLsnString)
#define IVssComponentEx_GetDifferencedFilesCount(This,pcDifferencedFiles) (This)->lpVtbl->GetDifferencedFilesCount(This,pcDifferencedFiles)
#define IVssComponentEx_GetDifferencedFile(This,iDifferencedFile,pbstrPath,pbstrFilespec,pbRecursive,pbstrLsnString,pftLastModifyTime) (This)->lpVtbl->GetDifferencedFile(This,iDifferencedFile,pbstrPath,pbstrFilespec,pbRecursive,pbstrLsnString,pftLastModifyTime)
/*** IVssComponentEx methods ***/
#define IVssComponentEx_SetPrepareForBackupFailureMsg(This,wszFailureMsg) (This)->lpVtbl->SetPrepareForBackupFailureMsg(This,wszFailureMsg)
#define IVssComponentEx_SetPostSnapshotFailureMsg(This,wszFailureMsg) (This)->lpVtbl->SetPostSnapshotFailureMsg(This,wszFailureMsg)
#define IVssComponentEx_GetPrepareForBackupFailureMsg(This,pbstrFailureMsg) (This)->lpVtbl->GetPrepareForBackupFailureMsg(This,pbstrFailureMsg)
#define IVssComponentEx_GetPostSnapshotFailureMsg(This,pbstrFailureMsg) (This)->lpVtbl->GetPostSnapshotFailureMsg(This,pbstrFailureMsg)
#define IVssComponentEx_GetAuthoritativeRestore(This,pbAuth) (This)->lpVtbl->GetAuthoritativeRestore(This,pbAuth)
#define IVssComponentEx_GetRollForward(This,pRollType,pbstrPoint) (This)->lpVtbl->GetRollForward(This,pRollType,pbstrPoint)
#define IVssComponentEx_GetRestoreName(This,pbstrName) (This)->lpVtbl->GetRestoreName(This,pbstrName)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVssComponentEx_QueryInterface(IVssComponentEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVssComponentEx_AddRef(IVssComponentEx* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVssComponentEx_Release(IVssComponentEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssComponent methods ***/
static __WIDL_INLINE HRESULT IVssComponentEx_GetLogicalPath(IVssComponentEx* This,BSTR *pbstrPath) {
    return This->lpVtbl->GetLogicalPath(This,pbstrPath);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetComponentType(IVssComponentEx* This,VSS_COMPONENT_TYPE *pct) {
    return This->lpVtbl->GetComponentType(This,pct);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetComponentName(IVssComponentEx* This,BSTR *pbstrName) {
    return This->lpVtbl->GetComponentName(This,pbstrName);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetBackupSucceeded(IVssComponentEx* This,boolean *pbSucceeded) {
    return This->lpVtbl->GetBackupSucceeded(This,pbSucceeded);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetAlternateLocationMappingCount(IVssComponentEx* This,UINT *pcMappings) {
    return This->lpVtbl->GetAlternateLocationMappingCount(This,pcMappings);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetAlternateLocationMapping(IVssComponentEx* This,UINT iMapping,IVssWMFiledesc **ppFiledesc) {
    return This->lpVtbl->GetAlternateLocationMapping(This,iMapping,ppFiledesc);
}
static __WIDL_INLINE HRESULT IVssComponentEx_SetBackupMetadata(IVssComponentEx* This,LPCWSTR wszData) {
    return This->lpVtbl->SetBackupMetadata(This,wszData);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetBackupMetadata(IVssComponentEx* This,BSTR *pbstrData) {
    return This->lpVtbl->GetBackupMetadata(This,pbstrData);
}
static __WIDL_INLINE HRESULT IVssComponentEx_AddPartialFile(IVssComponentEx* This,LPCWSTR wszPath,LPCWSTR wszFilename,LPCWSTR wszRanges,LPCWSTR wszMetadata) {
    return This->lpVtbl->AddPartialFile(This,wszPath,wszFilename,wszRanges,wszMetadata);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetPartialFileCount(IVssComponentEx* This,UINT *pcPartialFiles) {
    return This->lpVtbl->GetPartialFileCount(This,pcPartialFiles);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetPartialFile(IVssComponentEx* This,UINT iPartialFile,BSTR *pbstrPath,BSTR *pbstrFilename,BSTR *pbstrRange,BSTR *pbstrMetadata) {
    return This->lpVtbl->GetPartialFile(This,iPartialFile,pbstrPath,pbstrFilename,pbstrRange,pbstrMetadata);
}
static __WIDL_INLINE HRESULT IVssComponentEx_IsSelectedForRestore(IVssComponentEx* This,boolean *pbSelectedForRestore) {
    return This->lpVtbl->IsSelectedForRestore(This,pbSelectedForRestore);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetAdditionalRestores(IVssComponentEx* This,boolean *pbAdditionalRestores) {
    return This->lpVtbl->GetAdditionalRestores(This,pbAdditionalRestores);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetNewTargetCount(IVssComponentEx* This,UINT *pcNewTarget) {
    return This->lpVtbl->GetNewTargetCount(This,pcNewTarget);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetNewTarget(IVssComponentEx* This,UINT iNewTarget,IVssWMFiledesc **ppFiledesc) {
    return This->lpVtbl->GetNewTarget(This,iNewTarget,ppFiledesc);
}
static __WIDL_INLINE HRESULT IVssComponentEx_AddDirectedTarget(IVssComponentEx* This,LPCWSTR wszSourcePath,LPCWSTR wszSourceFilename,LPCWSTR wszSourceRangeList,LPCWSTR wszDestinationPath,LPCWSTR wszDestinationFilename,LPCWSTR wszDestinationRangeList) {
    return This->lpVtbl->AddDirectedTarget(This,wszSourcePath,wszSourceFilename,wszSourceRangeList,wszDestinationPath,wszDestinationFilename,wszDestinationRangeList);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetDirectedTargetCount(IVssComponentEx* This,UINT *pcDirectedTarget) {
    return This->lpVtbl->GetDirectedTargetCount(This,pcDirectedTarget);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetDirectedTarget(IVssComponentEx* This,UINT iDirectedTarget,BSTR *pbstrSourcePath,BSTR *pbstrSourceFileName,BSTR *pbstrSourceRangeList,BSTR *pbstrDestinationPath,BSTR *pbstrDestinationFilename,BSTR *pbstrDestinationRangeList) {
    return This->lpVtbl->GetDirectedTarget(This,iDirectedTarget,pbstrSourcePath,pbstrSourceFileName,pbstrSourceRangeList,pbstrDestinationPath,pbstrDestinationFilename,pbstrDestinationRangeList);
}
static __WIDL_INLINE HRESULT IVssComponentEx_SetRestoreMetadata(IVssComponentEx* This,LPCWSTR wszRestoreMetadata) {
    return This->lpVtbl->SetRestoreMetadata(This,wszRestoreMetadata);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetRestoreMetadata(IVssComponentEx* This,BSTR *pbstrRestoreMetadata) {
    return This->lpVtbl->GetRestoreMetadata(This,pbstrRestoreMetadata);
}
static __WIDL_INLINE HRESULT IVssComponentEx_SetRestoreTarget(IVssComponentEx* This,VSS_RESTORE_TARGET target) {
    return This->lpVtbl->SetRestoreTarget(This,target);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetRestoreTarget(IVssComponentEx* This,VSS_RESTORE_TARGET *pTarget) {
    return This->lpVtbl->GetRestoreTarget(This,pTarget);
}
static __WIDL_INLINE HRESULT IVssComponentEx_SetPreRestoreFailureMsg(IVssComponentEx* This,LPCWSTR wszPreRestoreFailureMsg) {
    return This->lpVtbl->SetPreRestoreFailureMsg(This,wszPreRestoreFailureMsg);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetPreRestoreFailureMsg(IVssComponentEx* This,BSTR *pbstrPreRestoreFailureMsg) {
    return This->lpVtbl->GetPreRestoreFailureMsg(This,pbstrPreRestoreFailureMsg);
}
static __WIDL_INLINE HRESULT IVssComponentEx_SetPostRestoreFailureMsg(IVssComponentEx* This,LPCWSTR wszPostRestoreFailureMsg) {
    return This->lpVtbl->SetPostRestoreFailureMsg(This,wszPostRestoreFailureMsg);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetPostRestoreFailureMsg(IVssComponentEx* This,BSTR *pbstrPostRestoreFailureMsg) {
    return This->lpVtbl->GetPostRestoreFailureMsg(This,pbstrPostRestoreFailureMsg);
}
static __WIDL_INLINE HRESULT IVssComponentEx_SetBackupStamp(IVssComponentEx* This,LPCWSTR wszBackupStamp) {
    return This->lpVtbl->SetBackupStamp(This,wszBackupStamp);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetBackupStamp(IVssComponentEx* This,BSTR *pbstrBackupStamp) {
    return This->lpVtbl->GetBackupStamp(This,pbstrBackupStamp);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetPreviousBackupStamp(IVssComponentEx* This,BSTR *pbstrBackupStamp) {
    return This->lpVtbl->GetPreviousBackupStamp(This,pbstrBackupStamp);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetBackupOptions(IVssComponentEx* This,BSTR *pbstrBackupOptions) {
    return This->lpVtbl->GetBackupOptions(This,pbstrBackupOptions);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetRestoreOptions(IVssComponentEx* This,BSTR *pbstrRestoreOptions) {
    return This->lpVtbl->GetRestoreOptions(This,pbstrRestoreOptions);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetRestoreSubcomponentCount(IVssComponentEx* This,UINT *pcRestoreSubcomponent) {
    return This->lpVtbl->GetRestoreSubcomponentCount(This,pcRestoreSubcomponent);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetRestoreSubcomponent(IVssComponentEx* This,UINT iComponent,BSTR *pbstrLogicalPath,BSTR *pbstrComponentName,boolean *pbRepair) {
    return This->lpVtbl->GetRestoreSubcomponent(This,iComponent,pbstrLogicalPath,pbstrComponentName,pbRepair);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetFileRestoreStatus(IVssComponentEx* This,VSS_FILE_RESTORE_STATUS *pStatus) {
    return This->lpVtbl->GetFileRestoreStatus(This,pStatus);
}
static __WIDL_INLINE HRESULT IVssComponentEx_AddDifferencedFilesByLastModifyTime(IVssComponentEx* This,LPCWSTR wszPath,LPCWSTR wszFilespec,WINBOOL bRecursive,FILETIME ftLastModifyTime) {
    return This->lpVtbl->AddDifferencedFilesByLastModifyTime(This,wszPath,wszFilespec,bRecursive,ftLastModifyTime);
}
static __WIDL_INLINE HRESULT IVssComponentEx_AddDifferencedFilesByLastModifyLSN(IVssComponentEx* This,LPCWSTR wszPath,LPCWSTR wszFilespec,WINBOOL bRecursive,BSTR bstrLsnString) {
    return This->lpVtbl->AddDifferencedFilesByLastModifyLSN(This,wszPath,wszFilespec,bRecursive,bstrLsnString);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetDifferencedFilesCount(IVssComponentEx* This,UINT *pcDifferencedFiles) {
    return This->lpVtbl->GetDifferencedFilesCount(This,pcDifferencedFiles);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetDifferencedFile(IVssComponentEx* This,UINT iDifferencedFile,BSTR *pbstrPath,BSTR *pbstrFilespec,WINBOOL *pbRecursive,BSTR *pbstrLsnString,FILETIME *pftLastModifyTime) {
    return This->lpVtbl->GetDifferencedFile(This,iDifferencedFile,pbstrPath,pbstrFilespec,pbRecursive,pbstrLsnString,pftLastModifyTime);
}
/*** IVssComponentEx methods ***/
static __WIDL_INLINE HRESULT IVssComponentEx_SetPrepareForBackupFailureMsg(IVssComponentEx* This,LPCWSTR wszFailureMsg) {
    return This->lpVtbl->SetPrepareForBackupFailureMsg(This,wszFailureMsg);
}
static __WIDL_INLINE HRESULT IVssComponentEx_SetPostSnapshotFailureMsg(IVssComponentEx* This,LPCWSTR wszFailureMsg) {
    return This->lpVtbl->SetPostSnapshotFailureMsg(This,wszFailureMsg);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetPrepareForBackupFailureMsg(IVssComponentEx* This,BSTR *pbstrFailureMsg) {
    return This->lpVtbl->GetPrepareForBackupFailureMsg(This,pbstrFailureMsg);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetPostSnapshotFailureMsg(IVssComponentEx* This,BSTR *pbstrFailureMsg) {
    return This->lpVtbl->GetPostSnapshotFailureMsg(This,pbstrFailureMsg);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetAuthoritativeRestore(IVssComponentEx* This,boolean *pbAuth) {
    return This->lpVtbl->GetAuthoritativeRestore(This,pbAuth);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetRollForward(IVssComponentEx* This,VSS_ROLLFORWARD_TYPE *pRollType,BSTR *pbstrPoint) {
    return This->lpVtbl->GetRollForward(This,pRollType,pbstrPoint);
}
static __WIDL_INLINE HRESULT IVssComponentEx_GetRestoreName(IVssComponentEx* This,BSTR *pbstrName) {
    return This->lpVtbl->GetRestoreName(This,pbstrName);
}
#endif
#endif

#endif


#endif  /* __IVssComponentEx_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssComponentEx2 interface
 */
#ifndef __IVssComponentEx2_INTERFACE_DEFINED__
#define __IVssComponentEx2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssComponentEx2, 0x3b5be0f2, 0x07a9, 0x4e4b, 0xbd,0xd3, 0xcf,0xdc,0x8e,0x2c,0x0d,0x2d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3b5be0f2-07a9-4e4b-bdd3-cfdc8e2c0d2d")
IVssComponentEx2 : public IVssComponentEx
{
    virtual HRESULT STDMETHODCALLTYPE SetFailure(
        HRESULT hr,
        HRESULT hrApplication,
        LPCWSTR wszApplicationMessage,
        DWORD dwReserved) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFailure(
        HRESULT *phr,
        HRESULT *phrApplication,
        BSTR *pbstrApplicationMessage,
        DWORD *pdwReserved) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssComponentEx2, 0x3b5be0f2, 0x07a9, 0x4e4b, 0xbd,0xd3, 0xcf,0xdc,0x8e,0x2c,0x0d,0x2d)
#endif
#else
typedef struct IVssComponentEx2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVssComponent methods ***/
    HRESULT (STDMETHODCALLTYPE *GetLogicalPath)(
        IVssComponentEx2 *This,
        BSTR *pbstrPath);

    HRESULT (STDMETHODCALLTYPE *GetComponentType)(
        IVssComponentEx2 *This,
        VSS_COMPONENT_TYPE *pct);

    HRESULT (STDMETHODCALLTYPE *GetComponentName)(
        IVssComponentEx2 *This,
        BSTR *pbstrName);

    HRESULT (STDMETHODCALLTYPE *GetBackupSucceeded)(
        IVssComponentEx2 *This,
        boolean *pbSucceeded);

    HRESULT (STDMETHODCALLTYPE *GetAlternateLocationMappingCount)(
        IVssComponentEx2 *This,
        UINT *pcMappings);

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

    HRESULT (STDMETHODCALLTYPE *SetBackupMetadata)(
        IVssComponentEx2 *This,
        LPCWSTR wszData);

    HRESULT (STDMETHODCALLTYPE *GetBackupMetadata)(
        IVssComponentEx2 *This,
        BSTR *pbstrData);

    HRESULT (STDMETHODCALLTYPE *AddPartialFile)(
        IVssComponentEx2 *This,
        LPCWSTR wszPath,
        LPCWSTR wszFilename,
        LPCWSTR wszRanges,
        LPCWSTR wszMetadata);

    HRESULT (STDMETHODCALLTYPE *GetPartialFileCount)(
        IVssComponentEx2 *This,
        UINT *pcPartialFiles);

    HRESULT (STDMETHODCALLTYPE *GetPartialFile)(
        IVssComponentEx2 *This,
        UINT iPartialFile,
        BSTR *pbstrPath,
        BSTR *pbstrFilename,
        BSTR *pbstrRange,
        BSTR *pbstrMetadata);

    HRESULT (STDMETHODCALLTYPE *IsSelectedForRestore)(
        IVssComponentEx2 *This,
        boolean *pbSelectedForRestore);

    HRESULT (STDMETHODCALLTYPE *GetAdditionalRestores)(
        IVssComponentEx2 *This,
        boolean *pbAdditionalRestores);

    HRESULT (STDMETHODCALLTYPE *GetNewTargetCount)(
        IVssComponentEx2 *This,
        UINT *pcNewTarget);

    HRESULT (STDMETHODCALLTYPE *GetNewTarget)(
        IVssComponentEx2 *This,
        UINT iNewTarget,
        IVssWMFiledesc **ppFiledesc);

    HRESULT (STDMETHODCALLTYPE *AddDirectedTarget)(
        IVssComponentEx2 *This,
        LPCWSTR wszSourcePath,
        LPCWSTR wszSourceFilename,
        LPCWSTR wszSourceRangeList,
        LPCWSTR wszDestinationPath,
        LPCWSTR wszDestinationFilename,
        LPCWSTR wszDestinationRangeList);

    HRESULT (STDMETHODCALLTYPE *GetDirectedTargetCount)(
        IVssComponentEx2 *This,
        UINT *pcDirectedTarget);

    HRESULT (STDMETHODCALLTYPE *GetDirectedTarget)(
        IVssComponentEx2 *This,
        UINT iDirectedTarget,
        BSTR *pbstrSourcePath,
        BSTR *pbstrSourceFileName,
        BSTR *pbstrSourceRangeList,
        BSTR *pbstrDestinationPath,
        BSTR *pbstrDestinationFilename,
        BSTR *pbstrDestinationRangeList);

    HRESULT (STDMETHODCALLTYPE *SetRestoreMetadata)(
        IVssComponentEx2 *This,
        LPCWSTR wszRestoreMetadata);

    HRESULT (STDMETHODCALLTYPE *GetRestoreMetadata)(
        IVssComponentEx2 *This,
        BSTR *pbstrRestoreMetadata);

    HRESULT (STDMETHODCALLTYPE *SetRestoreTarget)(
        IVssComponentEx2 *This,
        VSS_RESTORE_TARGET target);

    HRESULT (STDMETHODCALLTYPE *GetRestoreTarget)(
        IVssComponentEx2 *This,
        VSS_RESTORE_TARGET *pTarget);

    HRESULT (STDMETHODCALLTYPE *SetPreRestoreFailureMsg)(
        IVssComponentEx2 *This,
        LPCWSTR wszPreRestoreFailureMsg);

    HRESULT (STDMETHODCALLTYPE *GetPreRestoreFailureMsg)(
        IVssComponentEx2 *This,
        BSTR *pbstrPreRestoreFailureMsg);

    HRESULT (STDMETHODCALLTYPE *SetPostRestoreFailureMsg)(
        IVssComponentEx2 *This,
        LPCWSTR wszPostRestoreFailureMsg);

    HRESULT (STDMETHODCALLTYPE *GetPostRestoreFailureMsg)(
        IVssComponentEx2 *This,
        BSTR *pbstrPostRestoreFailureMsg);

    HRESULT (STDMETHODCALLTYPE *SetBackupStamp)(
        IVssComponentEx2 *This,
        LPCWSTR wszBackupStamp);

    HRESULT (STDMETHODCALLTYPE *GetBackupStamp)(
        IVssComponentEx2 *This,
        BSTR *pbstrBackupStamp);

    HRESULT (STDMETHODCALLTYPE *GetPreviousBackupStamp)(
        IVssComponentEx2 *This,
        BSTR *pbstrBackupStamp);

    HRESULT (STDMETHODCALLTYPE *GetBackupOptions)(
        IVssComponentEx2 *This,
        BSTR *pbstrBackupOptions);

    HRESULT (STDMETHODCALLTYPE *GetRestoreOptions)(
        IVssComponentEx2 *This,
        BSTR *pbstrRestoreOptions);

    HRESULT (STDMETHODCALLTYPE *GetRestoreSubcomponentCount)(
        IVssComponentEx2 *This,
        UINT *pcRestoreSubcomponent);

    HRESULT (STDMETHODCALLTYPE *GetRestoreSubcomponent)(
        IVssComponentEx2 *This,
        UINT iComponent,
        BSTR *pbstrLogicalPath,
        BSTR *pbstrComponentName,
        boolean *pbRepair);

    HRESULT (STDMETHODCALLTYPE *GetFileRestoreStatus)(
        IVssComponentEx2 *This,
        VSS_FILE_RESTORE_STATUS *pStatus);

    HRESULT (STDMETHODCALLTYPE *AddDifferencedFilesByLastModifyTime)(
        IVssComponentEx2 *This,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        WINBOOL bRecursive,
        FILETIME ftLastModifyTime);

    HRESULT (STDMETHODCALLTYPE *AddDifferencedFilesByLastModifyLSN)(
        IVssComponentEx2 *This,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        WINBOOL bRecursive,
        BSTR bstrLsnString);

    HRESULT (STDMETHODCALLTYPE *GetDifferencedFilesCount)(
        IVssComponentEx2 *This,
        UINT *pcDifferencedFiles);

    HRESULT (STDMETHODCALLTYPE *GetDifferencedFile)(
        IVssComponentEx2 *This,
        UINT iDifferencedFile,
        BSTR *pbstrPath,
        BSTR *pbstrFilespec,
        WINBOOL *pbRecursive,
        BSTR *pbstrLsnString,
        FILETIME *pftLastModifyTime);

    /*** IVssComponentEx methods ***/
    HRESULT (STDMETHODCALLTYPE *SetPrepareForBackupFailureMsg)(
        IVssComponentEx2 *This,
        LPCWSTR wszFailureMsg);

    HRESULT (STDMETHODCALLTYPE *SetPostSnapshotFailureMsg)(
        IVssComponentEx2 *This,
        LPCWSTR wszFailureMsg);

    HRESULT (STDMETHODCALLTYPE *GetPrepareForBackupFailureMsg)(
        IVssComponentEx2 *This,
        BSTR *pbstrFailureMsg);

    HRESULT (STDMETHODCALLTYPE *GetPostSnapshotFailureMsg)(
        IVssComponentEx2 *This,
        BSTR *pbstrFailureMsg);

    HRESULT (STDMETHODCALLTYPE *GetAuthoritativeRestore)(
        IVssComponentEx2 *This,
        boolean *pbAuth);

    HRESULT (STDMETHODCALLTYPE *GetRollForward)(
        IVssComponentEx2 *This,
        VSS_ROLLFORWARD_TYPE *pRollType,
        BSTR *pbstrPoint);

    HRESULT (STDMETHODCALLTYPE *GetRestoreName)(
        IVssComponentEx2 *This,
        BSTR *pbstrName);

    /*** IVssComponentEx2 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFailure)(
        IVssComponentEx2 *This,
        HRESULT hr,
        HRESULT hrApplication,
        LPCWSTR wszApplicationMessage,
        DWORD dwReserved);

    HRESULT (STDMETHODCALLTYPE *GetFailure)(
        IVssComponentEx2 *This,
        HRESULT *phr,
        HRESULT *phrApplication,
        BSTR *pbstrApplicationMessage,
        DWORD *pdwReserved);

    END_INTERFACE
} IVssComponentEx2Vtbl;

interface IVssComponentEx2 {
    CONST_VTBL IVssComponentEx2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssComponentEx2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssComponentEx2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssComponentEx2_Release(This) (This)->lpVtbl->Release(This)
/*** IVssComponent methods ***/
#define IVssComponentEx2_GetLogicalPath(This,pbstrPath) (This)->lpVtbl->GetLogicalPath(This,pbstrPath)
#define IVssComponentEx2_GetComponentType(This,pct) (This)->lpVtbl->GetComponentType(This,pct)
#define IVssComponentEx2_GetComponentName(This,pbstrName) (This)->lpVtbl->GetComponentName(This,pbstrName)
#define IVssComponentEx2_GetBackupSucceeded(This,pbSucceeded) (This)->lpVtbl->GetBackupSucceeded(This,pbSucceeded)
#define IVssComponentEx2_GetAlternateLocationMappingCount(This,pcMappings) (This)->lpVtbl->GetAlternateLocationMappingCount(This,pcMappings)
#define IVssComponentEx2_GetAlternateLocationMapping(This,iMapping,ppFiledesc) (This)->lpVtbl->GetAlternateLocationMapping(This,iMapping,ppFiledesc)
#define IVssComponentEx2_SetBackupMetadata(This,wszData) (This)->lpVtbl->SetBackupMetadata(This,wszData)
#define IVssComponentEx2_GetBackupMetadata(This,pbstrData) (This)->lpVtbl->GetBackupMetadata(This,pbstrData)
#define IVssComponentEx2_AddPartialFile(This,wszPath,wszFilename,wszRanges,wszMetadata) (This)->lpVtbl->AddPartialFile(This,wszPath,wszFilename,wszRanges,wszMetadata)
#define IVssComponentEx2_GetPartialFileCount(This,pcPartialFiles) (This)->lpVtbl->GetPartialFileCount(This,pcPartialFiles)
#define IVssComponentEx2_GetPartialFile(This,iPartialFile,pbstrPath,pbstrFilename,pbstrRange,pbstrMetadata) (This)->lpVtbl->GetPartialFile(This,iPartialFile,pbstrPath,pbstrFilename,pbstrRange,pbstrMetadata)
#define IVssComponentEx2_IsSelectedForRestore(This,pbSelectedForRestore) (This)->lpVtbl->IsSelectedForRestore(This,pbSelectedForRestore)
#define IVssComponentEx2_GetAdditionalRestores(This,pbAdditionalRestores) (This)->lpVtbl->GetAdditionalRestores(This,pbAdditionalRestores)
#define IVssComponentEx2_GetNewTargetCount(This,pcNewTarget) (This)->lpVtbl->GetNewTargetCount(This,pcNewTarget)
#define IVssComponentEx2_GetNewTarget(This,iNewTarget,ppFiledesc) (This)->lpVtbl->GetNewTarget(This,iNewTarget,ppFiledesc)
#define IVssComponentEx2_AddDirectedTarget(This,wszSourcePath,wszSourceFilename,wszSourceRangeList,wszDestinationPath,wszDestinationFilename,wszDestinationRangeList) (This)->lpVtbl->AddDirectedTarget(This,wszSourcePath,wszSourceFilename,wszSourceRangeList,wszDestinationPath,wszDestinationFilename,wszDestinationRangeList)
#define IVssComponentEx2_GetDirectedTargetCount(This,pcDirectedTarget) (This)->lpVtbl->GetDirectedTargetCount(This,pcDirectedTarget)
#define IVssComponentEx2_GetDirectedTarget(This,iDirectedTarget,pbstrSourcePath,pbstrSourceFileName,pbstrSourceRangeList,pbstrDestinationPath,pbstrDestinationFilename,pbstrDestinationRangeList) (This)->lpVtbl->GetDirectedTarget(This,iDirectedTarget,pbstrSourcePath,pbstrSourceFileName,pbstrSourceRangeList,pbstrDestinationPath,pbstrDestinationFilename,pbstrDestinationRangeList)
#define IVssComponentEx2_SetRestoreMetadata(This,wszRestoreMetadata) (This)->lpVtbl->SetRestoreMetadata(This,wszRestoreMetadata)
#define IVssComponentEx2_GetRestoreMetadata(This,pbstrRestoreMetadata) (This)->lpVtbl->GetRestoreMetadata(This,pbstrRestoreMetadata)
#define IVssComponentEx2_SetRestoreTarget(This,target) (This)->lpVtbl->SetRestoreTarget(This,target)
#define IVssComponentEx2_GetRestoreTarget(This,pTarget) (This)->lpVtbl->GetRestoreTarget(This,pTarget)
#define IVssComponentEx2_SetPreRestoreFailureMsg(This,wszPreRestoreFailureMsg) (This)->lpVtbl->SetPreRestoreFailureMsg(This,wszPreRestoreFailureMsg)
#define IVssComponentEx2_GetPreRestoreFailureMsg(This,pbstrPreRestoreFailureMsg) (This)->lpVtbl->GetPreRestoreFailureMsg(This,pbstrPreRestoreFailureMsg)
#define IVssComponentEx2_SetPostRestoreFailureMsg(This,wszPostRestoreFailureMsg) (This)->lpVtbl->SetPostRestoreFailureMsg(This,wszPostRestoreFailureMsg)
#define IVssComponentEx2_GetPostRestoreFailureMsg(This,pbstrPostRestoreFailureMsg) (This)->lpVtbl->GetPostRestoreFailureMsg(This,pbstrPostRestoreFailureMsg)
#define IVssComponentEx2_SetBackupStamp(This,wszBackupStamp) (This)->lpVtbl->SetBackupStamp(This,wszBackupStamp)
#define IVssComponentEx2_GetBackupStamp(This,pbstrBackupStamp) (This)->lpVtbl->GetBackupStamp(This,pbstrBackupStamp)
#define IVssComponentEx2_GetPreviousBackupStamp(This,pbstrBackupStamp) (This)->lpVtbl->GetPreviousBackupStamp(This,pbstrBackupStamp)
#define IVssComponentEx2_GetBackupOptions(This,pbstrBackupOptions) (This)->lpVtbl->GetBackupOptions(This,pbstrBackupOptions)
#define IVssComponentEx2_GetRestoreOptions(This,pbstrRestoreOptions) (This)->lpVtbl->GetRestoreOptions(This,pbstrRestoreOptions)
#define IVssComponentEx2_GetRestoreSubcomponentCount(This,pcRestoreSubcomponent) (This)->lpVtbl->GetRestoreSubcomponentCount(This,pcRestoreSubcomponent)
#define IVssComponentEx2_GetRestoreSubcomponent(This,iComponent,pbstrLogicalPath,pbstrComponentName,pbRepair) (This)->lpVtbl->GetRestoreSubcomponent(This,iComponent,pbstrLogicalPath,pbstrComponentName,pbRepair)
#define IVssComponentEx2_GetFileRestoreStatus(This,pStatus) (This)->lpVtbl->GetFileRestoreStatus(This,pStatus)
#define IVssComponentEx2_AddDifferencedFilesByLastModifyTime(This,wszPath,wszFilespec,bRecursive,ftLastModifyTime) (This)->lpVtbl->AddDifferencedFilesByLastModifyTime(This,wszPath,wszFilespec,bRecursive,ftLastModifyTime)
#define IVssComponentEx2_AddDifferencedFilesByLastModifyLSN(This,wszPath,wszFilespec,bRecursive,bstrLsnString) (This)->lpVtbl->AddDifferencedFilesByLastModifyLSN(This,wszPath,wszFilespec,bRecursive,bstrLsnString)
#define IVssComponentEx2_GetDifferencedFilesCount(This,pcDifferencedFiles) (This)->lpVtbl->GetDifferencedFilesCount(This,pcDifferencedFiles)
#define IVssComponentEx2_GetDifferencedFile(This,iDifferencedFile,pbstrPath,pbstrFilespec,pbRecursive,pbstrLsnString,pftLastModifyTime) (This)->lpVtbl->GetDifferencedFile(This,iDifferencedFile,pbstrPath,pbstrFilespec,pbRecursive,pbstrLsnString,pftLastModifyTime)
/*** IVssComponentEx methods ***/
#define IVssComponentEx2_SetPrepareForBackupFailureMsg(This,wszFailureMsg) (This)->lpVtbl->SetPrepareForBackupFailureMsg(This,wszFailureMsg)
#define IVssComponentEx2_SetPostSnapshotFailureMsg(This,wszFailureMsg) (This)->lpVtbl->SetPostSnapshotFailureMsg(This,wszFailureMsg)
#define IVssComponentEx2_GetPrepareForBackupFailureMsg(This,pbstrFailureMsg) (This)->lpVtbl->GetPrepareForBackupFailureMsg(This,pbstrFailureMsg)
#define IVssComponentEx2_GetPostSnapshotFailureMsg(This,pbstrFailureMsg) (This)->lpVtbl->GetPostSnapshotFailureMsg(This,pbstrFailureMsg)
#define IVssComponentEx2_GetAuthoritativeRestore(This,pbAuth) (This)->lpVtbl->GetAuthoritativeRestore(This,pbAuth)
#define IVssComponentEx2_GetRollForward(This,pRollType,pbstrPoint) (This)->lpVtbl->GetRollForward(This,pRollType,pbstrPoint)
#define IVssComponentEx2_GetRestoreName(This,pbstrName) (This)->lpVtbl->GetRestoreName(This,pbstrName)
/*** IVssComponentEx2 methods ***/
#define IVssComponentEx2_SetFailure(This,hr,hrApplication,wszApplicationMessage,dwReserved) (This)->lpVtbl->SetFailure(This,hr,hrApplication,wszApplicationMessage,dwReserved)
#define IVssComponentEx2_GetFailure(This,phr,phrApplication,pbstrApplicationMessage,pdwReserved) (This)->lpVtbl->GetFailure(This,phr,phrApplication,pbstrApplicationMessage,pdwReserved)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVssComponentEx2_QueryInterface(IVssComponentEx2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVssComponentEx2_AddRef(IVssComponentEx2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVssComponentEx2_Release(IVssComponentEx2* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssComponent methods ***/
static __WIDL_INLINE HRESULT IVssComponentEx2_GetLogicalPath(IVssComponentEx2* This,BSTR *pbstrPath) {
    return This->lpVtbl->GetLogicalPath(This,pbstrPath);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetComponentType(IVssComponentEx2* This,VSS_COMPONENT_TYPE *pct) {
    return This->lpVtbl->GetComponentType(This,pct);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetComponentName(IVssComponentEx2* This,BSTR *pbstrName) {
    return This->lpVtbl->GetComponentName(This,pbstrName);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetBackupSucceeded(IVssComponentEx2* This,boolean *pbSucceeded) {
    return This->lpVtbl->GetBackupSucceeded(This,pbSucceeded);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetAlternateLocationMappingCount(IVssComponentEx2* This,UINT *pcMappings) {
    return This->lpVtbl->GetAlternateLocationMappingCount(This,pcMappings);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetAlternateLocationMapping(IVssComponentEx2* This,UINT iMapping,IVssWMFiledesc **ppFiledesc) {
    return This->lpVtbl->GetAlternateLocationMapping(This,iMapping,ppFiledesc);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_SetBackupMetadata(IVssComponentEx2* This,LPCWSTR wszData) {
    return This->lpVtbl->SetBackupMetadata(This,wszData);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetBackupMetadata(IVssComponentEx2* This,BSTR *pbstrData) {
    return This->lpVtbl->GetBackupMetadata(This,pbstrData);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_AddPartialFile(IVssComponentEx2* This,LPCWSTR wszPath,LPCWSTR wszFilename,LPCWSTR wszRanges,LPCWSTR wszMetadata) {
    return This->lpVtbl->AddPartialFile(This,wszPath,wszFilename,wszRanges,wszMetadata);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetPartialFileCount(IVssComponentEx2* This,UINT *pcPartialFiles) {
    return This->lpVtbl->GetPartialFileCount(This,pcPartialFiles);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetPartialFile(IVssComponentEx2* This,UINT iPartialFile,BSTR *pbstrPath,BSTR *pbstrFilename,BSTR *pbstrRange,BSTR *pbstrMetadata) {
    return This->lpVtbl->GetPartialFile(This,iPartialFile,pbstrPath,pbstrFilename,pbstrRange,pbstrMetadata);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_IsSelectedForRestore(IVssComponentEx2* This,boolean *pbSelectedForRestore) {
    return This->lpVtbl->IsSelectedForRestore(This,pbSelectedForRestore);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetAdditionalRestores(IVssComponentEx2* This,boolean *pbAdditionalRestores) {
    return This->lpVtbl->GetAdditionalRestores(This,pbAdditionalRestores);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetNewTargetCount(IVssComponentEx2* This,UINT *pcNewTarget) {
    return This->lpVtbl->GetNewTargetCount(This,pcNewTarget);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetNewTarget(IVssComponentEx2* This,UINT iNewTarget,IVssWMFiledesc **ppFiledesc) {
    return This->lpVtbl->GetNewTarget(This,iNewTarget,ppFiledesc);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_AddDirectedTarget(IVssComponentEx2* This,LPCWSTR wszSourcePath,LPCWSTR wszSourceFilename,LPCWSTR wszSourceRangeList,LPCWSTR wszDestinationPath,LPCWSTR wszDestinationFilename,LPCWSTR wszDestinationRangeList) {
    return This->lpVtbl->AddDirectedTarget(This,wszSourcePath,wszSourceFilename,wszSourceRangeList,wszDestinationPath,wszDestinationFilename,wszDestinationRangeList);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetDirectedTargetCount(IVssComponentEx2* This,UINT *pcDirectedTarget) {
    return This->lpVtbl->GetDirectedTargetCount(This,pcDirectedTarget);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetDirectedTarget(IVssComponentEx2* This,UINT iDirectedTarget,BSTR *pbstrSourcePath,BSTR *pbstrSourceFileName,BSTR *pbstrSourceRangeList,BSTR *pbstrDestinationPath,BSTR *pbstrDestinationFilename,BSTR *pbstrDestinationRangeList) {
    return This->lpVtbl->GetDirectedTarget(This,iDirectedTarget,pbstrSourcePath,pbstrSourceFileName,pbstrSourceRangeList,pbstrDestinationPath,pbstrDestinationFilename,pbstrDestinationRangeList);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_SetRestoreMetadata(IVssComponentEx2* This,LPCWSTR wszRestoreMetadata) {
    return This->lpVtbl->SetRestoreMetadata(This,wszRestoreMetadata);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetRestoreMetadata(IVssComponentEx2* This,BSTR *pbstrRestoreMetadata) {
    return This->lpVtbl->GetRestoreMetadata(This,pbstrRestoreMetadata);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_SetRestoreTarget(IVssComponentEx2* This,VSS_RESTORE_TARGET target) {
    return This->lpVtbl->SetRestoreTarget(This,target);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetRestoreTarget(IVssComponentEx2* This,VSS_RESTORE_TARGET *pTarget) {
    return This->lpVtbl->GetRestoreTarget(This,pTarget);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_SetPreRestoreFailureMsg(IVssComponentEx2* This,LPCWSTR wszPreRestoreFailureMsg) {
    return This->lpVtbl->SetPreRestoreFailureMsg(This,wszPreRestoreFailureMsg);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetPreRestoreFailureMsg(IVssComponentEx2* This,BSTR *pbstrPreRestoreFailureMsg) {
    return This->lpVtbl->GetPreRestoreFailureMsg(This,pbstrPreRestoreFailureMsg);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_SetPostRestoreFailureMsg(IVssComponentEx2* This,LPCWSTR wszPostRestoreFailureMsg) {
    return This->lpVtbl->SetPostRestoreFailureMsg(This,wszPostRestoreFailureMsg);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetPostRestoreFailureMsg(IVssComponentEx2* This,BSTR *pbstrPostRestoreFailureMsg) {
    return This->lpVtbl->GetPostRestoreFailureMsg(This,pbstrPostRestoreFailureMsg);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_SetBackupStamp(IVssComponentEx2* This,LPCWSTR wszBackupStamp) {
    return This->lpVtbl->SetBackupStamp(This,wszBackupStamp);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetBackupStamp(IVssComponentEx2* This,BSTR *pbstrBackupStamp) {
    return This->lpVtbl->GetBackupStamp(This,pbstrBackupStamp);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetPreviousBackupStamp(IVssComponentEx2* This,BSTR *pbstrBackupStamp) {
    return This->lpVtbl->GetPreviousBackupStamp(This,pbstrBackupStamp);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetBackupOptions(IVssComponentEx2* This,BSTR *pbstrBackupOptions) {
    return This->lpVtbl->GetBackupOptions(This,pbstrBackupOptions);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetRestoreOptions(IVssComponentEx2* This,BSTR *pbstrRestoreOptions) {
    return This->lpVtbl->GetRestoreOptions(This,pbstrRestoreOptions);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetRestoreSubcomponentCount(IVssComponentEx2* This,UINT *pcRestoreSubcomponent) {
    return This->lpVtbl->GetRestoreSubcomponentCount(This,pcRestoreSubcomponent);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetRestoreSubcomponent(IVssComponentEx2* This,UINT iComponent,BSTR *pbstrLogicalPath,BSTR *pbstrComponentName,boolean *pbRepair) {
    return This->lpVtbl->GetRestoreSubcomponent(This,iComponent,pbstrLogicalPath,pbstrComponentName,pbRepair);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetFileRestoreStatus(IVssComponentEx2* This,VSS_FILE_RESTORE_STATUS *pStatus) {
    return This->lpVtbl->GetFileRestoreStatus(This,pStatus);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_AddDifferencedFilesByLastModifyTime(IVssComponentEx2* This,LPCWSTR wszPath,LPCWSTR wszFilespec,WINBOOL bRecursive,FILETIME ftLastModifyTime) {
    return This->lpVtbl->AddDifferencedFilesByLastModifyTime(This,wszPath,wszFilespec,bRecursive,ftLastModifyTime);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_AddDifferencedFilesByLastModifyLSN(IVssComponentEx2* This,LPCWSTR wszPath,LPCWSTR wszFilespec,WINBOOL bRecursive,BSTR bstrLsnString) {
    return This->lpVtbl->AddDifferencedFilesByLastModifyLSN(This,wszPath,wszFilespec,bRecursive,bstrLsnString);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetDifferencedFilesCount(IVssComponentEx2* This,UINT *pcDifferencedFiles) {
    return This->lpVtbl->GetDifferencedFilesCount(This,pcDifferencedFiles);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetDifferencedFile(IVssComponentEx2* This,UINT iDifferencedFile,BSTR *pbstrPath,BSTR *pbstrFilespec,WINBOOL *pbRecursive,BSTR *pbstrLsnString,FILETIME *pftLastModifyTime) {
    return This->lpVtbl->GetDifferencedFile(This,iDifferencedFile,pbstrPath,pbstrFilespec,pbRecursive,pbstrLsnString,pftLastModifyTime);
}
/*** IVssComponentEx methods ***/
static __WIDL_INLINE HRESULT IVssComponentEx2_SetPrepareForBackupFailureMsg(IVssComponentEx2* This,LPCWSTR wszFailureMsg) {
    return This->lpVtbl->SetPrepareForBackupFailureMsg(This,wszFailureMsg);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_SetPostSnapshotFailureMsg(IVssComponentEx2* This,LPCWSTR wszFailureMsg) {
    return This->lpVtbl->SetPostSnapshotFailureMsg(This,wszFailureMsg);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetPrepareForBackupFailureMsg(IVssComponentEx2* This,BSTR *pbstrFailureMsg) {
    return This->lpVtbl->GetPrepareForBackupFailureMsg(This,pbstrFailureMsg);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetPostSnapshotFailureMsg(IVssComponentEx2* This,BSTR *pbstrFailureMsg) {
    return This->lpVtbl->GetPostSnapshotFailureMsg(This,pbstrFailureMsg);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetAuthoritativeRestore(IVssComponentEx2* This,boolean *pbAuth) {
    return This->lpVtbl->GetAuthoritativeRestore(This,pbAuth);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetRollForward(IVssComponentEx2* This,VSS_ROLLFORWARD_TYPE *pRollType,BSTR *pbstrPoint) {
    return This->lpVtbl->GetRollForward(This,pRollType,pbstrPoint);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetRestoreName(IVssComponentEx2* This,BSTR *pbstrName) {
    return This->lpVtbl->GetRestoreName(This,pbstrName);
}
/*** IVssComponentEx2 methods ***/
static __WIDL_INLINE HRESULT IVssComponentEx2_SetFailure(IVssComponentEx2* This,HRESULT hr,HRESULT hrApplication,LPCWSTR wszApplicationMessage,DWORD dwReserved) {
    return This->lpVtbl->SetFailure(This,hr,hrApplication,wszApplicationMessage,dwReserved);
}
static __WIDL_INLINE HRESULT IVssComponentEx2_GetFailure(IVssComponentEx2* This,HRESULT *phr,HRESULT *phrApplication,BSTR *pbstrApplicationMessage,DWORD *pdwReserved) {
    return This->lpVtbl->GetFailure(This,phr,phrApplication,pbstrApplicationMessage,pdwReserved);
}
#endif
#endif

#endif


#endif  /* __IVssComponentEx2_INTERFACE_DEFINED__ */

#ifndef __IXMLDOMDocument_FWD_DEFINED__
#define __IXMLDOMDocument_FWD_DEFINED__
typedef interface IXMLDOMDocument IXMLDOMDocument;
#ifdef __cplusplus
interface IXMLDOMDocument;
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * IVssCreateWriterMetadata interface
 */
#ifndef __IVssCreateWriterMetadata_INTERFACE_DEFINED__
#define __IVssCreateWriterMetadata_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssCreateWriterMetadata, 0x00000000, 0x0000, 0x0000, 0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00000000-0000-0000-0000-000000000000")
IVssCreateWriterMetadata
{

    BEGIN_INTERFACE

    virtual HRESULT STDMETHODCALLTYPE AddIncludeFiles(
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        boolean bRecursive,
        LPCWSTR wszAlternateLocation) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddExcludeFiles(
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        boolean bRecursive) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddComponent(
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszCaption,
        const BYTE *pbIcon,
        UINT cbIcon,
        boolean bRestoreMetadata,
        boolean bNotifyOnBackupComplete,
        boolean bSelectable,
        boolean bSelectableForRestore = 0,
        DWORD dwComponentFlags = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddDatabaseFiles(
        LPCWSTR wszLogicalPath,
        LPCWSTR wszDatabaseName,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        DWORD dwBackupTypeMask = VSS_FSBT_ALL_BACKUP_REQUIRED | VSS_FSBT_ALL_SNAPSHOT_REQUIRED) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddDatabaseLogFiles(
        LPCWSTR wszLogicalPath,
        LPCWSTR wszDatabaseName,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        DWORD dwBackupTypeMask = VSS_FSBT_ALL_BACKUP_REQUIRED | VSS_FSBT_ALL_SNAPSHOT_REQUIRED) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddFilesToFileGroup(
        LPCWSTR wszLogicalPath,
        LPCWSTR wszGroupName,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        boolean bRecursive,
        LPCWSTR wszAlternateLocation,
        DWORD dwBackupTypeMask = VSS_FSBT_ALL_BACKUP_REQUIRED | VSS_FSBT_ALL_SNAPSHOT_REQUIRED) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRestoreMethod(
        VSS_RESTOREMETHOD_ENUM method,
        LPCWSTR wszService,
        LPCWSTR wszUserProcedure,
        VSS_WRITERRESTORE_ENUM writerRestore,
        boolean bRebootRequired) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddAlternateLocationMapping(
        LPCWSTR wszSourcePath,
        LPCWSTR wszSourceFilespec,
        boolean bRecursive,
        LPCWSTR wszDestination) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddComponentDependency(
        LPCWSTR wszForLogicalPath,
        LPCWSTR wszForComponentName,
        VSS_ID onWriterId,
        LPCWSTR wszOnLogicalPath,
        LPCWSTR wszOnComponentName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBackupSchema(
        DWORD dwSchemaMask) = 0;

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

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

    END_INTERFACE

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

    /*** IVssCreateWriterMetadata methods ***/
    HRESULT (STDMETHODCALLTYPE *AddIncludeFiles)(
        IVssCreateWriterMetadata *This,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        boolean bRecursive,
        LPCWSTR wszAlternateLocation);

    HRESULT (STDMETHODCALLTYPE *AddExcludeFiles)(
        IVssCreateWriterMetadata *This,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        boolean bRecursive);

    HRESULT (STDMETHODCALLTYPE *AddComponent)(
        IVssCreateWriterMetadata *This,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszCaption,
        const BYTE *pbIcon,
        UINT cbIcon,
        boolean bRestoreMetadata,
        boolean bNotifyOnBackupComplete,
        boolean bSelectable,
        boolean bSelectableForRestore,
        DWORD dwComponentFlags);

    HRESULT (STDMETHODCALLTYPE *AddDatabaseFiles)(
        IVssCreateWriterMetadata *This,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszDatabaseName,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        DWORD dwBackupTypeMask);

    HRESULT (STDMETHODCALLTYPE *AddDatabaseLogFiles)(
        IVssCreateWriterMetadata *This,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszDatabaseName,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        DWORD dwBackupTypeMask);

    HRESULT (STDMETHODCALLTYPE *AddFilesToFileGroup)(
        IVssCreateWriterMetadata *This,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszGroupName,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        boolean bRecursive,
        LPCWSTR wszAlternateLocation,
        DWORD dwBackupTypeMask);

    HRESULT (STDMETHODCALLTYPE *SetRestoreMethod)(
        IVssCreateWriterMetadata *This,
        VSS_RESTOREMETHOD_ENUM method,
        LPCWSTR wszService,
        LPCWSTR wszUserProcedure,
        VSS_WRITERRESTORE_ENUM writerRestore,
        boolean bRebootRequired);

    HRESULT (STDMETHODCALLTYPE *AddAlternateLocationMapping)(
        IVssCreateWriterMetadata *This,
        LPCWSTR wszSourcePath,
        LPCWSTR wszSourceFilespec,
        boolean bRecursive,
        LPCWSTR wszDestination);

    HRESULT (STDMETHODCALLTYPE *AddComponentDependency)(
        IVssCreateWriterMetadata *This,
        LPCWSTR wszForLogicalPath,
        LPCWSTR wszForComponentName,
        VSS_ID onWriterId,
        LPCWSTR wszOnLogicalPath,
        LPCWSTR wszOnComponentName);

    HRESULT (STDMETHODCALLTYPE *SetBackupSchema)(
        IVssCreateWriterMetadata *This,
        DWORD dwSchemaMask);

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

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

    END_INTERFACE
} IVssCreateWriterMetadataVtbl;

interface IVssCreateWriterMetadata {
    CONST_VTBL IVssCreateWriterMetadataVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IVssCreateWriterMetadata methods ***/
#define IVssCreateWriterMetadata_AddIncludeFiles(This,wszPath,wszFilespec,bRecursive,wszAlternateLocation) (This)->lpVtbl->AddIncludeFiles(This,wszPath,wszFilespec,bRecursive,wszAlternateLocation)
#define IVssCreateWriterMetadata_AddExcludeFiles(This,wszPath,wszFilespec,bRecursive) (This)->lpVtbl->AddExcludeFiles(This,wszPath,wszFilespec,bRecursive)
#define IVssCreateWriterMetadata_AddComponent(This,ct,wszLogicalPath,wszComponentName,wszCaption,pbIcon,cbIcon,bRestoreMetadata,bNotifyOnBackupComplete,bSelectable,bSelectableForRestore,dwComponentFlags) (This)->lpVtbl->AddComponent(This,ct,wszLogicalPath,wszComponentName,wszCaption,pbIcon,cbIcon,bRestoreMetadata,bNotifyOnBackupComplete,bSelectable,bSelectableForRestore,dwComponentFlags)
#define IVssCreateWriterMetadata_AddDatabaseFiles(This,wszLogicalPath,wszDatabaseName,wszPath,wszFilespec,dwBackupTypeMask) (This)->lpVtbl->AddDatabaseFiles(This,wszLogicalPath,wszDatabaseName,wszPath,wszFilespec,dwBackupTypeMask)
#define IVssCreateWriterMetadata_AddDatabaseLogFiles(This,wszLogicalPath,wszDatabaseName,wszPath,wszFilespec,dwBackupTypeMask) (This)->lpVtbl->AddDatabaseLogFiles(This,wszLogicalPath,wszDatabaseName,wszPath,wszFilespec,dwBackupTypeMask)
#define IVssCreateWriterMetadata_AddFilesToFileGroup(This,wszLogicalPath,wszGroupName,wszPath,wszFilespec,bRecursive,wszAlternateLocation,dwBackupTypeMask) (This)->lpVtbl->AddFilesToFileGroup(This,wszLogicalPath,wszGroupName,wszPath,wszFilespec,bRecursive,wszAlternateLocation,dwBackupTypeMask)
#define IVssCreateWriterMetadata_SetRestoreMethod(This,method,wszService,wszUserProcedure,writerRestore,bRebootRequired) (This)->lpVtbl->SetRestoreMethod(This,method,wszService,wszUserProcedure,writerRestore,bRebootRequired)
#define IVssCreateWriterMetadata_AddAlternateLocationMapping(This,wszSourcePath,wszSourceFilespec,bRecursive,wszDestination) (This)->lpVtbl->AddAlternateLocationMapping(This,wszSourcePath,wszSourceFilespec,bRecursive,wszDestination)
#define IVssCreateWriterMetadata_AddComponentDependency(This,wszForLogicalPath,wszForComponentName,onWriterId,wszOnLogicalPath,wszOnComponentName) (This)->lpVtbl->AddComponentDependency(This,wszForLogicalPath,wszForComponentName,onWriterId,wszOnLogicalPath,wszOnComponentName)
#define IVssCreateWriterMetadata_SetBackupSchema(This,dwSchemaMask) (This)->lpVtbl->SetBackupSchema(This,dwSchemaMask)
#define IVssCreateWriterMetadata_GetDocument(This,pDoc) (This)->lpVtbl->GetDocument(This,pDoc)
#define IVssCreateWriterMetadata_SaveAsXML(This,pbstrXML) (This)->lpVtbl->SaveAsXML(This,pbstrXML)
#else
/*** IVssCreateWriterMetadata methods ***/
static __WIDL_INLINE HRESULT IVssCreateWriterMetadata_AddIncludeFiles(IVssCreateWriterMetadata* This,LPCWSTR wszPath,LPCWSTR wszFilespec,boolean bRecursive,LPCWSTR wszAlternateLocation) {
    return This->lpVtbl->AddIncludeFiles(This,wszPath,wszFilespec,bRecursive,wszAlternateLocation);
}
static __WIDL_INLINE HRESULT IVssCreateWriterMetadata_AddExcludeFiles(IVssCreateWriterMetadata* This,LPCWSTR wszPath,LPCWSTR wszFilespec,boolean bRecursive) {
    return This->lpVtbl->AddExcludeFiles(This,wszPath,wszFilespec,bRecursive);
}
static __WIDL_INLINE HRESULT IVssCreateWriterMetadata_AddComponent(IVssCreateWriterMetadata* This,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszCaption,const BYTE *pbIcon,UINT cbIcon,boolean bRestoreMetadata,boolean bNotifyOnBackupComplete,boolean bSelectable,boolean bSelectableForRestore,DWORD dwComponentFlags) {
    return This->lpVtbl->AddComponent(This,ct,wszLogicalPath,wszComponentName,wszCaption,pbIcon,cbIcon,bRestoreMetadata,bNotifyOnBackupComplete,bSelectable,bSelectableForRestore,dwComponentFlags);
}
static __WIDL_INLINE HRESULT IVssCreateWriterMetadata_AddDatabaseFiles(IVssCreateWriterMetadata* This,LPCWSTR wszLogicalPath,LPCWSTR wszDatabaseName,LPCWSTR wszPath,LPCWSTR wszFilespec,DWORD dwBackupTypeMask) {
    return This->lpVtbl->AddDatabaseFiles(This,wszLogicalPath,wszDatabaseName,wszPath,wszFilespec,dwBackupTypeMask);
}
static __WIDL_INLINE HRESULT IVssCreateWriterMetadata_AddDatabaseLogFiles(IVssCreateWriterMetadata* This,LPCWSTR wszLogicalPath,LPCWSTR wszDatabaseName,LPCWSTR wszPath,LPCWSTR wszFilespec,DWORD dwBackupTypeMask) {
    return This->lpVtbl->AddDatabaseLogFiles(This,wszLogicalPath,wszDatabaseName,wszPath,wszFilespec,dwBackupTypeMask);
}
static __WIDL_INLINE HRESULT IVssCreateWriterMetadata_AddFilesToFileGroup(IVssCreateWriterMetadata* This,LPCWSTR wszLogicalPath,LPCWSTR wszGroupName,LPCWSTR wszPath,LPCWSTR wszFilespec,boolean bRecursive,LPCWSTR wszAlternateLocation,DWORD dwBackupTypeMask) {
    return This->lpVtbl->AddFilesToFileGroup(This,wszLogicalPath,wszGroupName,wszPath,wszFilespec,bRecursive,wszAlternateLocation,dwBackupTypeMask);
}
static __WIDL_INLINE HRESULT IVssCreateWriterMetadata_SetRestoreMethod(IVssCreateWriterMetadata* This,VSS_RESTOREMETHOD_ENUM method,LPCWSTR wszService,LPCWSTR wszUserProcedure,VSS_WRITERRESTORE_ENUM writerRestore,boolean bRebootRequired) {
    return This->lpVtbl->SetRestoreMethod(This,method,wszService,wszUserProcedure,writerRestore,bRebootRequired);
}
static __WIDL_INLINE HRESULT IVssCreateWriterMetadata_AddAlternateLocationMapping(IVssCreateWriterMetadata* This,LPCWSTR wszSourcePath,LPCWSTR wszSourceFilespec,boolean bRecursive,LPCWSTR wszDestination) {
    return This->lpVtbl->AddAlternateLocationMapping(This,wszSourcePath,wszSourceFilespec,bRecursive,wszDestination);
}
static __WIDL_INLINE HRESULT IVssCreateWriterMetadata_AddComponentDependency(IVssCreateWriterMetadata* This,LPCWSTR wszForLogicalPath,LPCWSTR wszForComponentName,VSS_ID onWriterId,LPCWSTR wszOnLogicalPath,LPCWSTR wszOnComponentName) {
    return This->lpVtbl->AddComponentDependency(This,wszForLogicalPath,wszForComponentName,onWriterId,wszOnLogicalPath,wszOnComponentName);
}
static __WIDL_INLINE HRESULT IVssCreateWriterMetadata_SetBackupSchema(IVssCreateWriterMetadata* This,DWORD dwSchemaMask) {
    return This->lpVtbl->SetBackupSchema(This,dwSchemaMask);
}
static __WIDL_INLINE HRESULT IVssCreateWriterMetadata_GetDocument(IVssCreateWriterMetadata* This,IXMLDOMDocument **pDoc) {
    return This->lpVtbl->GetDocument(This,pDoc);
}
static __WIDL_INLINE HRESULT IVssCreateWriterMetadata_SaveAsXML(IVssCreateWriterMetadata* This,BSTR *pbstrXML) {
    return This->lpVtbl->SaveAsXML(This,pbstrXML);
}
#endif
#endif

#endif


#endif  /* __IVssCreateWriterMetadata_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssCreateWriterMetadataEx interface
 */
#ifndef __IVssCreateWriterMetadataEx_INTERFACE_DEFINED__
#define __IVssCreateWriterMetadataEx_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssCreateWriterMetadataEx, 0x9f21981d, 0xd469, 0x4349, 0xb8,0x07, 0x39,0xe6,0x4e,0x46,0x74,0xe1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9f21981d-d469-4349-b807-39e64e4674e1")
IVssCreateWriterMetadataEx : public IVssCreateWriterMetadata
{
    virtual HRESULT STDMETHODCALLTYPE AddExcludeFilesFromSnapshot(
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        boolean bRecursive) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssCreateWriterMetadataEx, 0x9f21981d, 0xd469, 0x4349, 0xb8,0x07, 0x39,0xe6,0x4e,0x46,0x74,0xe1)
#endif
#else
typedef struct IVssCreateWriterMetadataExVtbl {
    BEGIN_INTERFACE

    /*** IVssCreateWriterMetadata methods ***/
    HRESULT (STDMETHODCALLTYPE *AddIncludeFiles)(
        IVssCreateWriterMetadataEx *This,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        boolean bRecursive,
        LPCWSTR wszAlternateLocation);

    HRESULT (STDMETHODCALLTYPE *AddExcludeFiles)(
        IVssCreateWriterMetadataEx *This,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        boolean bRecursive);

    HRESULT (STDMETHODCALLTYPE *AddComponent)(
        IVssCreateWriterMetadataEx *This,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszCaption,
        const BYTE *pbIcon,
        UINT cbIcon,
        boolean bRestoreMetadata,
        boolean bNotifyOnBackupComplete,
        boolean bSelectable,
        boolean bSelectableForRestore,
        DWORD dwComponentFlags);

    HRESULT (STDMETHODCALLTYPE *AddDatabaseFiles)(
        IVssCreateWriterMetadataEx *This,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszDatabaseName,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        DWORD dwBackupTypeMask);

    HRESULT (STDMETHODCALLTYPE *AddDatabaseLogFiles)(
        IVssCreateWriterMetadataEx *This,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszDatabaseName,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        DWORD dwBackupTypeMask);

    HRESULT (STDMETHODCALLTYPE *AddFilesToFileGroup)(
        IVssCreateWriterMetadataEx *This,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszGroupName,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        boolean bRecursive,
        LPCWSTR wszAlternateLocation,
        DWORD dwBackupTypeMask);

    HRESULT (STDMETHODCALLTYPE *SetRestoreMethod)(
        IVssCreateWriterMetadataEx *This,
        VSS_RESTOREMETHOD_ENUM method,
        LPCWSTR wszService,
        LPCWSTR wszUserProcedure,
        VSS_WRITERRESTORE_ENUM writerRestore,
        boolean bRebootRequired);

    HRESULT (STDMETHODCALLTYPE *AddAlternateLocationMapping)(
        IVssCreateWriterMetadataEx *This,
        LPCWSTR wszSourcePath,
        LPCWSTR wszSourceFilespec,
        boolean bRecursive,
        LPCWSTR wszDestination);

    HRESULT (STDMETHODCALLTYPE *AddComponentDependency)(
        IVssCreateWriterMetadataEx *This,
        LPCWSTR wszForLogicalPath,
        LPCWSTR wszForComponentName,
        VSS_ID onWriterId,
        LPCWSTR wszOnLogicalPath,
        LPCWSTR wszOnComponentName);

    HRESULT (STDMETHODCALLTYPE *SetBackupSchema)(
        IVssCreateWriterMetadataEx *This,
        DWORD dwSchemaMask);

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

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

    /*** IVssCreateWriterMetadataEx methods ***/
    HRESULT (STDMETHODCALLTYPE *AddExcludeFilesFromSnapshot)(
        IVssCreateWriterMetadataEx *This,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        boolean bRecursive);

    END_INTERFACE
} IVssCreateWriterMetadataExVtbl;

interface IVssCreateWriterMetadataEx {
    CONST_VTBL IVssCreateWriterMetadataExVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IVssCreateWriterMetadata methods ***/
#define IVssCreateWriterMetadataEx_AddIncludeFiles(This,wszPath,wszFilespec,bRecursive,wszAlternateLocation) (This)->lpVtbl->AddIncludeFiles(This,wszPath,wszFilespec,bRecursive,wszAlternateLocation)
#define IVssCreateWriterMetadataEx_AddExcludeFiles(This,wszPath,wszFilespec,bRecursive) (This)->lpVtbl->AddExcludeFiles(This,wszPath,wszFilespec,bRecursive)
#define IVssCreateWriterMetadataEx_AddComponent(This,ct,wszLogicalPath,wszComponentName,wszCaption,pbIcon,cbIcon,bRestoreMetadata,bNotifyOnBackupComplete,bSelectable,bSelectableForRestore,dwComponentFlags) (This)->lpVtbl->AddComponent(This,ct,wszLogicalPath,wszComponentName,wszCaption,pbIcon,cbIcon,bRestoreMetadata,bNotifyOnBackupComplete,bSelectable,bSelectableForRestore,dwComponentFlags)
#define IVssCreateWriterMetadataEx_AddDatabaseFiles(This,wszLogicalPath,wszDatabaseName,wszPath,wszFilespec,dwBackupTypeMask) (This)->lpVtbl->AddDatabaseFiles(This,wszLogicalPath,wszDatabaseName,wszPath,wszFilespec,dwBackupTypeMask)
#define IVssCreateWriterMetadataEx_AddDatabaseLogFiles(This,wszLogicalPath,wszDatabaseName,wszPath,wszFilespec,dwBackupTypeMask) (This)->lpVtbl->AddDatabaseLogFiles(This,wszLogicalPath,wszDatabaseName,wszPath,wszFilespec,dwBackupTypeMask)
#define IVssCreateWriterMetadataEx_AddFilesToFileGroup(This,wszLogicalPath,wszGroupName,wszPath,wszFilespec,bRecursive,wszAlternateLocation,dwBackupTypeMask) (This)->lpVtbl->AddFilesToFileGroup(This,wszLogicalPath,wszGroupName,wszPath,wszFilespec,bRecursive,wszAlternateLocation,dwBackupTypeMask)
#define IVssCreateWriterMetadataEx_SetRestoreMethod(This,method,wszService,wszUserProcedure,writerRestore,bRebootRequired) (This)->lpVtbl->SetRestoreMethod(This,method,wszService,wszUserProcedure,writerRestore,bRebootRequired)
#define IVssCreateWriterMetadataEx_AddAlternateLocationMapping(This,wszSourcePath,wszSourceFilespec,bRecursive,wszDestination) (This)->lpVtbl->AddAlternateLocationMapping(This,wszSourcePath,wszSourceFilespec,bRecursive,wszDestination)
#define IVssCreateWriterMetadataEx_AddComponentDependency(This,wszForLogicalPath,wszForComponentName,onWriterId,wszOnLogicalPath,wszOnComponentName) (This)->lpVtbl->AddComponentDependency(This,wszForLogicalPath,wszForComponentName,onWriterId,wszOnLogicalPath,wszOnComponentName)
#define IVssCreateWriterMetadataEx_SetBackupSchema(This,dwSchemaMask) (This)->lpVtbl->SetBackupSchema(This,dwSchemaMask)
#define IVssCreateWriterMetadataEx_GetDocument(This,pDoc) (This)->lpVtbl->GetDocument(This,pDoc)
#define IVssCreateWriterMetadataEx_SaveAsXML(This,pbstrXML) (This)->lpVtbl->SaveAsXML(This,pbstrXML)
/*** IVssCreateWriterMetadataEx methods ***/
#define IVssCreateWriterMetadataEx_AddExcludeFilesFromSnapshot(This,wszPath,wszFilespec,bRecursive) (This)->lpVtbl->AddExcludeFilesFromSnapshot(This,wszPath,wszFilespec,bRecursive)
#else
/*** IVssCreateWriterMetadata methods ***/
static __WIDL_INLINE HRESULT IVssCreateWriterMetadataEx_AddIncludeFiles(IVssCreateWriterMetadataEx* This,LPCWSTR wszPath,LPCWSTR wszFilespec,boolean bRecursive,LPCWSTR wszAlternateLocation) {
    return This->lpVtbl->AddIncludeFiles(This,wszPath,wszFilespec,bRecursive,wszAlternateLocation);
}
static __WIDL_INLINE HRESULT IVssCreateWriterMetadataEx_AddExcludeFiles(IVssCreateWriterMetadataEx* This,LPCWSTR wszPath,LPCWSTR wszFilespec,boolean bRecursive) {
    return This->lpVtbl->AddExcludeFiles(This,wszPath,wszFilespec,bRecursive);
}
static __WIDL_INLINE HRESULT IVssCreateWriterMetadataEx_AddComponent(IVssCreateWriterMetadataEx* This,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszCaption,const BYTE *pbIcon,UINT cbIcon,boolean bRestoreMetadata,boolean bNotifyOnBackupComplete,boolean bSelectable,boolean bSelectableForRestore,DWORD dwComponentFlags) {
    return This->lpVtbl->AddComponent(This,ct,wszLogicalPath,wszComponentName,wszCaption,pbIcon,cbIcon,bRestoreMetadata,bNotifyOnBackupComplete,bSelectable,bSelectableForRestore,dwComponentFlags);
}
static __WIDL_INLINE HRESULT IVssCreateWriterMetadataEx_AddDatabaseFiles(IVssCreateWriterMetadataEx* This,LPCWSTR wszLogicalPath,LPCWSTR wszDatabaseName,LPCWSTR wszPath,LPCWSTR wszFilespec,DWORD dwBackupTypeMask) {
    return This->lpVtbl->AddDatabaseFiles(This,wszLogicalPath,wszDatabaseName,wszPath,wszFilespec,dwBackupTypeMask);
}
static __WIDL_INLINE HRESULT IVssCreateWriterMetadataEx_AddDatabaseLogFiles(IVssCreateWriterMetadataEx* This,LPCWSTR wszLogicalPath,LPCWSTR wszDatabaseName,LPCWSTR wszPath,LPCWSTR wszFilespec,DWORD dwBackupTypeMask) {
    return This->lpVtbl->AddDatabaseLogFiles(This,wszLogicalPath,wszDatabaseName,wszPath,wszFilespec,dwBackupTypeMask);
}
static __WIDL_INLINE HRESULT IVssCreateWriterMetadataEx_AddFilesToFileGroup(IVssCreateWriterMetadataEx* This,LPCWSTR wszLogicalPath,LPCWSTR wszGroupName,LPCWSTR wszPath,LPCWSTR wszFilespec,boolean bRecursive,LPCWSTR wszAlternateLocation,DWORD dwBackupTypeMask) {
    return This->lpVtbl->AddFilesToFileGroup(This,wszLogicalPath,wszGroupName,wszPath,wszFilespec,bRecursive,wszAlternateLocation,dwBackupTypeMask);
}
static __WIDL_INLINE HRESULT IVssCreateWriterMetadataEx_SetRestoreMethod(IVssCreateWriterMetadataEx* This,VSS_RESTOREMETHOD_ENUM method,LPCWSTR wszService,LPCWSTR wszUserProcedure,VSS_WRITERRESTORE_ENUM writerRestore,boolean bRebootRequired) {
    return This->lpVtbl->SetRestoreMethod(This,method,wszService,wszUserProcedure,writerRestore,bRebootRequired);
}
static __WIDL_INLINE HRESULT IVssCreateWriterMetadataEx_AddAlternateLocationMapping(IVssCreateWriterMetadataEx* This,LPCWSTR wszSourcePath,LPCWSTR wszSourceFilespec,boolean bRecursive,LPCWSTR wszDestination) {
    return This->lpVtbl->AddAlternateLocationMapping(This,wszSourcePath,wszSourceFilespec,bRecursive,wszDestination);
}
static __WIDL_INLINE HRESULT IVssCreateWriterMetadataEx_AddComponentDependency(IVssCreateWriterMetadataEx* This,LPCWSTR wszForLogicalPath,LPCWSTR wszForComponentName,VSS_ID onWriterId,LPCWSTR wszOnLogicalPath,LPCWSTR wszOnComponentName) {
    return This->lpVtbl->AddComponentDependency(This,wszForLogicalPath,wszForComponentName,onWriterId,wszOnLogicalPath,wszOnComponentName);
}
static __WIDL_INLINE HRESULT IVssCreateWriterMetadataEx_SetBackupSchema(IVssCreateWriterMetadataEx* This,DWORD dwSchemaMask) {
    return This->lpVtbl->SetBackupSchema(This,dwSchemaMask);
}
static __WIDL_INLINE HRESULT IVssCreateWriterMetadataEx_GetDocument(IVssCreateWriterMetadataEx* This,IXMLDOMDocument **pDoc) {
    return This->lpVtbl->GetDocument(This,pDoc);
}
static __WIDL_INLINE HRESULT IVssCreateWriterMetadataEx_SaveAsXML(IVssCreateWriterMetadataEx* This,BSTR *pbstrXML) {
    return This->lpVtbl->SaveAsXML(This,pbstrXML);
}
/*** IVssCreateWriterMetadataEx methods ***/
static __WIDL_INLINE HRESULT IVssCreateWriterMetadataEx_AddExcludeFilesFromSnapshot(IVssCreateWriterMetadataEx* This,LPCWSTR wszPath,LPCWSTR wszFilespec,boolean bRecursive) {
    return This->lpVtbl->AddExcludeFilesFromSnapshot(This,wszPath,wszFilespec,bRecursive);
}
#endif
#endif

#endif


#endif  /* __IVssCreateWriterMetadataEx_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssWriterImpl interface
 */
#ifndef __IVssWriterImpl_INTERFACE_DEFINED__
#define __IVssWriterImpl_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssWriterImpl, 0x00000000, 0x0000, 0x0000, 0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00000000-0000-0000-0000-000000000000")
IVssWriterImpl : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        VSS_ID writerId,
        LPCWSTR wszWriterName,
        LPCWSTR wszWriterInstanceName,
        DWORD dwMajorVersion,
        DWORD dwMinorVersion,
        VSS_USAGE_TYPE ut,
        VSS_SOURCE_TYPE st,
        VSS_APPLICATION_LEVEL nLevel,
        DWORD dwTimeout,
        VSS_ALTERNATE_WRITER_STATE aws,
        boolean bIOThrottlingOnly) = 0;

    virtual HRESULT STDMETHODCALLTYPE Subscribe(
        DWORD dwSubscribeTimeout,
        DWORD dwEventFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE Unsubscribe(
        ) = 0;

    virtual void STDMETHODCALLTYPE Uninitialize(
        ) = 0;

    virtual LPCWSTR * STDMETHODCALLTYPE GetCurrentVolumeArray(
        ) = 0;

    virtual UINT STDMETHODCALLTYPE GetCurrentVolumeCount(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSnapshotDeviceName(
        LPCWSTR wszOriginalVolume,
        LPCWSTR *ppwszSnapshotDevice) = 0;

#ifdef WIDL_EXPLICIT_AGGREGATE_RETURNS
    virtual VSS_ID* STDMETHODCALLTYPE GetCurrentSnapshotSetId(
        VSS_ID *__ret) = 0;
    VSS_ID STDMETHODCALLTYPE GetCurrentSnapshotSetId(
        )
    {
        VSS_ID __ret;
        return *GetCurrentSnapshotSetId(&__ret);
    }
#else
    virtual VSS_ID STDMETHODCALLTYPE GetCurrentSnapshotSetId(
        ) = 0;
#endif

    virtual LONG STDMETHODCALLTYPE GetContext(
        ) = 0;

    virtual VSS_APPLICATION_LEVEL STDMETHODCALLTYPE GetCurrentLevel(
        ) = 0;

    virtual boolean STDMETHODCALLTYPE IsPathAffected(
        LPCWSTR wszPath) = 0;

    virtual boolean STDMETHODCALLTYPE IsBootableSystemStateBackedUp(
        ) = 0;

    virtual boolean STDMETHODCALLTYPE AreComponentsSelected(
        ) = 0;

    virtual VSS_BACKUP_TYPE STDMETHODCALLTYPE GetBackupType(
        ) = 0;

    virtual VSS_RESTORE_TYPE STDMETHODCALLTYPE GetRestoreType(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetWriterFailure(
        HRESULT hr) = 0;

    virtual boolean STDMETHODCALLTYPE IsPartialFileSupportEnabled(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE InstallAlternateWriter(
        VSS_ID idWriter,
        CLSID clsid) = 0;

    virtual IVssExamineWriterMetadata * STDMETHODCALLTYPE GetIdentityInformation(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetWriterFailureEx(
        HRESULT hr,
        HRESULT hrApplication,
        LPCWSTR wszApplicationMessage) = 0;

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

    virtual boolean STDMETHODCALLTYPE IsWriterShuttingDown(
        ) = 0;

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

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

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

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

    /*** IVssWriterImpl methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IVssWriterImpl *This,
        VSS_ID writerId,
        LPCWSTR wszWriterName,
        LPCWSTR wszWriterInstanceName,
        DWORD dwMajorVersion,
        DWORD dwMinorVersion,
        VSS_USAGE_TYPE ut,
        VSS_SOURCE_TYPE st,
        VSS_APPLICATION_LEVEL nLevel,
        DWORD dwTimeout,
        VSS_ALTERNATE_WRITER_STATE aws,
        boolean bIOThrottlingOnly);

    HRESULT (STDMETHODCALLTYPE *Subscribe)(
        IVssWriterImpl *This,
        DWORD dwSubscribeTimeout,
        DWORD dwEventFlags);

    HRESULT (STDMETHODCALLTYPE *Unsubscribe)(
        IVssWriterImpl *This);

    void (STDMETHODCALLTYPE *Uninitialize)(
        IVssWriterImpl *This);

    LPCWSTR * (STDMETHODCALLTYPE *GetCurrentVolumeArray)(
        IVssWriterImpl *This);

    UINT (STDMETHODCALLTYPE *GetCurrentVolumeCount)(
        IVssWriterImpl *This);

    HRESULT (STDMETHODCALLTYPE *GetSnapshotDeviceName)(
        IVssWriterImpl *This,
        LPCWSTR wszOriginalVolume,
        LPCWSTR *ppwszSnapshotDevice);

    VSS_ID * (STDMETHODCALLTYPE *GetCurrentSnapshotSetId)(
        IVssWriterImpl *This,
        VSS_ID *__ret);

    LONG (STDMETHODCALLTYPE *GetContext)(
        IVssWriterImpl *This);

    VSS_APPLICATION_LEVEL (STDMETHODCALLTYPE *GetCurrentLevel)(
        IVssWriterImpl *This);

    boolean (STDMETHODCALLTYPE *IsPathAffected)(
        IVssWriterImpl *This,
        LPCWSTR wszPath);

    boolean (STDMETHODCALLTYPE *IsBootableSystemStateBackedUp)(
        IVssWriterImpl *This);

    boolean (STDMETHODCALLTYPE *AreComponentsSelected)(
        IVssWriterImpl *This);

    VSS_BACKUP_TYPE (STDMETHODCALLTYPE *GetBackupType)(
        IVssWriterImpl *This);

    VSS_RESTORE_TYPE (STDMETHODCALLTYPE *GetRestoreType)(
        IVssWriterImpl *This);

    HRESULT (STDMETHODCALLTYPE *SetWriterFailure)(
        IVssWriterImpl *This,
        HRESULT hr);

    boolean (STDMETHODCALLTYPE *IsPartialFileSupportEnabled)(
        IVssWriterImpl *This);

    HRESULT (STDMETHODCALLTYPE *InstallAlternateWriter)(
        IVssWriterImpl *This,
        VSS_ID idWriter,
        CLSID clsid);

    IVssExamineWriterMetadata * (STDMETHODCALLTYPE *GetIdentityInformation)(
        IVssWriterImpl *This);

    HRESULT (STDMETHODCALLTYPE *SetWriterFailureEx)(
        IVssWriterImpl *This,
        HRESULT hr,
        HRESULT hrApplication,
        LPCWSTR wszApplicationMessage);

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

    boolean (STDMETHODCALLTYPE *IsWriterShuttingDown)(
        IVssWriterImpl *This);

    END_INTERFACE
} IVssWriterImplVtbl;

interface IVssWriterImpl {
    CONST_VTBL IVssWriterImplVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssWriterImpl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssWriterImpl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssWriterImpl_Release(This) (This)->lpVtbl->Release(This)
/*** IVssWriterImpl methods ***/
#define IVssWriterImpl_Initialize(This,writerId,wszWriterName,wszWriterInstanceName,dwMajorVersion,dwMinorVersion,ut,st,nLevel,dwTimeout,aws,bIOThrottlingOnly) (This)->lpVtbl->Initialize(This,writerId,wszWriterName,wszWriterInstanceName,dwMajorVersion,dwMinorVersion,ut,st,nLevel,dwTimeout,aws,bIOThrottlingOnly)
#define IVssWriterImpl_Subscribe(This,dwSubscribeTimeout,dwEventFlags) (This)->lpVtbl->Subscribe(This,dwSubscribeTimeout,dwEventFlags)
#define IVssWriterImpl_Unsubscribe(This) (This)->lpVtbl->Unsubscribe(This)
#define IVssWriterImpl_Uninitialize(This) (This)->lpVtbl->Uninitialize(This)
#define IVssWriterImpl_GetCurrentVolumeArray(This) (This)->lpVtbl->GetCurrentVolumeArray(This)
#define IVssWriterImpl_GetCurrentVolumeCount(This) (This)->lpVtbl->GetCurrentVolumeCount(This)
#define IVssWriterImpl_GetSnapshotDeviceName(This,wszOriginalVolume,ppwszSnapshotDevice) (This)->lpVtbl->GetSnapshotDeviceName(This,wszOriginalVolume,ppwszSnapshotDevice)
#define IVssWriterImpl_GetCurrentSnapshotSetId(This) IVssWriterImpl_GetCurrentSnapshotSetId_define_WIDL_C_INLINE_WRAPPERS_for_aggregate_return_support
#define IVssWriterImpl_GetContext(This) (This)->lpVtbl->GetContext(This)
#define IVssWriterImpl_GetCurrentLevel(This) (This)->lpVtbl->GetCurrentLevel(This)
#define IVssWriterImpl_IsPathAffected(This,wszPath) (This)->lpVtbl->IsPathAffected(This,wszPath)
#define IVssWriterImpl_IsBootableSystemStateBackedUp(This) (This)->lpVtbl->IsBootableSystemStateBackedUp(This)
#define IVssWriterImpl_AreComponentsSelected(This) (This)->lpVtbl->AreComponentsSelected(This)
#define IVssWriterImpl_GetBackupType(This) (This)->lpVtbl->GetBackupType(This)
#define IVssWriterImpl_GetRestoreType(This) (This)->lpVtbl->GetRestoreType(This)
#define IVssWriterImpl_SetWriterFailure(This,hr) (This)->lpVtbl->SetWriterFailure(This,hr)
#define IVssWriterImpl_IsPartialFileSupportEnabled(This) (This)->lpVtbl->IsPartialFileSupportEnabled(This)
#define IVssWriterImpl_InstallAlternateWriter(This,idWriter,clsid) (This)->lpVtbl->InstallAlternateWriter(This,idWriter,clsid)
#define IVssWriterImpl_GetIdentityInformation(This) (This)->lpVtbl->GetIdentityInformation(This)
#define IVssWriterImpl_SetWriterFailureEx(This,hr,hrApplication,wszApplicationMessage) (This)->lpVtbl->SetWriterFailureEx(This,hr,hrApplication,wszApplicationMessage)
#define IVssWriterImpl_GetSessionId(This,idSession) (This)->lpVtbl->GetSessionId(This,idSession)
#define IVssWriterImpl_IsWriterShuttingDown(This) (This)->lpVtbl->IsWriterShuttingDown(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVssWriterImpl_QueryInterface(IVssWriterImpl* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVssWriterImpl_AddRef(IVssWriterImpl* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVssWriterImpl_Release(IVssWriterImpl* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssWriterImpl methods ***/
static __WIDL_INLINE HRESULT IVssWriterImpl_Initialize(IVssWriterImpl* This,VSS_ID writerId,LPCWSTR wszWriterName,LPCWSTR wszWriterInstanceName,DWORD dwMajorVersion,DWORD dwMinorVersion,VSS_USAGE_TYPE ut,VSS_SOURCE_TYPE st,VSS_APPLICATION_LEVEL nLevel,DWORD dwTimeout,VSS_ALTERNATE_WRITER_STATE aws,boolean bIOThrottlingOnly) {
    return This->lpVtbl->Initialize(This,writerId,wszWriterName,wszWriterInstanceName,dwMajorVersion,dwMinorVersion,ut,st,nLevel,dwTimeout,aws,bIOThrottlingOnly);
}
static __WIDL_INLINE HRESULT IVssWriterImpl_Subscribe(IVssWriterImpl* This,DWORD dwSubscribeTimeout,DWORD dwEventFlags) {
    return This->lpVtbl->Subscribe(This,dwSubscribeTimeout,dwEventFlags);
}
static __WIDL_INLINE HRESULT IVssWriterImpl_Unsubscribe(IVssWriterImpl* This) {
    return This->lpVtbl->Unsubscribe(This);
}
static __WIDL_INLINE void IVssWriterImpl_Uninitialize(IVssWriterImpl* This) {
    This->lpVtbl->Uninitialize(This);
}
static __WIDL_INLINE LPCWSTR * IVssWriterImpl_GetCurrentVolumeArray(IVssWriterImpl* This) {
    return This->lpVtbl->GetCurrentVolumeArray(This);
}
static __WIDL_INLINE UINT IVssWriterImpl_GetCurrentVolumeCount(IVssWriterImpl* This) {
    return This->lpVtbl->GetCurrentVolumeCount(This);
}
static __WIDL_INLINE HRESULT IVssWriterImpl_GetSnapshotDeviceName(IVssWriterImpl* This,LPCWSTR wszOriginalVolume,LPCWSTR *ppwszSnapshotDevice) {
    return This->lpVtbl->GetSnapshotDeviceName(This,wszOriginalVolume,ppwszSnapshotDevice);
}
static __WIDL_INLINE VSS_ID IVssWriterImpl_GetCurrentSnapshotSetId(IVssWriterImpl* This) {
    VSS_ID __ret;
    return *This->lpVtbl->GetCurrentSnapshotSetId(This,&__ret);
}
static __WIDL_INLINE LONG IVssWriterImpl_GetContext(IVssWriterImpl* This) {
    return This->lpVtbl->GetContext(This);
}
static __WIDL_INLINE VSS_APPLICATION_LEVEL IVssWriterImpl_GetCurrentLevel(IVssWriterImpl* This) {
    return This->lpVtbl->GetCurrentLevel(This);
}
static __WIDL_INLINE boolean IVssWriterImpl_IsPathAffected(IVssWriterImpl* This,LPCWSTR wszPath) {
    return This->lpVtbl->IsPathAffected(This,wszPath);
}
static __WIDL_INLINE boolean IVssWriterImpl_IsBootableSystemStateBackedUp(IVssWriterImpl* This) {
    return This->lpVtbl->IsBootableSystemStateBackedUp(This);
}
static __WIDL_INLINE boolean IVssWriterImpl_AreComponentsSelected(IVssWriterImpl* This) {
    return This->lpVtbl->AreComponentsSelected(This);
}
static __WIDL_INLINE VSS_BACKUP_TYPE IVssWriterImpl_GetBackupType(IVssWriterImpl* This) {
    return This->lpVtbl->GetBackupType(This);
}
static __WIDL_INLINE VSS_RESTORE_TYPE IVssWriterImpl_GetRestoreType(IVssWriterImpl* This) {
    return This->lpVtbl->GetRestoreType(This);
}
static __WIDL_INLINE HRESULT IVssWriterImpl_SetWriterFailure(IVssWriterImpl* This,HRESULT hr) {
    return This->lpVtbl->SetWriterFailure(This,hr);
}
static __WIDL_INLINE boolean IVssWriterImpl_IsPartialFileSupportEnabled(IVssWriterImpl* This) {
    return This->lpVtbl->IsPartialFileSupportEnabled(This);
}
static __WIDL_INLINE HRESULT IVssWriterImpl_InstallAlternateWriter(IVssWriterImpl* This,VSS_ID idWriter,CLSID clsid) {
    return This->lpVtbl->InstallAlternateWriter(This,idWriter,clsid);
}
static __WIDL_INLINE IVssExamineWriterMetadata * IVssWriterImpl_GetIdentityInformation(IVssWriterImpl* This) {
    return This->lpVtbl->GetIdentityInformation(This);
}
static __WIDL_INLINE HRESULT IVssWriterImpl_SetWriterFailureEx(IVssWriterImpl* This,HRESULT hr,HRESULT hrApplication,LPCWSTR wszApplicationMessage) {
    return This->lpVtbl->SetWriterFailureEx(This,hr,hrApplication,wszApplicationMessage);
}
static __WIDL_INLINE HRESULT IVssWriterImpl_GetSessionId(IVssWriterImpl* This,VSS_ID *idSession) {
    return This->lpVtbl->GetSessionId(This,idSession);
}
static __WIDL_INLINE boolean IVssWriterImpl_IsWriterShuttingDown(IVssWriterImpl* This) {
    return This->lpVtbl->IsWriterShuttingDown(This);
}
#endif
#endif

#endif


#endif  /* __IVssWriterImpl_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssCreateExpressWriterMetadata interface
 */
#ifndef __IVssCreateExpressWriterMetadata_INTERFACE_DEFINED__
#define __IVssCreateExpressWriterMetadata_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssCreateExpressWriterMetadata, 0x9c772e77, 0xb26e, 0x427f, 0x92,0xdd, 0xc9,0x96,0xf4,0x1e,0xa5,0xe3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9c772e77-b26e-427f-92dd-c996f41ea5e3")
IVssCreateExpressWriterMetadata : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AddExcludeFiles(
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        boolean bRecursive) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddComponent(
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszCaption,
        const BYTE *pbIcon,
        UINT cbIcon,
        boolean bRestoreMetadata,
        boolean bNotifyOnBackupComplete,
        boolean bSelectable,
        boolean bSelectableForRestore = 0,
        DWORD dwComponentFlags = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddFilesToFileGroup(
        LPCWSTR wszLogicalPath,
        LPCWSTR wszGroupName,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        boolean bRecursive,
        LPCWSTR wszAlternateLocation,
        DWORD dwBackupTypeMask = VSS_FSBT_ALL_BACKUP_REQUIRED | VSS_FSBT_ALL_SNAPSHOT_REQUIRED) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRestoreMethod(
        VSS_RESTOREMETHOD_ENUM method,
        LPCWSTR wszService,
        LPCWSTR wszUserProcedure,
        VSS_WRITERRESTORE_ENUM writerRestore,
        boolean bRebootRequired) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddComponentDependency(
        LPCWSTR wszForLogicalPath,
        LPCWSTR wszForComponentName,
        VSS_ID onWriterId,
        LPCWSTR wszOnLogicalPath,
        LPCWSTR wszOnComponentName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBackupSchema(
        DWORD dwSchemaMask) = 0;

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

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssCreateExpressWriterMetadata, 0x9c772e77, 0xb26e, 0x427f, 0x92,0xdd, 0xc9,0x96,0xf4,0x1e,0xa5,0xe3)
#endif
#else
typedef struct IVssCreateExpressWriterMetadataVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVssCreateExpressWriterMetadata methods ***/
    HRESULT (STDMETHODCALLTYPE *AddExcludeFiles)(
        IVssCreateExpressWriterMetadata *This,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        boolean bRecursive);

    HRESULT (STDMETHODCALLTYPE *AddComponent)(
        IVssCreateExpressWriterMetadata *This,
        VSS_COMPONENT_TYPE ct,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszComponentName,
        LPCWSTR wszCaption,
        const BYTE *pbIcon,
        UINT cbIcon,
        boolean bRestoreMetadata,
        boolean bNotifyOnBackupComplete,
        boolean bSelectable,
        boolean bSelectableForRestore,
        DWORD dwComponentFlags);

    HRESULT (STDMETHODCALLTYPE *AddFilesToFileGroup)(
        IVssCreateExpressWriterMetadata *This,
        LPCWSTR wszLogicalPath,
        LPCWSTR wszGroupName,
        LPCWSTR wszPath,
        LPCWSTR wszFilespec,
        boolean bRecursive,
        LPCWSTR wszAlternateLocation,
        DWORD dwBackupTypeMask);

    HRESULT (STDMETHODCALLTYPE *SetRestoreMethod)(
        IVssCreateExpressWriterMetadata *This,
        VSS_RESTOREMETHOD_ENUM method,
        LPCWSTR wszService,
        LPCWSTR wszUserProcedure,
        VSS_WRITERRESTORE_ENUM writerRestore,
        boolean bRebootRequired);

    HRESULT (STDMETHODCALLTYPE *AddComponentDependency)(
        IVssCreateExpressWriterMetadata *This,
        LPCWSTR wszForLogicalPath,
        LPCWSTR wszForComponentName,
        VSS_ID onWriterId,
        LPCWSTR wszOnLogicalPath,
        LPCWSTR wszOnComponentName);

    HRESULT (STDMETHODCALLTYPE *SetBackupSchema)(
        IVssCreateExpressWriterMetadata *This,
        DWORD dwSchemaMask);

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

    END_INTERFACE
} IVssCreateExpressWriterMetadataVtbl;

interface IVssCreateExpressWriterMetadata {
    CONST_VTBL IVssCreateExpressWriterMetadataVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssCreateExpressWriterMetadata_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssCreateExpressWriterMetadata_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssCreateExpressWriterMetadata_Release(This) (This)->lpVtbl->Release(This)
/*** IVssCreateExpressWriterMetadata methods ***/
#define IVssCreateExpressWriterMetadata_AddExcludeFiles(This,wszPath,wszFilespec,bRecursive) (This)->lpVtbl->AddExcludeFiles(This,wszPath,wszFilespec,bRecursive)
#define IVssCreateExpressWriterMetadata_AddComponent(This,ct,wszLogicalPath,wszComponentName,wszCaption,pbIcon,cbIcon,bRestoreMetadata,bNotifyOnBackupComplete,bSelectable,bSelectableForRestore,dwComponentFlags) (This)->lpVtbl->AddComponent(This,ct,wszLogicalPath,wszComponentName,wszCaption,pbIcon,cbIcon,bRestoreMetadata,bNotifyOnBackupComplete,bSelectable,bSelectableForRestore,dwComponentFlags)
#define IVssCreateExpressWriterMetadata_AddFilesToFileGroup(This,wszLogicalPath,wszGroupName,wszPath,wszFilespec,bRecursive,wszAlternateLocation,dwBackupTypeMask) (This)->lpVtbl->AddFilesToFileGroup(This,wszLogicalPath,wszGroupName,wszPath,wszFilespec,bRecursive,wszAlternateLocation,dwBackupTypeMask)
#define IVssCreateExpressWriterMetadata_SetRestoreMethod(This,method,wszService,wszUserProcedure,writerRestore,bRebootRequired) (This)->lpVtbl->SetRestoreMethod(This,method,wszService,wszUserProcedure,writerRestore,bRebootRequired)
#define IVssCreateExpressWriterMetadata_AddComponentDependency(This,wszForLogicalPath,wszForComponentName,onWriterId,wszOnLogicalPath,wszOnComponentName) (This)->lpVtbl->AddComponentDependency(This,wszForLogicalPath,wszForComponentName,onWriterId,wszOnLogicalPath,wszOnComponentName)
#define IVssCreateExpressWriterMetadata_SetBackupSchema(This,dwSchemaMask) (This)->lpVtbl->SetBackupSchema(This,dwSchemaMask)
#define IVssCreateExpressWriterMetadata_SaveAsXML(This,pbstrXML) (This)->lpVtbl->SaveAsXML(This,pbstrXML)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVssCreateExpressWriterMetadata_QueryInterface(IVssCreateExpressWriterMetadata* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVssCreateExpressWriterMetadata_AddRef(IVssCreateExpressWriterMetadata* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVssCreateExpressWriterMetadata_Release(IVssCreateExpressWriterMetadata* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssCreateExpressWriterMetadata methods ***/
static __WIDL_INLINE HRESULT IVssCreateExpressWriterMetadata_AddExcludeFiles(IVssCreateExpressWriterMetadata* This,LPCWSTR wszPath,LPCWSTR wszFilespec,boolean bRecursive) {
    return This->lpVtbl->AddExcludeFiles(This,wszPath,wszFilespec,bRecursive);
}
static __WIDL_INLINE HRESULT IVssCreateExpressWriterMetadata_AddComponent(IVssCreateExpressWriterMetadata* This,VSS_COMPONENT_TYPE ct,LPCWSTR wszLogicalPath,LPCWSTR wszComponentName,LPCWSTR wszCaption,const BYTE *pbIcon,UINT cbIcon,boolean bRestoreMetadata,boolean bNotifyOnBackupComplete,boolean bSelectable,boolean bSelectableForRestore,DWORD dwComponentFlags) {
    return This->lpVtbl->AddComponent(This,ct,wszLogicalPath,wszComponentName,wszCaption,pbIcon,cbIcon,bRestoreMetadata,bNotifyOnBackupComplete,bSelectable,bSelectableForRestore,dwComponentFlags);
}
static __WIDL_INLINE HRESULT IVssCreateExpressWriterMetadata_AddFilesToFileGroup(IVssCreateExpressWriterMetadata* This,LPCWSTR wszLogicalPath,LPCWSTR wszGroupName,LPCWSTR wszPath,LPCWSTR wszFilespec,boolean bRecursive,LPCWSTR wszAlternateLocation,DWORD dwBackupTypeMask) {
    return This->lpVtbl->AddFilesToFileGroup(This,wszLogicalPath,wszGroupName,wszPath,wszFilespec,bRecursive,wszAlternateLocation,dwBackupTypeMask);
}
static __WIDL_INLINE HRESULT IVssCreateExpressWriterMetadata_SetRestoreMethod(IVssCreateExpressWriterMetadata* This,VSS_RESTOREMETHOD_ENUM method,LPCWSTR wszService,LPCWSTR wszUserProcedure,VSS_WRITERRESTORE_ENUM writerRestore,boolean bRebootRequired) {
    return This->lpVtbl->SetRestoreMethod(This,method,wszService,wszUserProcedure,writerRestore,bRebootRequired);
}
static __WIDL_INLINE HRESULT IVssCreateExpressWriterMetadata_AddComponentDependency(IVssCreateExpressWriterMetadata* This,LPCWSTR wszForLogicalPath,LPCWSTR wszForComponentName,VSS_ID onWriterId,LPCWSTR wszOnLogicalPath,LPCWSTR wszOnComponentName) {
    return This->lpVtbl->AddComponentDependency(This,wszForLogicalPath,wszForComponentName,onWriterId,wszOnLogicalPath,wszOnComponentName);
}
static __WIDL_INLINE HRESULT IVssCreateExpressWriterMetadata_SetBackupSchema(IVssCreateExpressWriterMetadata* This,DWORD dwSchemaMask) {
    return This->lpVtbl->SetBackupSchema(This,dwSchemaMask);
}
static __WIDL_INLINE HRESULT IVssCreateExpressWriterMetadata_SaveAsXML(IVssCreateExpressWriterMetadata* This,BSTR *pbstrXML) {
    return This->lpVtbl->SaveAsXML(This,pbstrXML);
}
#endif
#endif

#endif


#endif  /* __IVssCreateExpressWriterMetadata_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVssExpressWriter interface
 */
#ifndef __IVssExpressWriter_INTERFACE_DEFINED__
#define __IVssExpressWriter_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVssExpressWriter, 0xe33affdc, 0x59c7, 0x47b1, 0x97,0xd5, 0x42,0x66,0x59,0x8f,0x62,0x35);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e33affdc-59c7-47b1-97d5-4266598f6235")
IVssExpressWriter : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateMetadata(
        VSS_ID writerId,
        LPCWSTR writerName,
        VSS_USAGE_TYPE usageType,
        DWORD versionMajor,
        DWORD versionMinor,
        DWORD reserved,
        IVssCreateExpressWriterMetadata **ppMetadata) = 0;

    virtual HRESULT STDMETHODCALLTYPE LoadMetadata(
        LPCWSTR metadata,
        DWORD reserved) = 0;

    virtual HRESULT STDMETHODCALLTYPE Register(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Unregister(
        VSS_ID writerId) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVssExpressWriter, 0xe33affdc, 0x59c7, 0x47b1, 0x97,0xd5, 0x42,0x66,0x59,0x8f,0x62,0x35)
#endif
#else
typedef struct IVssExpressWriterVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVssExpressWriter methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateMetadata)(
        IVssExpressWriter *This,
        VSS_ID writerId,
        LPCWSTR writerName,
        VSS_USAGE_TYPE usageType,
        DWORD versionMajor,
        DWORD versionMinor,
        DWORD reserved,
        IVssCreateExpressWriterMetadata **ppMetadata);

    HRESULT (STDMETHODCALLTYPE *LoadMetadata)(
        IVssExpressWriter *This,
        LPCWSTR metadata,
        DWORD reserved);

    HRESULT (STDMETHODCALLTYPE *Register)(
        IVssExpressWriter *This);

    HRESULT (STDMETHODCALLTYPE *Unregister)(
        IVssExpressWriter *This,
        VSS_ID writerId);

    END_INTERFACE
} IVssExpressWriterVtbl;

interface IVssExpressWriter {
    CONST_VTBL IVssExpressWriterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVssExpressWriter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVssExpressWriter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVssExpressWriter_Release(This) (This)->lpVtbl->Release(This)
/*** IVssExpressWriter methods ***/
#define IVssExpressWriter_CreateMetadata(This,writerId,writerName,usageType,versionMajor,versionMinor,reserved,ppMetadata) (This)->lpVtbl->CreateMetadata(This,writerId,writerName,usageType,versionMajor,versionMinor,reserved,ppMetadata)
#define IVssExpressWriter_LoadMetadata(This,metadata,reserved) (This)->lpVtbl->LoadMetadata(This,metadata,reserved)
#define IVssExpressWriter_Register(This) (This)->lpVtbl->Register(This)
#define IVssExpressWriter_Unregister(This,writerId) (This)->lpVtbl->Unregister(This,writerId)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVssExpressWriter_QueryInterface(IVssExpressWriter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVssExpressWriter_AddRef(IVssExpressWriter* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVssExpressWriter_Release(IVssExpressWriter* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssExpressWriter methods ***/
static __WIDL_INLINE HRESULT IVssExpressWriter_CreateMetadata(IVssExpressWriter* This,VSS_ID writerId,LPCWSTR writerName,VSS_USAGE_TYPE usageType,DWORD versionMajor,DWORD versionMinor,DWORD reserved,IVssCreateExpressWriterMetadata **ppMetadata) {
    return This->lpVtbl->CreateMetadata(This,writerId,writerName,usageType,versionMajor,versionMinor,reserved,ppMetadata);
}
static __WIDL_INLINE HRESULT IVssExpressWriter_LoadMetadata(IVssExpressWriter* This,LPCWSTR metadata,DWORD reserved) {
    return This->lpVtbl->LoadMetadata(This,metadata,reserved);
}
static __WIDL_INLINE HRESULT IVssExpressWriter_Register(IVssExpressWriter* This) {
    return This->lpVtbl->Register(This);
}
static __WIDL_INLINE HRESULT IVssExpressWriter_Unregister(IVssExpressWriter* This,VSS_ID writerId) {
    return This->lpVtbl->Unregister(This,writerId);
}
#endif
#endif

#endif


#endif  /* __IVssExpressWriter_INTERFACE_DEFINED__ */

#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 /* __vswriter_h__ */
