/*** Autogenerated by WIDL 8.5 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__ */
