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

/* 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 FORCEINLINE HRESULT IVssWMFiledesc_QueryInterface(IVssWMFiledesc* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IVssWMFiledesc_AddRef(IVssWMFiledesc* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IVssWMFiledesc_Release(IVssWMFiledesc* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssWMFiledesc methods ***/
static FORCEINLINE HRESULT IVssWMFiledesc_GetPath(IVssWMFiledesc* This,BSTR *pbstrPath) {
    return This->lpVtbl->GetPath(This,pbstrPath);
}
static FORCEINLINE HRESULT IVssWMFiledesc_GetFilespec(IVssWMFiledesc* This,BSTR *pbstrFilespec) {
    return This->lpVtbl->GetFilespec(This,pbstrFilespec);
}
static FORCEINLINE HRESULT IVssWMFiledesc_GetRecursive(IVssWMFiledesc* This,boolean *pbRecursive) {
    return This->lpVtbl->GetRecursive(This,pbRecursive);
}
static FORCEINLINE HRESULT IVssWMFiledesc_GetAlternateLocation(IVssWMFiledesc* This,BSTR *pbstrAlternateLocation) {
    return This->lpVtbl->GetAlternateLocation(This,pbstrAlternateLocation);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IVssWMDependency_QueryInterface(IVssWMDependency* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IVssWMDependency_AddRef(IVssWMDependency* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IVssWMDependency_Release(IVssWMDependency* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssWMDependency methods ***/
static FORCEINLINE HRESULT IVssWMDependency_GetWriterId(IVssWMDependency* This,VSS_ID *pWriterId) {
    return This->lpVtbl->GetWriterId(This,pWriterId);
}
static FORCEINLINE HRESULT IVssWMDependency_GetLogicalPath(IVssWMDependency* This,BSTR *pbstrLogicalPath) {
    return This->lpVtbl->GetLogicalPath(This,pbstrLogicalPath);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IVssComponent_QueryInterface(IVssComponent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IVssComponent_AddRef(IVssComponent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IVssComponent_Release(IVssComponent* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssComponent methods ***/
static FORCEINLINE HRESULT IVssComponent_GetLogicalPath(IVssComponent* This,BSTR *pbstrPath) {
    return This->lpVtbl->GetLogicalPath(This,pbstrPath);
}
static FORCEINLINE HRESULT IVssComponent_GetComponentType(IVssComponent* This,VSS_COMPONENT_TYPE *pct) {
    return This->lpVtbl->GetComponentType(This,pct);
}
static FORCEINLINE HRESULT IVssComponent_GetComponentName(IVssComponent* This,BSTR *pbstrName) {
    return This->lpVtbl->GetComponentName(This,pbstrName);
}
static FORCEINLINE HRESULT IVssComponent_GetBackupSucceeded(IVssComponent* This,boolean *pbSucceeded) {
    return This->lpVtbl->GetBackupSucceeded(This,pbSucceeded);
}
static FORCEINLINE HRESULT IVssComponent_GetAlternateLocationMappingCount(IVssComponent* This,UINT *pcMappings) {
    return This->lpVtbl->GetAlternateLocationMappingCount(This,pcMappings);
}
static FORCEINLINE HRESULT IVssComponent_GetAlternateLocationMapping(IVssComponent* This,UINT iMapping,IVssWMFiledesc **ppFiledesc) {
    return This->lpVtbl->GetAlternateLocationMapping(This,iMapping,ppFiledesc);
}
static FORCEINLINE HRESULT IVssComponent_SetBackupMetadata(IVssComponent* This,LPCWSTR wszData) {
    return This->lpVtbl->SetBackupMetadata(This,wszData);
}
static FORCEINLINE HRESULT IVssComponent_GetBackupMetadata(IVssComponent* This,BSTR *pbstrData) {
    return This->lpVtbl->GetBackupMetadata(This,pbstrData);
}
static FORCEINLINE HRESULT IVssComponent_AddPartialFile(IVssComponent* This,LPCWSTR wszPath,LPCWSTR wszFilename,LPCWSTR wszRanges,LPCWSTR wszMetadata) {
    return This->lpVtbl->AddPartialFile(This,wszPath,wszFilename,wszRanges,wszMetadata);
}
static FORCEINLINE HRESULT IVssComponent_GetPartialFileCount(IVssComponent* This,UINT *pcPartialFiles) {
    return This->lpVtbl->GetPartialFileCount(This,pcPartialFiles);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IVssComponent_IsSelectedForRestore(IVssComponent* This,boolean *pbSelectedForRestore) {
    return This->lpVtbl->IsSelectedForRestore(This,pbSelectedForRestore);
}
static FORCEINLINE HRESULT IVssComponent_GetAdditionalRestores(IVssComponent* This,boolean *pbAdditionalRestores) {
    return This->lpVtbl->GetAdditionalRestores(This,pbAdditionalRestores);
}
static FORCEINLINE HRESULT IVssComponent_GetNewTargetCount(IVssComponent* This,UINT *pcNewTarget) {
    return This->lpVtbl->GetNewTargetCount(This,pcNewTarget);
}
static FORCEINLINE HRESULT IVssComponent_GetNewTarget(IVssComponent* This,UINT iNewTarget,IVssWMFiledesc **ppFiledesc) {
    return This->lpVtbl->GetNewTarget(This,iNewTarget,ppFiledesc);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IVssComponent_GetDirectedTargetCount(IVssComponent* This,UINT *pcDirectedTarget) {
    return This->lpVtbl->GetDirectedTargetCount(This,pcDirectedTarget);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IVssComponent_SetRestoreMetadata(IVssComponent* This,LPCWSTR wszRestoreMetadata) {
    return This->lpVtbl->SetRestoreMetadata(This,wszRestoreMetadata);
}
static FORCEINLINE HRESULT IVssComponent_GetRestoreMetadata(IVssComponent* This,BSTR *pbstrRestoreMetadata) {
    return This->lpVtbl->GetRestoreMetadata(This,pbstrRestoreMetadata);
}
static FORCEINLINE HRESULT IVssComponent_SetRestoreTarget(IVssComponent* This,VSS_RESTORE_TARGET target) {
    return This->lpVtbl->SetRestoreTarget(This,target);
}
static FORCEINLINE HRESULT IVssComponent_GetRestoreTarget(IVssComponent* This,VSS_RESTORE_TARGET *pTarget) {
    return This->lpVtbl->GetRestoreTarget(This,pTarget);
}
static FORCEINLINE HRESULT IVssComponent_SetPreRestoreFailureMsg(IVssComponent* This,LPCWSTR wszPreRestoreFailureMsg) {
    return This->lpVtbl->SetPreRestoreFailureMsg(This,wszPreRestoreFailureMsg);
}
static FORCEINLINE HRESULT IVssComponent_GetPreRestoreFailureMsg(IVssComponent* This,BSTR *pbstrPreRestoreFailureMsg) {
    return This->lpVtbl->GetPreRestoreFailureMsg(This,pbstrPreRestoreFailureMsg);
}
static FORCEINLINE HRESULT IVssComponent_SetPostRestoreFailureMsg(IVssComponent* This,LPCWSTR wszPostRestoreFailureMsg) {
    return This->lpVtbl->SetPostRestoreFailureMsg(This,wszPostRestoreFailureMsg);
}
static FORCEINLINE HRESULT IVssComponent_GetPostRestoreFailureMsg(IVssComponent* This,BSTR *pbstrPostRestoreFailureMsg) {
    return This->lpVtbl->GetPostRestoreFailureMsg(This,pbstrPostRestoreFailureMsg);
}
static FORCEINLINE HRESULT IVssComponent_SetBackupStamp(IVssComponent* This,LPCWSTR wszBackupStamp) {
    return This->lpVtbl->SetBackupStamp(This,wszBackupStamp);
}
static FORCEINLINE HRESULT IVssComponent_GetBackupStamp(IVssComponent* This,BSTR *pbstrBackupStamp) {
    return This->lpVtbl->GetBackupStamp(This,pbstrBackupStamp);
}
static FORCEINLINE HRESULT IVssComponent_GetPreviousBackupStamp(IVssComponent* This,BSTR *pbstrBackupStamp) {
    return This->lpVtbl->GetPreviousBackupStamp(This,pbstrBackupStamp);
}
static FORCEINLINE HRESULT IVssComponent_GetBackupOptions(IVssComponent* This,BSTR *pbstrBackupOptions) {
    return This->lpVtbl->GetBackupOptions(This,pbstrBackupOptions);
}
static FORCEINLINE HRESULT IVssComponent_GetRestoreOptions(IVssComponent* This,BSTR *pbstrRestoreOptions) {
    return This->lpVtbl->GetRestoreOptions(This,pbstrRestoreOptions);
}
static FORCEINLINE HRESULT IVssComponent_GetRestoreSubcomponentCount(IVssComponent* This,UINT *pcRestoreSubcomponent) {
    return This->lpVtbl->GetRestoreSubcomponentCount(This,pcRestoreSubcomponent);
}
static FORCEINLINE HRESULT IVssComponent_GetRestoreSubcomponent(IVssComponent* This,UINT iComponent,BSTR *pbstrLogicalPath,BSTR *pbstrComponentName,boolean *pbRepair) {
    return This->lpVtbl->GetRestoreSubcomponent(This,iComponent,pbstrLogicalPath,pbstrComponentName,pbRepair);
}
static FORCEINLINE HRESULT IVssComponent_GetFileRestoreStatus(IVssComponent* This,VSS_FILE_RESTORE_STATUS *pStatus) {
    return This->lpVtbl->GetFileRestoreStatus(This,pStatus);
}
static FORCEINLINE HRESULT IVssComponent_AddDifferencedFilesByLastModifyTime(IVssComponent* This,LPCWSTR wszPath,LPCWSTR wszFilespec,WINBOOL bRecursive,FILETIME ftLastModifyTime) {
    return This->lpVtbl->AddDifferencedFilesByLastModifyTime(This,wszPath,wszFilespec,bRecursive,ftLastModifyTime);
}
static FORCEINLINE HRESULT IVssComponent_AddDifferencedFilesByLastModifyLSN(IVssComponent* This,LPCWSTR wszPath,LPCWSTR wszFilespec,WINBOOL bRecursive,BSTR bstrLsnString) {
    return This->lpVtbl->AddDifferencedFilesByLastModifyLSN(This,wszPath,wszFilespec,bRecursive,bstrLsnString);
}
static FORCEINLINE HRESULT IVssComponent_GetDifferencedFilesCount(IVssComponent* This,UINT *pcDifferencedFiles) {
    return This->lpVtbl->GetDifferencedFilesCount(This,pcDifferencedFiles);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IVssWriterComponents_GetComponentCount(IVssWriterComponents* This,UINT *pcComponents) {
    return This->lpVtbl->GetComponentCount(This,pcComponents);
}
static FORCEINLINE HRESULT IVssWriterComponents_GetWriterInfo(IVssWriterComponents* This,VSS_ID *pidInstance,VSS_ID *pidWriter) {
    return This->lpVtbl->GetWriterInfo(This,pidInstance,pidWriter);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IVssComponentEx_QueryInterface(IVssComponentEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IVssComponentEx_AddRef(IVssComponentEx* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IVssComponentEx_Release(IVssComponentEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssComponent methods ***/
static FORCEINLINE HRESULT IVssComponentEx_GetLogicalPath(IVssComponentEx* This,BSTR *pbstrPath) {
    return This->lpVtbl->GetLogicalPath(This,pbstrPath);
}
static FORCEINLINE HRESULT IVssComponentEx_GetComponentType(IVssComponentEx* This,VSS_COMPONENT_TYPE *pct) {
    return This->lpVtbl->GetComponentType(This,pct);
}
static FORCEINLINE HRESULT IVssComponentEx_GetComponentName(IVssComponentEx* This,BSTR *pbstrName) {
    return This->lpVtbl->GetComponentName(This,pbstrName);
}
static FORCEINLINE HRESULT IVssComponentEx_GetBackupSucceeded(IVssComponentEx* This,boolean *pbSucceeded) {
    return This->lpVtbl->GetBackupSucceeded(This,pbSucceeded);
}
static FORCEINLINE HRESULT IVssComponentEx_GetAlternateLocationMappingCount(IVssComponentEx* This,UINT *pcMappings) {
    return This->lpVtbl->GetAlternateLocationMappingCount(This,pcMappings);
}
static FORCEINLINE HRESULT IVssComponentEx_GetAlternateLocationMapping(IVssComponentEx* This,UINT iMapping,IVssWMFiledesc **ppFiledesc) {
    return This->lpVtbl->GetAlternateLocationMapping(This,iMapping,ppFiledesc);
}
static FORCEINLINE HRESULT IVssComponentEx_SetBackupMetadata(IVssComponentEx* This,LPCWSTR wszData) {
    return This->lpVtbl->SetBackupMetadata(This,wszData);
}
static FORCEINLINE HRESULT IVssComponentEx_GetBackupMetadata(IVssComponentEx* This,BSTR *pbstrData) {
    return This->lpVtbl->GetBackupMetadata(This,pbstrData);
}
static FORCEINLINE HRESULT IVssComponentEx_AddPartialFile(IVssComponentEx* This,LPCWSTR wszPath,LPCWSTR wszFilename,LPCWSTR wszRanges,LPCWSTR wszMetadata) {
    return This->lpVtbl->AddPartialFile(This,wszPath,wszFilename,wszRanges,wszMetadata);
}
static FORCEINLINE HRESULT IVssComponentEx_GetPartialFileCount(IVssComponentEx* This,UINT *pcPartialFiles) {
    return This->lpVtbl->GetPartialFileCount(This,pcPartialFiles);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IVssComponentEx_IsSelectedForRestore(IVssComponentEx* This,boolean *pbSelectedForRestore) {
    return This->lpVtbl->IsSelectedForRestore(This,pbSelectedForRestore);
}
static FORCEINLINE HRESULT IVssComponentEx_GetAdditionalRestores(IVssComponentEx* This,boolean *pbAdditionalRestores) {
    return This->lpVtbl->GetAdditionalRestores(This,pbAdditionalRestores);
}
static FORCEINLINE HRESULT IVssComponentEx_GetNewTargetCount(IVssComponentEx* This,UINT *pcNewTarget) {
    return This->lpVtbl->GetNewTargetCount(This,pcNewTarget);
}
static FORCEINLINE HRESULT IVssComponentEx_GetNewTarget(IVssComponentEx* This,UINT iNewTarget,IVssWMFiledesc **ppFiledesc) {
    return This->lpVtbl->GetNewTarget(This,iNewTarget,ppFiledesc);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IVssComponentEx_GetDirectedTargetCount(IVssComponentEx* This,UINT *pcDirectedTarget) {
    return This->lpVtbl->GetDirectedTargetCount(This,pcDirectedTarget);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IVssComponentEx_SetRestoreMetadata(IVssComponentEx* This,LPCWSTR wszRestoreMetadata) {
    return This->lpVtbl->SetRestoreMetadata(This,wszRestoreMetadata);
}
static FORCEINLINE HRESULT IVssComponentEx_GetRestoreMetadata(IVssComponentEx* This,BSTR *pbstrRestoreMetadata) {
    return This->lpVtbl->GetRestoreMetadata(This,pbstrRestoreMetadata);
}
static FORCEINLINE HRESULT IVssComponentEx_SetRestoreTarget(IVssComponentEx* This,VSS_RESTORE_TARGET target) {
    return This->lpVtbl->SetRestoreTarget(This,target);
}
static FORCEINLINE HRESULT IVssComponentEx_GetRestoreTarget(IVssComponentEx* This,VSS_RESTORE_TARGET *pTarget) {
    return This->lpVtbl->GetRestoreTarget(This,pTarget);
}
static FORCEINLINE HRESULT IVssComponentEx_SetPreRestoreFailureMsg(IVssComponentEx* This,LPCWSTR wszPreRestoreFailureMsg) {
    return This->lpVtbl->SetPreRestoreFailureMsg(This,wszPreRestoreFailureMsg);
}
static FORCEINLINE HRESULT IVssComponentEx_GetPreRestoreFailureMsg(IVssComponentEx* This,BSTR *pbstrPreRestoreFailureMsg) {
    return This->lpVtbl->GetPreRestoreFailureMsg(This,pbstrPreRestoreFailureMsg);
}
static FORCEINLINE HRESULT IVssComponentEx_SetPostRestoreFailureMsg(IVssComponentEx* This,LPCWSTR wszPostRestoreFailureMsg) {
    return This->lpVtbl->SetPostRestoreFailureMsg(This,wszPostRestoreFailureMsg);
}
static FORCEINLINE HRESULT IVssComponentEx_GetPostRestoreFailureMsg(IVssComponentEx* This,BSTR *pbstrPostRestoreFailureMsg) {
    return This->lpVtbl->GetPostRestoreFailureMsg(This,pbstrPostRestoreFailureMsg);
}
static FORCEINLINE HRESULT IVssComponentEx_SetBackupStamp(IVssComponentEx* This,LPCWSTR wszBackupStamp) {
    return This->lpVtbl->SetBackupStamp(This,wszBackupStamp);
}
static FORCEINLINE HRESULT IVssComponentEx_GetBackupStamp(IVssComponentEx* This,BSTR *pbstrBackupStamp) {
    return This->lpVtbl->GetBackupStamp(This,pbstrBackupStamp);
}
static FORCEINLINE HRESULT IVssComponentEx_GetPreviousBackupStamp(IVssComponentEx* This,BSTR *pbstrBackupStamp) {
    return This->lpVtbl->GetPreviousBackupStamp(This,pbstrBackupStamp);
}
static FORCEINLINE HRESULT IVssComponentEx_GetBackupOptions(IVssComponentEx* This,BSTR *pbstrBackupOptions) {
    return This->lpVtbl->GetBackupOptions(This,pbstrBackupOptions);
}
static FORCEINLINE HRESULT IVssComponentEx_GetRestoreOptions(IVssComponentEx* This,BSTR *pbstrRestoreOptions) {
    return This->lpVtbl->GetRestoreOptions(This,pbstrRestoreOptions);
}
static FORCEINLINE HRESULT IVssComponentEx_GetRestoreSubcomponentCount(IVssComponentEx* This,UINT *pcRestoreSubcomponent) {
    return This->lpVtbl->GetRestoreSubcomponentCount(This,pcRestoreSubcomponent);
}
static FORCEINLINE HRESULT IVssComponentEx_GetRestoreSubcomponent(IVssComponentEx* This,UINT iComponent,BSTR *pbstrLogicalPath,BSTR *pbstrComponentName,boolean *pbRepair) {
    return This->lpVtbl->GetRestoreSubcomponent(This,iComponent,pbstrLogicalPath,pbstrComponentName,pbRepair);
}
static FORCEINLINE HRESULT IVssComponentEx_GetFileRestoreStatus(IVssComponentEx* This,VSS_FILE_RESTORE_STATUS *pStatus) {
    return This->lpVtbl->GetFileRestoreStatus(This,pStatus);
}
static FORCEINLINE HRESULT IVssComponentEx_AddDifferencedFilesByLastModifyTime(IVssComponentEx* This,LPCWSTR wszPath,LPCWSTR wszFilespec,WINBOOL bRecursive,FILETIME ftLastModifyTime) {
    return This->lpVtbl->AddDifferencedFilesByLastModifyTime(This,wszPath,wszFilespec,bRecursive,ftLastModifyTime);
}
static FORCEINLINE HRESULT IVssComponentEx_AddDifferencedFilesByLastModifyLSN(IVssComponentEx* This,LPCWSTR wszPath,LPCWSTR wszFilespec,WINBOOL bRecursive,BSTR bstrLsnString) {
    return This->lpVtbl->AddDifferencedFilesByLastModifyLSN(This,wszPath,wszFilespec,bRecursive,bstrLsnString);
}
static FORCEINLINE HRESULT IVssComponentEx_GetDifferencedFilesCount(IVssComponentEx* This,UINT *pcDifferencedFiles) {
    return This->lpVtbl->GetDifferencedFilesCount(This,pcDifferencedFiles);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IVssComponentEx_SetPrepareForBackupFailureMsg(IVssComponentEx* This,LPCWSTR wszFailureMsg) {
    return This->lpVtbl->SetPrepareForBackupFailureMsg(This,wszFailureMsg);
}
static FORCEINLINE HRESULT IVssComponentEx_SetPostSnapshotFailureMsg(IVssComponentEx* This,LPCWSTR wszFailureMsg) {
    return This->lpVtbl->SetPostSnapshotFailureMsg(This,wszFailureMsg);
}
static FORCEINLINE HRESULT IVssComponentEx_GetPrepareForBackupFailureMsg(IVssComponentEx* This,BSTR *pbstrFailureMsg) {
    return This->lpVtbl->GetPrepareForBackupFailureMsg(This,pbstrFailureMsg);
}
static FORCEINLINE HRESULT IVssComponentEx_GetPostSnapshotFailureMsg(IVssComponentEx* This,BSTR *pbstrFailureMsg) {
    return This->lpVtbl->GetPostSnapshotFailureMsg(This,pbstrFailureMsg);
}
static FORCEINLINE HRESULT IVssComponentEx_GetAuthoritativeRestore(IVssComponentEx* This,boolean *pbAuth) {
    return This->lpVtbl->GetAuthoritativeRestore(This,pbAuth);
}
static FORCEINLINE HRESULT IVssComponentEx_GetRollForward(IVssComponentEx* This,VSS_ROLLFORWARD_TYPE *pRollType,BSTR *pbstrPoint) {
    return This->lpVtbl->GetRollForward(This,pRollType,pbstrPoint);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IVssComponentEx2_QueryInterface(IVssComponentEx2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IVssComponentEx2_AddRef(IVssComponentEx2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IVssComponentEx2_Release(IVssComponentEx2* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssComponent methods ***/
static FORCEINLINE HRESULT IVssComponentEx2_GetLogicalPath(IVssComponentEx2* This,BSTR *pbstrPath) {
    return This->lpVtbl->GetLogicalPath(This,pbstrPath);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetComponentType(IVssComponentEx2* This,VSS_COMPONENT_TYPE *pct) {
    return This->lpVtbl->GetComponentType(This,pct);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetComponentName(IVssComponentEx2* This,BSTR *pbstrName) {
    return This->lpVtbl->GetComponentName(This,pbstrName);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetBackupSucceeded(IVssComponentEx2* This,boolean *pbSucceeded) {
    return This->lpVtbl->GetBackupSucceeded(This,pbSucceeded);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetAlternateLocationMappingCount(IVssComponentEx2* This,UINT *pcMappings) {
    return This->lpVtbl->GetAlternateLocationMappingCount(This,pcMappings);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetAlternateLocationMapping(IVssComponentEx2* This,UINT iMapping,IVssWMFiledesc **ppFiledesc) {
    return This->lpVtbl->GetAlternateLocationMapping(This,iMapping,ppFiledesc);
}
static FORCEINLINE HRESULT IVssComponentEx2_SetBackupMetadata(IVssComponentEx2* This,LPCWSTR wszData) {
    return This->lpVtbl->SetBackupMetadata(This,wszData);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetBackupMetadata(IVssComponentEx2* This,BSTR *pbstrData) {
    return This->lpVtbl->GetBackupMetadata(This,pbstrData);
}
static FORCEINLINE HRESULT IVssComponentEx2_AddPartialFile(IVssComponentEx2* This,LPCWSTR wszPath,LPCWSTR wszFilename,LPCWSTR wszRanges,LPCWSTR wszMetadata) {
    return This->lpVtbl->AddPartialFile(This,wszPath,wszFilename,wszRanges,wszMetadata);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetPartialFileCount(IVssComponentEx2* This,UINT *pcPartialFiles) {
    return This->lpVtbl->GetPartialFileCount(This,pcPartialFiles);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IVssComponentEx2_IsSelectedForRestore(IVssComponentEx2* This,boolean *pbSelectedForRestore) {
    return This->lpVtbl->IsSelectedForRestore(This,pbSelectedForRestore);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetAdditionalRestores(IVssComponentEx2* This,boolean *pbAdditionalRestores) {
    return This->lpVtbl->GetAdditionalRestores(This,pbAdditionalRestores);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetNewTargetCount(IVssComponentEx2* This,UINT *pcNewTarget) {
    return This->lpVtbl->GetNewTargetCount(This,pcNewTarget);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetNewTarget(IVssComponentEx2* This,UINT iNewTarget,IVssWMFiledesc **ppFiledesc) {
    return This->lpVtbl->GetNewTarget(This,iNewTarget,ppFiledesc);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IVssComponentEx2_GetDirectedTargetCount(IVssComponentEx2* This,UINT *pcDirectedTarget) {
    return This->lpVtbl->GetDirectedTargetCount(This,pcDirectedTarget);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IVssComponentEx2_SetRestoreMetadata(IVssComponentEx2* This,LPCWSTR wszRestoreMetadata) {
    return This->lpVtbl->SetRestoreMetadata(This,wszRestoreMetadata);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetRestoreMetadata(IVssComponentEx2* This,BSTR *pbstrRestoreMetadata) {
    return This->lpVtbl->GetRestoreMetadata(This,pbstrRestoreMetadata);
}
static FORCEINLINE HRESULT IVssComponentEx2_SetRestoreTarget(IVssComponentEx2* This,VSS_RESTORE_TARGET target) {
    return This->lpVtbl->SetRestoreTarget(This,target);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetRestoreTarget(IVssComponentEx2* This,VSS_RESTORE_TARGET *pTarget) {
    return This->lpVtbl->GetRestoreTarget(This,pTarget);
}
static FORCEINLINE HRESULT IVssComponentEx2_SetPreRestoreFailureMsg(IVssComponentEx2* This,LPCWSTR wszPreRestoreFailureMsg) {
    return This->lpVtbl->SetPreRestoreFailureMsg(This,wszPreRestoreFailureMsg);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetPreRestoreFailureMsg(IVssComponentEx2* This,BSTR *pbstrPreRestoreFailureMsg) {
    return This->lpVtbl->GetPreRestoreFailureMsg(This,pbstrPreRestoreFailureMsg);
}
static FORCEINLINE HRESULT IVssComponentEx2_SetPostRestoreFailureMsg(IVssComponentEx2* This,LPCWSTR wszPostRestoreFailureMsg) {
    return This->lpVtbl->SetPostRestoreFailureMsg(This,wszPostRestoreFailureMsg);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetPostRestoreFailureMsg(IVssComponentEx2* This,BSTR *pbstrPostRestoreFailureMsg) {
    return This->lpVtbl->GetPostRestoreFailureMsg(This,pbstrPostRestoreFailureMsg);
}
static FORCEINLINE HRESULT IVssComponentEx2_SetBackupStamp(IVssComponentEx2* This,LPCWSTR wszBackupStamp) {
    return This->lpVtbl->SetBackupStamp(This,wszBackupStamp);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetBackupStamp(IVssComponentEx2* This,BSTR *pbstrBackupStamp) {
    return This->lpVtbl->GetBackupStamp(This,pbstrBackupStamp);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetPreviousBackupStamp(IVssComponentEx2* This,BSTR *pbstrBackupStamp) {
    return This->lpVtbl->GetPreviousBackupStamp(This,pbstrBackupStamp);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetBackupOptions(IVssComponentEx2* This,BSTR *pbstrBackupOptions) {
    return This->lpVtbl->GetBackupOptions(This,pbstrBackupOptions);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetRestoreOptions(IVssComponentEx2* This,BSTR *pbstrRestoreOptions) {
    return This->lpVtbl->GetRestoreOptions(This,pbstrRestoreOptions);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetRestoreSubcomponentCount(IVssComponentEx2* This,UINT *pcRestoreSubcomponent) {
    return This->lpVtbl->GetRestoreSubcomponentCount(This,pcRestoreSubcomponent);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetRestoreSubcomponent(IVssComponentEx2* This,UINT iComponent,BSTR *pbstrLogicalPath,BSTR *pbstrComponentName,boolean *pbRepair) {
    return This->lpVtbl->GetRestoreSubcomponent(This,iComponent,pbstrLogicalPath,pbstrComponentName,pbRepair);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetFileRestoreStatus(IVssComponentEx2* This,VSS_FILE_RESTORE_STATUS *pStatus) {
    return This->lpVtbl->GetFileRestoreStatus(This,pStatus);
}
static FORCEINLINE HRESULT IVssComponentEx2_AddDifferencedFilesByLastModifyTime(IVssComponentEx2* This,LPCWSTR wszPath,LPCWSTR wszFilespec,WINBOOL bRecursive,FILETIME ftLastModifyTime) {
    return This->lpVtbl->AddDifferencedFilesByLastModifyTime(This,wszPath,wszFilespec,bRecursive,ftLastModifyTime);
}
static FORCEINLINE HRESULT IVssComponentEx2_AddDifferencedFilesByLastModifyLSN(IVssComponentEx2* This,LPCWSTR wszPath,LPCWSTR wszFilespec,WINBOOL bRecursive,BSTR bstrLsnString) {
    return This->lpVtbl->AddDifferencedFilesByLastModifyLSN(This,wszPath,wszFilespec,bRecursive,bstrLsnString);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetDifferencedFilesCount(IVssComponentEx2* This,UINT *pcDifferencedFiles) {
    return This->lpVtbl->GetDifferencedFilesCount(This,pcDifferencedFiles);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IVssComponentEx2_SetPrepareForBackupFailureMsg(IVssComponentEx2* This,LPCWSTR wszFailureMsg) {
    return This->lpVtbl->SetPrepareForBackupFailureMsg(This,wszFailureMsg);
}
static FORCEINLINE HRESULT IVssComponentEx2_SetPostSnapshotFailureMsg(IVssComponentEx2* This,LPCWSTR wszFailureMsg) {
    return This->lpVtbl->SetPostSnapshotFailureMsg(This,wszFailureMsg);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetPrepareForBackupFailureMsg(IVssComponentEx2* This,BSTR *pbstrFailureMsg) {
    return This->lpVtbl->GetPrepareForBackupFailureMsg(This,pbstrFailureMsg);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetPostSnapshotFailureMsg(IVssComponentEx2* This,BSTR *pbstrFailureMsg) {
    return This->lpVtbl->GetPostSnapshotFailureMsg(This,pbstrFailureMsg);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetAuthoritativeRestore(IVssComponentEx2* This,boolean *pbAuth) {
    return This->lpVtbl->GetAuthoritativeRestore(This,pbAuth);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetRollForward(IVssComponentEx2* This,VSS_ROLLFORWARD_TYPE *pRollType,BSTR *pbstrPoint) {
    return This->lpVtbl->GetRollForward(This,pRollType,pbstrPoint);
}
static FORCEINLINE HRESULT IVssComponentEx2_GetRestoreName(IVssComponentEx2* This,BSTR *pbstrName) {
    return This->lpVtbl->GetRestoreName(This,pbstrName);
}
/*** IVssComponentEx2 methods ***/
static FORCEINLINE HRESULT IVssComponentEx2_SetFailure(IVssComponentEx2* This,HRESULT hr,HRESULT hrApplication,LPCWSTR wszApplicationMessage,DWORD dwReserved) {
    return This->lpVtbl->SetFailure(This,hr,hrApplication,wszApplicationMessage,dwReserved);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IVssCreateWriterMetadata_AddIncludeFiles(IVssCreateWriterMetadata* This,LPCWSTR wszPath,LPCWSTR wszFilespec,boolean bRecursive,LPCWSTR wszAlternateLocation) {
    return This->lpVtbl->AddIncludeFiles(This,wszPath,wszFilespec,bRecursive,wszAlternateLocation);
}
static FORCEINLINE HRESULT IVssCreateWriterMetadata_AddExcludeFiles(IVssCreateWriterMetadata* This,LPCWSTR wszPath,LPCWSTR wszFilespec,boolean bRecursive) {
    return This->lpVtbl->AddExcludeFiles(This,wszPath,wszFilespec,bRecursive);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IVssCreateWriterMetadata_AddAlternateLocationMapping(IVssCreateWriterMetadata* This,LPCWSTR wszSourcePath,LPCWSTR wszSourceFilespec,boolean bRecursive,LPCWSTR wszDestination) {
    return This->lpVtbl->AddAlternateLocationMapping(This,wszSourcePath,wszSourceFilespec,bRecursive,wszDestination);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IVssCreateWriterMetadata_SetBackupSchema(IVssCreateWriterMetadata* This,DWORD dwSchemaMask) {
    return This->lpVtbl->SetBackupSchema(This,dwSchemaMask);
}
static FORCEINLINE HRESULT IVssCreateWriterMetadata_GetDocument(IVssCreateWriterMetadata* This,IXMLDOMDocument **pDoc) {
    return This->lpVtbl->GetDocument(This,pDoc);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IVssCreateWriterMetadataEx_AddIncludeFiles(IVssCreateWriterMetadataEx* This,LPCWSTR wszPath,LPCWSTR wszFilespec,boolean bRecursive,LPCWSTR wszAlternateLocation) {
    return This->lpVtbl->AddIncludeFiles(This,wszPath,wszFilespec,bRecursive,wszAlternateLocation);
}
static FORCEINLINE HRESULT IVssCreateWriterMetadataEx_AddExcludeFiles(IVssCreateWriterMetadataEx* This,LPCWSTR wszPath,LPCWSTR wszFilespec,boolean bRecursive) {
    return This->lpVtbl->AddExcludeFiles(This,wszPath,wszFilespec,bRecursive);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IVssCreateWriterMetadataEx_AddAlternateLocationMapping(IVssCreateWriterMetadataEx* This,LPCWSTR wszSourcePath,LPCWSTR wszSourceFilespec,boolean bRecursive,LPCWSTR wszDestination) {
    return This->lpVtbl->AddAlternateLocationMapping(This,wszSourcePath,wszSourceFilespec,bRecursive,wszDestination);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IVssCreateWriterMetadataEx_SetBackupSchema(IVssCreateWriterMetadataEx* This,DWORD dwSchemaMask) {
    return This->lpVtbl->SetBackupSchema(This,dwSchemaMask);
}
static FORCEINLINE HRESULT IVssCreateWriterMetadataEx_GetDocument(IVssCreateWriterMetadataEx* This,IXMLDOMDocument **pDoc) {
    return This->lpVtbl->GetDocument(This,pDoc);
}
static FORCEINLINE HRESULT IVssCreateWriterMetadataEx_SaveAsXML(IVssCreateWriterMetadataEx* This,BSTR *pbstrXML) {
    return This->lpVtbl->SaveAsXML(This,pbstrXML);
}
/*** IVssCreateWriterMetadataEx methods ***/
static FORCEINLINE 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 FORCEINLINE HRESULT IVssWriterImpl_QueryInterface(IVssWriterImpl* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IVssWriterImpl_AddRef(IVssWriterImpl* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IVssWriterImpl_Release(IVssWriterImpl* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssWriterImpl methods ***/
static FORCEINLINE 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 FORCEINLINE HRESULT IVssWriterImpl_Subscribe(IVssWriterImpl* This,DWORD dwSubscribeTimeout,DWORD dwEventFlags) {
    return This->lpVtbl->Subscribe(This,dwSubscribeTimeout,dwEventFlags);
}
static FORCEINLINE HRESULT IVssWriterImpl_Unsubscribe(IVssWriterImpl* This) {
    return This->lpVtbl->Unsubscribe(This);
}
static FORCEINLINE void IVssWriterImpl_Uninitialize(IVssWriterImpl* This) {
    This->lpVtbl->Uninitialize(This);
}
static FORCEINLINE LPCWSTR * IVssWriterImpl_GetCurrentVolumeArray(IVssWriterImpl* This) {
    return This->lpVtbl->GetCurrentVolumeArray(This);
}
static FORCEINLINE UINT IVssWriterImpl_GetCurrentVolumeCount(IVssWriterImpl* This) {
    return This->lpVtbl->GetCurrentVolumeCount(This);
}
static FORCEINLINE HRESULT IVssWriterImpl_GetSnapshotDeviceName(IVssWriterImpl* This,LPCWSTR wszOriginalVolume,LPCWSTR *ppwszSnapshotDevice) {
    return This->lpVtbl->GetSnapshotDeviceName(This,wszOriginalVolume,ppwszSnapshotDevice);
}
static FORCEINLINE VSS_ID IVssWriterImpl_GetCurrentSnapshotSetId(IVssWriterImpl* This) {
    VSS_ID __ret;
    return *This->lpVtbl->GetCurrentSnapshotSetId(This,&__ret);
}
static FORCEINLINE LONG IVssWriterImpl_GetContext(IVssWriterImpl* This) {
    return This->lpVtbl->GetContext(This);
}
static FORCEINLINE VSS_APPLICATION_LEVEL IVssWriterImpl_GetCurrentLevel(IVssWriterImpl* This) {
    return This->lpVtbl->GetCurrentLevel(This);
}
static FORCEINLINE boolean IVssWriterImpl_IsPathAffected(IVssWriterImpl* This,LPCWSTR wszPath) {
    return This->lpVtbl->IsPathAffected(This,wszPath);
}
static FORCEINLINE boolean IVssWriterImpl_IsBootableSystemStateBackedUp(IVssWriterImpl* This) {
    return This->lpVtbl->IsBootableSystemStateBackedUp(This);
}
static FORCEINLINE boolean IVssWriterImpl_AreComponentsSelected(IVssWriterImpl* This) {
    return This->lpVtbl->AreComponentsSelected(This);
}
static FORCEINLINE VSS_BACKUP_TYPE IVssWriterImpl_GetBackupType(IVssWriterImpl* This) {
    return This->lpVtbl->GetBackupType(This);
}
static FORCEINLINE VSS_RESTORE_TYPE IVssWriterImpl_GetRestoreType(IVssWriterImpl* This) {
    return This->lpVtbl->GetRestoreType(This);
}
static FORCEINLINE HRESULT IVssWriterImpl_SetWriterFailure(IVssWriterImpl* This,HRESULT hr) {
    return This->lpVtbl->SetWriterFailure(This,hr);
}
static FORCEINLINE boolean IVssWriterImpl_IsPartialFileSupportEnabled(IVssWriterImpl* This) {
    return This->lpVtbl->IsPartialFileSupportEnabled(This);
}
static FORCEINLINE HRESULT IVssWriterImpl_InstallAlternateWriter(IVssWriterImpl* This,VSS_ID idWriter,CLSID clsid) {
    return This->lpVtbl->InstallAlternateWriter(This,idWriter,clsid);
}
static FORCEINLINE IVssExamineWriterMetadata * IVssWriterImpl_GetIdentityInformation(IVssWriterImpl* This) {
    return This->lpVtbl->GetIdentityInformation(This);
}
static FORCEINLINE HRESULT IVssWriterImpl_SetWriterFailureEx(IVssWriterImpl* This,HRESULT hr,HRESULT hrApplication,LPCWSTR wszApplicationMessage) {
    return This->lpVtbl->SetWriterFailureEx(This,hr,hrApplication,wszApplicationMessage);
}
static FORCEINLINE HRESULT IVssWriterImpl_GetSessionId(IVssWriterImpl* This,VSS_ID *idSession) {
    return This->lpVtbl->GetSessionId(This,idSession);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IVssCreateExpressWriterMetadata_QueryInterface(IVssCreateExpressWriterMetadata* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IVssCreateExpressWriterMetadata_AddRef(IVssCreateExpressWriterMetadata* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IVssCreateExpressWriterMetadata_Release(IVssCreateExpressWriterMetadata* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssCreateExpressWriterMetadata methods ***/
static FORCEINLINE HRESULT IVssCreateExpressWriterMetadata_AddExcludeFiles(IVssCreateExpressWriterMetadata* This,LPCWSTR wszPath,LPCWSTR wszFilespec,boolean bRecursive) {
    return This->lpVtbl->AddExcludeFiles(This,wszPath,wszFilespec,bRecursive);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IVssCreateExpressWriterMetadata_SetBackupSchema(IVssCreateExpressWriterMetadata* This,DWORD dwSchemaMask) {
    return This->lpVtbl->SetBackupSchema(This,dwSchemaMask);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IVssExpressWriter_QueryInterface(IVssExpressWriter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IVssExpressWriter_AddRef(IVssExpressWriter* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IVssExpressWriter_Release(IVssExpressWriter* This) {
    return This->lpVtbl->Release(This);
}
/*** IVssExpressWriter methods ***/
static FORCEINLINE 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 FORCEINLINE HRESULT IVssExpressWriter_LoadMetadata(IVssExpressWriter* This,LPCWSTR metadata,DWORD reserved) {
    return This->lpVtbl->LoadMetadata(This,metadata,reserved);
}
static FORCEINLINE HRESULT IVssExpressWriter_Register(IVssExpressWriter* This) {
    return This->lpVtbl->Register(This);
}
static FORCEINLINE 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__ */
