You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2225 lines
53 KiB
2225 lines
53 KiB
/*++
|
|
|
|
Copyright (c) 2000-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
vs_cmxml.cxx
|
|
|
|
Abstract:
|
|
|
|
Implementation of Backup Components Metadata XML wrapper classes
|
|
|
|
Brian Berkowitz [brianb] 3/13/2000
|
|
|
|
TBD:
|
|
|
|
Add comments.
|
|
|
|
Revision History:
|
|
|
|
Name Date Comments
|
|
brianb 03/16/2000 Created
|
|
brianb 03/22/2000 Added support for PrepareForBackup and BackupComplete
|
|
brianb 04/25/2000 Cleaned up Critical section stuff
|
|
brianb 05/03/2000 changed for new security model
|
|
ssteiner 11/10/2000 143810 Move SimulateSnapshotXxxx() calls to be hosted by VsSvc.
|
|
|
|
--*/
|
|
|
|
#include "vs_sec.hxx"
|
|
|
|
#include "vs_reg.hxx"
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
// Standard foo for file name aliasing. This code block must be after
|
|
// all includes of VSS header files.
|
|
//
|
|
#ifdef VSS_FILE_ALIAS
|
|
#undef VSS_FILE_ALIAS
|
|
#endif
|
|
#define VSS_FILE_ALIAS "INCCXMLH"
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
const VSS_ID x_idWriterRegistry =
|
|
{
|
|
0xAFBAB4A2,
|
|
0x367D,
|
|
0x4D15,
|
|
{0xA5, 0x86, 0x71, 0xDB, 0xB1, 0x8F, 0x84, 0x85}
|
|
};
|
|
|
|
const VSS_ID x_idWriterEventLog =
|
|
{
|
|
0xeee8c692,
|
|
0x67ed,
|
|
0x4250,
|
|
{0x8d, 0x86, 0x39, 0x6, 0x3, 0x7, 0xd, 0x00}
|
|
};
|
|
|
|
const VSS_ID x_idWriterComREGDB =
|
|
{
|
|
0x542da469,
|
|
0xd3e1,
|
|
0x473c,
|
|
{0x9f, 0x4f, 0x78, 0x47, 0xf0, 0x1f, 0xc6, 0x4f}
|
|
};
|
|
|
|
// guid used to identify the snapshot service itself when recording
|
|
// the snapshot set description XML stuff.
|
|
const VSS_ID idVolumeSnapshotService =
|
|
{
|
|
0xe68b51c0,
|
|
0xa080,
|
|
0x4078,
|
|
{0xa2, 0x79, 0x77, 0xfd, 0x4b, 0x6a, 0x41, 0xf7}
|
|
};
|
|
|
|
|
|
|
|
class IVssWriterComponentsInt :
|
|
public IVssWriterComponentsExt
|
|
{
|
|
public:
|
|
// initialize
|
|
STDMETHOD(Initialize)(bool fFindToplevel) = 0;
|
|
|
|
// has document been changed
|
|
STDMETHOD(IsChanged)(bool *pbChanged) = 0;
|
|
|
|
// save document as XML
|
|
STDMETHOD(SaveAsXML)(OUT BSTR *pbstrXMLDocument) = 0;
|
|
};
|
|
|
|
|
|
|
|
|
|
// Writer property structure
|
|
typedef struct _VSS_WRITER_PROP {
|
|
VSS_ID m_InstanceId;
|
|
VSS_ID m_ClassId;
|
|
VSS_WRITER_STATE m_nState;
|
|
VSS_PWSZ m_pwszName;
|
|
HRESULT m_hrWriterFailure;
|
|
bool m_bResponseReceived;
|
|
} VSS_WRITER_PROP, *PVSS_WRITER_PROP;
|
|
|
|
|
|
|
|
|
|
// list of writer data that is gotten from ExposeWriterMetadata and
|
|
// SetContent
|
|
class CInternalWriterData
|
|
{
|
|
public:
|
|
// constructor
|
|
CInternalWriterData()
|
|
{
|
|
m_pDataNext = NULL;
|
|
m_pOwnerToken = NULL;
|
|
}
|
|
|
|
~CInternalWriterData()
|
|
{
|
|
delete m_pOwnerToken;
|
|
}
|
|
|
|
// initialize an element
|
|
void Initialize
|
|
(
|
|
IN VSS_ID idInstance,
|
|
IN VSS_ID idWriter,
|
|
IN BSTR bstrWriterName,
|
|
IN BSTR bstrMetadata,
|
|
IN TOKEN_OWNER *pOwnerToken
|
|
)
|
|
{
|
|
m_idInstance = idInstance;
|
|
m_idWriter = idWriter;
|
|
m_bstrWriterName = bstrWriterName;
|
|
m_bstrWriterMetadata = bstrMetadata;
|
|
m_pOwnerToken = pOwnerToken;
|
|
m_bstrWriterComponents.Empty();
|
|
m_nState = VSS_WS_STABLE;
|
|
m_hrWriterFailure = S_OK;
|
|
}
|
|
|
|
void SetComponents(IN BSTR bstrComponents)
|
|
{
|
|
m_bstrWriterComponents = bstrComponents;
|
|
}
|
|
|
|
|
|
// instance id of writer
|
|
VSS_ID m_idInstance;
|
|
|
|
// class id of the writer
|
|
VSS_ID m_idWriter;
|
|
|
|
// name of the writer
|
|
CComBSTR m_bstrWriterName;
|
|
|
|
// XML writer metadata from writer
|
|
CComBSTR m_bstrWriterMetadata;
|
|
|
|
// last writer failure
|
|
// maintained in case writer is disabled
|
|
HRESULT m_hrWriterFailure;
|
|
|
|
// last writer state
|
|
// maintained in case writer is disabled
|
|
VSS_WRITER_STATE m_nState;
|
|
|
|
// XML writer component data
|
|
CComBSTR m_bstrWriterComponents;
|
|
|
|
// next pointer
|
|
CInternalWriterData *m_pDataNext;
|
|
|
|
// security id for client thread
|
|
TOKEN_OWNER *m_pOwnerToken;
|
|
};
|
|
|
|
|
|
|
|
// class to access a component from the BACKUP_COMPONENTS document
|
|
class CVssComponent :
|
|
public CVssMetadataHelper,
|
|
public IVssComponent
|
|
{
|
|
friend class CVssWriterComponents;
|
|
private:
|
|
// constructor (can only be called from CVssWriterComponents)
|
|
CVssComponent
|
|
(
|
|
IXMLDOMNode *pNode,
|
|
IXMLDOMDocument *pDoc,
|
|
CVssWriterComponents *pWriterComponents,
|
|
bool bInRequestor,
|
|
bool bRestore
|
|
) :
|
|
CVssMetadataHelper(pNode, pDoc),
|
|
m_cRef(0),
|
|
m_pWriterComponents(pWriterComponents),
|
|
m_bInRequestor(bInRequestor),
|
|
m_bRestore(bRestore)
|
|
{
|
|
}
|
|
|
|
// 2nd phase constructor
|
|
void Initialize(CVssFunctionTracer &ft)
|
|
{
|
|
InitializeHelper(ft);
|
|
}
|
|
|
|
public:
|
|
// obtain logical path of component
|
|
STDMETHOD(GetLogicalPath)(OUT BSTR *pbstrPath);
|
|
|
|
// obtain component type(VSS_CT_DATABASE or VSS_CT_FILEGROUP)
|
|
STDMETHOD(GetComponentType)(VSS_COMPONENT_TYPE *pct);
|
|
|
|
// get component name
|
|
STDMETHOD(GetComponentName)(OUT BSTR *pbstrName);
|
|
|
|
// determine whether the component was successfully backed up.
|
|
STDMETHOD(GetBackupSucceeded)(OUT bool *pbSucceeded);
|
|
|
|
// get altermative location mapping count
|
|
STDMETHOD(GetAlternateLocationMappingCount)(OUT UINT *pcMappings);
|
|
|
|
// get a paraticular alternative location mapping
|
|
STDMETHOD(GetAlternateLocationMapping)
|
|
(
|
|
IN UINT iMapping,
|
|
OUT IVssWMFiledesc **pFiledesc
|
|
);
|
|
|
|
// set the backup metadata for a component
|
|
STDMETHOD(SetBackupMetadata)(IN LPCWSTR wszData);
|
|
|
|
// get the backup metadata for a component
|
|
STDMETHOD(GetBackupMetadata)(OUT BSTR *pbstrData);
|
|
|
|
// indicate that only ranges in the file are to be backed up
|
|
STDMETHOD(AddPartialFile)
|
|
(
|
|
IN LPCWSTR wszPath,
|
|
IN LPCWSTR wszFilename,
|
|
IN LPCWSTR wszRanges,
|
|
IN LPCWSTR wszMetadata
|
|
);
|
|
|
|
// get count of partial file declarations
|
|
STDMETHOD(GetPartialFileCount)
|
|
(
|
|
OUT UINT *pcPartialFiles
|
|
);
|
|
|
|
// get a partial file declaration
|
|
STDMETHOD(GetPartialFile)
|
|
(
|
|
IN UINT iPartialFile,
|
|
OUT BSTR *pbstrPath,
|
|
OUT BSTR *pbstrFilename,
|
|
OUT BSTR *pbstrRange,
|
|
OUT BSTR *pbstrMetadata
|
|
);
|
|
|
|
// determine if the component is selected to be restored
|
|
STDMETHOD(IsSelectedForRestore)
|
|
(
|
|
IN bool *pbSelectedForRestore
|
|
);
|
|
|
|
|
|
STDMETHOD(GetAdditionalRestores)
|
|
(
|
|
OUT bool *pbAdditionalRestores
|
|
);
|
|
|
|
// get count of new target specifications
|
|
STDMETHOD(GetNewTargetCount)
|
|
(
|
|
OUT UINT *pcNewTarget
|
|
);
|
|
|
|
STDMETHOD(GetNewTarget)
|
|
(
|
|
IN UINT iNewTarget,
|
|
OUT IVssWMFiledesc **ppFiledesc
|
|
);
|
|
|
|
// add a directed target specification
|
|
STDMETHOD(AddDirectedTarget)
|
|
(
|
|
IN LPCWSTR wszSourcePath,
|
|
IN LPCWSTR wszSourceFilename,
|
|
IN LPCWSTR wszSourceRangeList,
|
|
IN LPCWSTR wszDestinationPath,
|
|
IN LPCWSTR wszDestinationFilename,
|
|
IN LPCWSTR wszDestinationRangeList
|
|
);
|
|
|
|
// get count of directed target specifications
|
|
STDMETHOD(GetDirectedTargetCount)
|
|
(
|
|
OUT UINT *pcDirectedTarget
|
|
);
|
|
|
|
// obtain a particular directed target specification
|
|
STDMETHOD(GetDirectedTarget)
|
|
(
|
|
IN UINT iDirectedTarget,
|
|
OUT BSTR *pbstrSourcePath,
|
|
OUT BSTR *pbstrSourceFileName,
|
|
OUT BSTR *pbstrSourceRangeList,
|
|
OUT BSTR *pbstrDestinationPath,
|
|
OUT BSTR *pbstrDestinationFilename,
|
|
OUT BSTR *pbstrDestinationRangeList
|
|
);
|
|
|
|
// set restore metadata associated with the component
|
|
STDMETHOD(SetRestoreMetadata)
|
|
(
|
|
IN LPCWSTR wszRestoreMetadata
|
|
);
|
|
|
|
// obtain restore metadata associated with the component
|
|
STDMETHOD(GetRestoreMetadata)
|
|
(
|
|
OUT BSTR *pbstrRestoreMetadata
|
|
);
|
|
|
|
// set the restore target
|
|
STDMETHOD(SetRestoreTarget)
|
|
(
|
|
IN VSS_RESTORE_TARGET target
|
|
);
|
|
|
|
// obtain the restore target
|
|
STDMETHOD(GetRestoreTarget)
|
|
(
|
|
OUT VSS_RESTORE_TARGET *pTarget
|
|
);
|
|
|
|
// set failure message during pre restore event
|
|
STDMETHOD(SetPreRestoreFailureMsg)
|
|
(
|
|
IN LPCWSTR wszPreRestoreFailureMsg
|
|
);
|
|
|
|
// obtain failure message during pre restore event
|
|
STDMETHOD(GetPreRestoreFailureMsg)
|
|
(
|
|
OUT BSTR *pbstrPreRestoreFailureMsg
|
|
);
|
|
|
|
// set the failure message during the post restore event
|
|
STDMETHOD(SetPostRestoreFailureMsg)
|
|
(
|
|
IN LPCWSTR wszPostRestoreFailureMsg
|
|
);
|
|
|
|
// obtain the failure message set during the post restore event
|
|
STDMETHOD(GetPostRestoreFailureMsg)
|
|
(
|
|
OUT BSTR *pbstrPostRestoreFailureMsg
|
|
);
|
|
|
|
// set the backup stamp of the backup
|
|
STDMETHOD(SetBackupStamp)
|
|
(
|
|
IN LPCWSTR wszBackupStamp
|
|
);
|
|
|
|
// obtain the stamp of the backup
|
|
STDMETHOD(GetBackupStamp)
|
|
(
|
|
OUT BSTR *pbstrBackupStamp
|
|
);
|
|
|
|
|
|
// obtain the backup stamp that the differential or incremental
|
|
// backup is baed on
|
|
STDMETHOD(GetPreviousBackupStamp)
|
|
(
|
|
OUT BSTR *pbstrBackupStamp
|
|
);
|
|
|
|
// obtain backup options for the writer
|
|
STDMETHOD(GetBackupOptions)
|
|
(
|
|
OUT BSTR *pbstrBackupOptions
|
|
);
|
|
|
|
// obtain the restore options
|
|
STDMETHOD(GetRestoreOptions)
|
|
(
|
|
IN BSTR *pbstrRestoreOptions
|
|
);
|
|
|
|
// obtain count of subcomponents to be restored
|
|
STDMETHOD(GetRestoreSubcomponentCount)
|
|
(
|
|
OUT UINT *pcRestoreSubcomponent
|
|
);
|
|
|
|
// obtain a particular subcomponent to be restored
|
|
STDMETHOD(GetRestoreSubcomponent)
|
|
(
|
|
UINT iComponent,
|
|
OUT BSTR *pbstrLogicalPath,
|
|
OUT BSTR *pbstrComponentName,
|
|
OUT bool *pbRepair
|
|
);
|
|
|
|
// obtain whether files were successfully restored
|
|
STDMETHOD(GetFileRestoreStatus)
|
|
(
|
|
OUT VSS_FILE_RESTORE_STATUS *pStatus
|
|
);
|
|
|
|
// add differenced files by last modify time
|
|
STDMETHOD(AddDifferencedFilesByLastModifyTime)
|
|
(
|
|
IN LPCWSTR wszPath,
|
|
IN LPCWSTR wszFilespec,
|
|
IN BOOL bRecursive,
|
|
IN FILETIME ftLastModifyTime
|
|
);
|
|
|
|
STDMETHOD(AddDifferencedFilesByLastModifyLSN)
|
|
(
|
|
IN LPCWSTR wszPath,
|
|
IN LPCWSTR wszFilespec,
|
|
IN BOOL bRecursive,
|
|
IN BSTR bstrLsnString
|
|
);
|
|
|
|
STDMETHOD(GetDifferencedFilesCount)
|
|
(
|
|
OUT UINT *pcDifferencedFiles
|
|
);
|
|
|
|
STDMETHOD(GetDifferencedFile)
|
|
(
|
|
IN UINT iDifferencedFile,
|
|
OUT BSTR *pbstrPath,
|
|
OUT BSTR *pbstrFilespec,
|
|
OUT BOOL *pbRecursive,
|
|
OUT BSTR *pbstrLsnString,
|
|
OUT FILETIME *pftLastModifyTime
|
|
);
|
|
|
|
// IUnknown methods
|
|
STDMETHOD(QueryInterface)(REFIID, void **);
|
|
|
|
STDMETHOD_ (ULONG, AddRef)();
|
|
|
|
STDMETHOD_ (ULONG, Release)();
|
|
private:
|
|
// common routine for setting backup and restore metadata
|
|
HRESULT SetMetadata(IN bool bRestoreMetadata, IN LPCWSTR bstrMetadata);
|
|
|
|
// common routine for adding differenced files
|
|
void AddDifferencedFiles
|
|
(
|
|
IN CVssFunctionTracer& ft,
|
|
IN LPCWSTR wszPath,
|
|
IN LPCWSTR wszFilespec,
|
|
IN BOOL bRecursive,
|
|
IN FILETIME ftLastModifyTime,
|
|
IN BSTR bstrLsnString
|
|
);
|
|
|
|
// common routine for retrieving backup and restore metadata
|
|
HRESULT GetMetadata(IN bool bRestoreMetadata, OUT BSTR *pbstrMetadata);
|
|
|
|
// get a particular element of a specific type as a file descriptor
|
|
HRESULT CVssComponent::GetFiledescElement
|
|
(
|
|
IN LPCWSTR wszElement,
|
|
IN UINT iMapping, // which mapping to select
|
|
OUT IVssWMFiledesc **ppFiledesc // output file descriptor
|
|
);
|
|
|
|
|
|
// reference count for AddRef, Release
|
|
LONG m_cRef;
|
|
|
|
// pointer to parent writer components document if changes are allowed
|
|
CVssWriterComponents *m_pWriterComponents;
|
|
|
|
// are we in the requestor
|
|
bool m_bInRequestor;
|
|
|
|
// are we in restore
|
|
bool m_bRestore;
|
|
};
|
|
|
|
// components associated with a specific writer
|
|
class CVssWriterComponents :
|
|
public CVssMetadataHelper,
|
|
public IVssWriterComponentsInt
|
|
{
|
|
public:
|
|
// constructor (can only be called from CVssBackupComponents)
|
|
CVssWriterComponents
|
|
(
|
|
IXMLDOMNode *pNode,
|
|
IXMLDOMDocument *pDoc,
|
|
bool bWriteable,
|
|
bool bRequestor,
|
|
bool bRestore
|
|
) :
|
|
CVssMetadataHelper(pNode, pDoc),
|
|
m_cRef(0),
|
|
m_bWriteable(bWriteable),
|
|
m_bChanged(false),
|
|
m_bInRequestor(bRequestor),
|
|
m_bRestore(bRestore)
|
|
{
|
|
}
|
|
|
|
// 2nd phase construction
|
|
void Initialize(CVssFunctionTracer &ft)
|
|
{
|
|
InitializeHelper(ft);
|
|
}
|
|
|
|
|
|
// get count of components
|
|
STDMETHOD(GetComponentCount)(OUT UINT *pcComponents);
|
|
|
|
// get information about the writer
|
|
STDMETHOD(GetWriterInfo)
|
|
(
|
|
OUT VSS_ID *pidInstance,
|
|
OUT VSS_ID *pidWriter
|
|
);
|
|
|
|
// obtain a specific component
|
|
STDMETHOD(GetComponent)
|
|
(
|
|
IN UINT iComponent,
|
|
OUT IVssComponent **ppComponent
|
|
);
|
|
|
|
STDMETHOD(IsChanged)
|
|
(
|
|
OUT bool *pbChanged
|
|
);
|
|
|
|
STDMETHOD(SaveAsXML)
|
|
(
|
|
OUT BSTR *pbstrXMLDocument
|
|
);
|
|
|
|
// initialize writer components document to point at writer components
|
|
// element
|
|
STDMETHOD(Initialize)(bool fFindToplevel);
|
|
|
|
|
|
STDMETHODIMP QueryInterface(REFIID, void **)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHOD_ (ULONG, AddRef)();
|
|
|
|
STDMETHOD_ (ULONG, Release)();
|
|
|
|
// indicate that document is changed
|
|
void SetChanged()
|
|
{
|
|
BS_ASSERT(m_bWriteable);
|
|
m_bChanged = TRUE;
|
|
}
|
|
|
|
private:
|
|
// reference count for AddRef, Release
|
|
LONG m_cRef;
|
|
|
|
// can components be changed
|
|
bool m_bWriteable;
|
|
|
|
// is document changed
|
|
bool m_bChanged;
|
|
|
|
// are we in the requestor
|
|
bool m_bInRequestor;
|
|
|
|
// are we in restore
|
|
bool m_bRestore;
|
|
};
|
|
|
|
|
|
|
|
// components associated with a specific writer
|
|
class CVssNULLWriterComponents :
|
|
public IVssWriterComponentsInt
|
|
{
|
|
public:
|
|
CVssNULLWriterComponents
|
|
(
|
|
VSS_ID idInstance,
|
|
VSS_ID idWriter
|
|
)
|
|
{
|
|
m_cRef = 0;
|
|
m_idInstance = idInstance;
|
|
m_idWriter = idWriter;
|
|
}
|
|
|
|
// initialize
|
|
STDMETHOD(Initialize)(bool fFindToplevel)
|
|
{
|
|
UNREFERENCED_PARAMETER(fFindToplevel);
|
|
return S_OK;
|
|
}
|
|
|
|
// get count of components
|
|
STDMETHOD(GetComponentCount)(OUT UINT *pcComponents);
|
|
|
|
// get information about the writer
|
|
STDMETHOD(GetWriterInfo)
|
|
(
|
|
OUT VSS_ID *pidInstance,
|
|
OUT VSS_ID *pidWriter
|
|
);
|
|
|
|
// obtain a specific component
|
|
STDMETHOD(GetComponent)
|
|
(
|
|
IN UINT iComponent,
|
|
OUT IVssComponent **ppComponent
|
|
);
|
|
|
|
STDMETHOD(IsChanged)
|
|
(
|
|
OUT bool *pbChanged
|
|
);
|
|
|
|
STDMETHOD(SaveAsXML)
|
|
(
|
|
OUT BSTR *pbstrXMLDocument
|
|
);
|
|
|
|
STDMETHODIMP QueryInterface(REFIID, void **)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHOD_ (ULONG, AddRef)();
|
|
|
|
STDMETHOD_ (ULONG, Release)();
|
|
|
|
private:
|
|
// id of writer class
|
|
VSS_ID m_idWriter;
|
|
|
|
// id of writer instance
|
|
VSS_ID m_idInstance;
|
|
|
|
// reference count for AddRef, Release
|
|
LONG m_cRef;
|
|
};
|
|
|
|
|
|
// state of CVssBackupComponents object
|
|
enum VSS_BACKUPCALL_STATE
|
|
{
|
|
x_StateUndefined = 0,
|
|
x_StateInitialized,
|
|
x_StateSnapshotSetCreated,
|
|
x_StatePrepareForBackup,
|
|
x_StatePrepareForBackupSucceeded,
|
|
x_StatePrepareForBackupFailed,
|
|
x_StateDoSnapshot,
|
|
x_StateDoSnapshotSucceeded,
|
|
x_StateDoSnapshotFailed,
|
|
x_StateBackupComplete,
|
|
x_StateBackupCompleteSucceeded,
|
|
x_StateBackupCompleteFailed,
|
|
x_StateAborting,
|
|
x_StateAborted,
|
|
x_StatePreRestore,
|
|
x_StatePreRestoreSucceeded,
|
|
x_StatePreRestoreFailed,
|
|
x_StatePostRestore,
|
|
x_StatePostRestoreSucceeded,
|
|
x_StatePostRestoreFailed,
|
|
x_StateGatheringWriterMetadata,
|
|
x_StateGatheringWriterStatus
|
|
};
|
|
|
|
|
|
// class used by the backup application to interact with the writer
|
|
class ATL_NO_VTABLE CVssBackupComponents :
|
|
public CComObjectRoot,
|
|
public IVssBackupComponents,
|
|
public CVssMetadataHelper,
|
|
public IDispatchImpl<IVssWriterCallback, &IID_IVssWriterCallback, &LIBID_VssEventLib, 1, 0>,
|
|
public IVssCoordinatorCallback
|
|
{
|
|
public:
|
|
friend class CVssAsyncBackup;
|
|
friend class CVssAsyncCover;
|
|
|
|
BEGIN_COM_MAP(CVssBackupComponents)
|
|
COM_INTERFACE_ENTRY(IDispatch)
|
|
COM_INTERFACE_ENTRY(IVssWriterCallback)
|
|
COM_INTERFACE_ENTRY(IVssCoordinatorCallback)
|
|
END_COM_MAP()
|
|
|
|
// constructor
|
|
CVssBackupComponents();
|
|
|
|
// destructor
|
|
~CVssBackupComponents();
|
|
|
|
// get count of writer components
|
|
STDMETHOD(GetWriterComponentsCount)(OUT UINT *pcComponents);
|
|
|
|
// obtain a specific writer component
|
|
STDMETHOD(GetWriterComponents)
|
|
(
|
|
IN UINT iWriter,
|
|
OUT IVssWriterComponentsExt **ppWriter
|
|
);
|
|
|
|
// initialize for backup
|
|
STDMETHOD(InitializeForBackup)(IN BSTR bstrXML = NULL);
|
|
|
|
// set backup state for backup components document
|
|
STDMETHOD(SetBackupState)
|
|
(
|
|
IN bool bSelectComponents,
|
|
IN bool bBackupBootableState,
|
|
IN VSS_BACKUP_TYPE backupType,
|
|
IN bool bPartialFileSupport
|
|
);
|
|
|
|
STDMETHOD(SetRestoreState)
|
|
(
|
|
IN VSS_RESTORE_TYPE restoreType
|
|
);
|
|
|
|
// initialize for restore
|
|
STDMETHOD(InitializeForRestore)
|
|
(
|
|
IN BSTR bstrXML
|
|
);
|
|
|
|
|
|
// gather writer metadata
|
|
STDMETHOD(GatherWriterMetadata)
|
|
(
|
|
OUT IVssAsync **ppAsync
|
|
);
|
|
|
|
// get count of writers
|
|
STDMETHOD(GetWriterMetadataCount)
|
|
(
|
|
OUT UINT *pcWriters
|
|
);
|
|
|
|
// get writer metadata for a specific writer
|
|
STDMETHOD(GetWriterMetadata)
|
|
(
|
|
IN UINT iWriter,
|
|
OUT VSS_ID *pidInstance,
|
|
OUT IVssExamineWriterMetadata **ppMetadata
|
|
);
|
|
|
|
// free XML data gathered from writers
|
|
STDMETHOD(FreeWriterMetadata)();
|
|
|
|
// Called to set the context for subsequent snapshot-related operations
|
|
STDMETHOD(SetContext)
|
|
(
|
|
IN LONG lContext
|
|
);
|
|
|
|
// start a snapshot set
|
|
STDMETHOD(StartSnapshotSet)
|
|
(
|
|
OUT VSS_ID *pSnapshotSetId
|
|
);
|
|
|
|
// add a volume to a snapshot set
|
|
STDMETHOD(AddToSnapshotSet)
|
|
(
|
|
IN VSS_PWSZ pwszVolumeName,
|
|
IN VSS_ID ProviderId,
|
|
OUT VSS_ID *pSnapshotId
|
|
);
|
|
|
|
// add a component to the BACKUP_COMPONENTS document
|
|
STDMETHOD(AddComponent)
|
|
(
|
|
IN VSS_ID instanceId,
|
|
IN VSS_ID writerId,
|
|
IN VSS_COMPONENT_TYPE ct,
|
|
IN LPCWSTR wszLogicalPath,
|
|
IN LPCWSTR wszComponentName
|
|
);
|
|
|
|
// dispatch PrepareForBackup event to writers
|
|
STDMETHOD(PrepareForBackup)
|
|
(
|
|
OUT IVssAsync **ppAsync
|
|
);
|
|
|
|
// create the snapshot set
|
|
STDMETHOD(DoSnapshotSet)
|
|
(
|
|
OUT IVssAsync** ppAsync
|
|
);
|
|
|
|
|
|
// abort the backup
|
|
STDMETHOD(AbortBackup)();
|
|
|
|
// dispatch the Identify event so writers can expose their metadata
|
|
STDMETHOD(GatherWriterStatus)
|
|
(
|
|
OUT IVssAsync **ppAsync
|
|
);
|
|
|
|
// get count of writers with status
|
|
STDMETHOD(GetWriterStatusCount)
|
|
(
|
|
OUT UINT *pcWriters
|
|
);
|
|
|
|
|
|
// obtain status information about writers
|
|
STDMETHOD(GetWriterStatus)
|
|
(
|
|
IN UINT iWriter,
|
|
OUT VSS_ID *pidInstance,
|
|
OUT VSS_ID *pidWriter,
|
|
OUT BSTR *pbstrWriterName,
|
|
OUT VSS_WRITER_STATE *pStatus,
|
|
OUT HRESULT *phrWriterFailure
|
|
);
|
|
|
|
// free data gathered using GetWriterStatus
|
|
STDMETHOD(FreeWriterStatus)();
|
|
|
|
// indicate whether backup succeeded on a component
|
|
STDMETHOD(SetBackupSucceeded)
|
|
(
|
|
IN VSS_ID instanceId,
|
|
IN VSS_ID writerId,
|
|
IN VSS_COMPONENT_TYPE ct,
|
|
IN LPCWSTR wszLogicalPath,
|
|
IN LPCWSTR wszComponentName,
|
|
IN bool bSucceded
|
|
);
|
|
|
|
// set backup options for the writer
|
|
STDMETHOD(SetBackupOptions)
|
|
(
|
|
IN VSS_ID writerId,
|
|
IN VSS_COMPONENT_TYPE ct,
|
|
IN LPCWSTR wszLogicalPath,
|
|
IN LPCWSTR wszComponentName,
|
|
IN LPCWSTR wszBackupOptions
|
|
);
|
|
|
|
// indicate that a given component is selected to be restored
|
|
STDMETHOD(SetSelectedForRestore)
|
|
(
|
|
IN VSS_ID writerId,
|
|
IN VSS_COMPONENT_TYPE ct,
|
|
IN LPCWSTR wszLogicalPath,
|
|
IN LPCWSTR wszComponentName,
|
|
IN bool bSelectedForRestore
|
|
);
|
|
|
|
|
|
// set restore options for the writer
|
|
STDMETHOD(SetRestoreOptions)
|
|
(
|
|
IN VSS_ID writerId,
|
|
IN VSS_COMPONENT_TYPE ct,
|
|
IN LPCWSTR wszLogicalPath,
|
|
IN LPCWSTR wszComponentName,
|
|
IN LPCWSTR wszRestoreOptions
|
|
);
|
|
|
|
// indicate that additional restores will follow
|
|
STDMETHOD(SetAdditionalRestores)
|
|
(
|
|
IN VSS_ID writerId,
|
|
IN VSS_COMPONENT_TYPE ct,
|
|
IN LPCWSTR wszLogicalPath,
|
|
IN LPCWSTR wszComponentName,
|
|
IN bool bAdditionalRestores
|
|
);
|
|
|
|
// requestor indicates whether files were successfully restored
|
|
STDMETHOD(SetFileRestoreStatus)
|
|
(
|
|
IN VSS_ID writerId,
|
|
IN VSS_COMPONENT_TYPE ct,
|
|
IN LPCWSTR wszLogicalPath,
|
|
IN LPCWSTR wszComponentName,
|
|
IN VSS_FILE_RESTORE_STATUS status
|
|
);
|
|
|
|
// add a new location target for a file to be restored
|
|
STDMETHOD(AddNewTarget)
|
|
(
|
|
IN VSS_ID writerId,
|
|
IN VSS_COMPONENT_TYPE ct,
|
|
IN LPCWSTR wszLogicalPath,
|
|
IN LPCWSTR wszComponentName,
|
|
IN LPCWSTR wszPath,
|
|
IN LPCWSTR wszFileName,
|
|
IN bool bRecursive,
|
|
IN LPCWSTR wszAlternatePath
|
|
) ;
|
|
|
|
// add a new location for the ranges file in case it was restored to
|
|
// a different location
|
|
STDMETHOD(SetRangesFilePath)
|
|
(
|
|
IN VSS_ID writerId,
|
|
IN VSS_COMPONENT_TYPE ct,
|
|
IN LPCWSTR wszLogicalPath,
|
|
IN LPCWSTR wszComponentName,
|
|
IN UINT iPartialFile,
|
|
IN LPCWSTR wszRangesFile
|
|
);
|
|
|
|
// set the backup stamp that the differential or incremental
|
|
// backup is based on
|
|
STDMETHOD(SetPreviousBackupStamp)
|
|
(
|
|
IN VSS_ID writerId,
|
|
IN VSS_COMPONENT_TYPE ct,
|
|
IN LPCWSTR wszLogicalPath,
|
|
IN LPCWSTR wszComponentName,
|
|
IN LPCWSTR wszPreviousBackupStamp
|
|
);
|
|
|
|
// delete a set of snapshots
|
|
STDMETHOD(DeleteSnapshots)
|
|
(
|
|
IN VSS_ID SourceObjectId,
|
|
IN VSS_OBJECT_TYPE eSourceObjectType,
|
|
IN BOOL bForceDelete,
|
|
IN LONG* plDeletedSnapshots,
|
|
IN VSS_ID* pNondeletedSnapshotID
|
|
);
|
|
|
|
// Break the snapshot set
|
|
STDMETHOD(BreakSnapshotSet)
|
|
(
|
|
IN VSS_ID SnapshotSetId
|
|
);
|
|
|
|
STDMETHOD(ImportSnapshots)
|
|
(
|
|
OUT IVssAsync** ppAsync
|
|
);
|
|
|
|
// Get snapshot properties
|
|
STDMETHOD(GetSnapshotProperties)
|
|
(
|
|
IN VSS_ID SnapshotId,
|
|
OUT VSS_SNAPSHOT_PROP *pProp
|
|
);
|
|
|
|
// do a generic query using the coordinator
|
|
STDMETHOD(Query)
|
|
(
|
|
IN VSS_ID QueriedObjectId,
|
|
IN VSS_OBJECT_TYPE eQueriedObjectType,
|
|
IN VSS_OBJECT_TYPE eReturnedObjectsType,
|
|
IN IVssEnumObject **ppEnum
|
|
);
|
|
|
|
|
|
// save BACKUP_COMPONENTS document as XML string
|
|
STDMETHOD(SaveAsXML)(BSTR *pbstrXML);
|
|
|
|
// signal BackupComplete event to the writers
|
|
STDMETHOD(BackupComplete)(OUT IVssAsync **ppAsync);
|
|
|
|
// add an alternate mapping on restore
|
|
STDMETHOD(AddAlternativeLocationMapping)
|
|
(
|
|
IN VSS_ID writerId,
|
|
IN VSS_COMPONENT_TYPE componentType,
|
|
IN LPCWSTR wszLogicalPath,
|
|
IN LPCWSTR wszComponentName,
|
|
IN LPCWSTR wszPath,
|
|
IN LPCWSTR wszFilespec,
|
|
IN bool bRecursive,
|
|
IN LPCWSTR wszDestination
|
|
);
|
|
|
|
// add a subcomponent to be restored
|
|
STDMETHOD(AddRestoreSubcomponent)
|
|
(
|
|
IN VSS_ID writerId,
|
|
IN VSS_COMPONENT_TYPE componentType,
|
|
IN LPCWSTR wszLogicalPath,
|
|
IN LPCWSTR wszComponentName,
|
|
IN LPCWSTR wszSubLogicalPath,
|
|
IN LPCWSTR wszSubComponentName,
|
|
IN bool bRepair
|
|
);
|
|
|
|
|
|
// signal PreRestore event to the writers
|
|
STDMETHOD(PreRestore)(OUT IVssAsync **ppAsync);
|
|
|
|
// signal PostRestore event to the writers
|
|
STDMETHOD(PostRestore)(OUT IVssAsync **ppAsync);
|
|
|
|
// IWriterCallback methods
|
|
|
|
// called by writer to expose its WRITER_METADATA XML document
|
|
STDMETHOD(ExposeWriterMetadata)
|
|
(
|
|
IN BSTR WriterInstanceId,
|
|
IN BSTR WriterClassId,
|
|
IN BSTR bstrWriterName,
|
|
IN BSTR strWriterXMLMetadata
|
|
);
|
|
|
|
// called by the writer to obtain the WRITER_COMPONENTS document for it
|
|
STDMETHOD(GetContent)
|
|
(
|
|
IN BSTR WriterInstanceId,
|
|
OUT BSTR* pbstrXMLDOMDocContent
|
|
);
|
|
|
|
// called by the writer to obtain the WRITER_COMPONENTS document for it
|
|
STDMETHOD(CoordGetContent)
|
|
(
|
|
IN BSTR WriterInstanceId,
|
|
IN ULONG cbSid,
|
|
IN BYTE *pbSid,
|
|
OUT BSTR* pbstrXMLDOMDocContent
|
|
);
|
|
|
|
|
|
// called by the writer to update the WRITER_COMPONENTS document for it
|
|
STDMETHOD(SetContent)
|
|
(
|
|
IN BSTR WriterInstanceId,
|
|
IN BSTR bstrXMLDOMDocContent
|
|
);
|
|
|
|
// called by the writer to update the WRITER_COMPONENTS document for it
|
|
STDMETHOD(CoordSetContent)
|
|
(
|
|
IN BSTR WriterInstanceId,
|
|
IN ULONG cbSid,
|
|
IN BYTE *pbSid,
|
|
IN BSTR bstrXMLDOMDocContent
|
|
);
|
|
|
|
|
|
// called by the writer to get information about the backup
|
|
STDMETHOD(GetBackupState)
|
|
(
|
|
OUT BOOL *pbBootableSystemStateBackedUp,
|
|
OUT BOOL *pbAreComponentsSelected,
|
|
OUT VSS_BACKUP_TYPE *pBackupType,
|
|
OUT BOOL *pbPartialFileSupport,
|
|
OUT LONG *plContext
|
|
);
|
|
|
|
// called by the writer to get information about the backup
|
|
STDMETHOD(CoordGetBackupState)
|
|
(
|
|
OUT BOOL *pbBootableSystemStateBackedUp,
|
|
OUT BOOL *pbAreComponentsSelected,
|
|
OUT VSS_BACKUP_TYPE *pBackupType,
|
|
OUT BOOL *pbPartialFileSupport,
|
|
OUT LONG *plContext
|
|
);
|
|
|
|
STDMETHOD(GetRestoreState)
|
|
(
|
|
OUT VSS_RESTORE_TYPE *pRestoreType
|
|
);
|
|
STDMETHOD(CoordGetRestoreState)
|
|
(
|
|
OUT VSS_RESTORE_TYPE *pRestoreType
|
|
);
|
|
|
|
// called by the writer to indicate its status
|
|
STDMETHOD(ExposeCurrentState)
|
|
(
|
|
IN BSTR WriterInstanceId,
|
|
IN VSS_WRITER_STATE nCurrentState,
|
|
IN HRESULT hrWriterFailure
|
|
);
|
|
|
|
// Called by the requestor to check if a certain volume is supported.
|
|
STDMETHOD(IsVolumeSupported)
|
|
(
|
|
IN VSS_ID ProviderId,
|
|
IN VSS_PWSZ pwszVolumeName,
|
|
IN BOOL * pbSupportedByThisProvider
|
|
);
|
|
|
|
// called to disable writer classes
|
|
STDMETHOD(DisableWriterClasses)
|
|
(
|
|
IN const VSS_ID *rgWriterClassId,
|
|
IN UINT cClassId
|
|
);
|
|
|
|
// called to enable specific writer classes. Note that once specific
|
|
// writer classes are enabled, only enabled classes are called.
|
|
STDMETHOD(EnableWriterClasses)
|
|
(
|
|
IN const VSS_ID *rgWriterClassId,
|
|
IN UINT cClassId
|
|
);
|
|
|
|
// called to disable an event call to a writer instance
|
|
STDMETHOD(DisableWriterInstances)
|
|
(
|
|
IN const VSS_ID *rgWriterInstanceId,
|
|
IN UINT cInstanceId
|
|
);
|
|
|
|
// called to expose a snapshot
|
|
STDMETHOD(ExposeSnapshot)
|
|
(
|
|
IN VSS_ID SnapshotId,
|
|
IN VSS_PWSZ wszPathFromRoot,
|
|
IN LONG lAttributes,
|
|
IN VSS_PWSZ wszExpose,
|
|
OUT VSS_PWSZ *pwszExposed
|
|
);
|
|
|
|
STDMETHOD(RevertToSnapshot)
|
|
(
|
|
IN VSS_ID SnapshotId,
|
|
IN BOOL bForceDismount
|
|
);
|
|
|
|
STDMETHOD(QueryRevertStatus)
|
|
(
|
|
IN VSS_PWSZ pwszVolume,
|
|
OUT IVssAsync **ppAsync
|
|
);
|
|
|
|
private:
|
|
|
|
// replace writer instance ids during restore to correspond
|
|
// to those found in writer metadata
|
|
void EnableWritersForRestore();
|
|
|
|
// determine if a writer component has components selected for
|
|
// restore
|
|
bool IsComponentSelectedForRestore();
|
|
|
|
// free XML component data gathered from writers
|
|
void FreeWriterComponents();
|
|
|
|
// validatate that the object has been initialized
|
|
void ValidateInitialized(CVssFunctionTracer &ft);
|
|
|
|
// basic initialization
|
|
void BasicInit(IN CVssFunctionTracer &ft);
|
|
|
|
// internal PrepareForBackup call
|
|
HRESULT InternalPrepareForBackup(volatile LONG& finishing);
|
|
|
|
// internal BackupComplete call
|
|
HRESULT InternalBackupComplete(volatile LONG& finishing);
|
|
|
|
// internal PreRestore call
|
|
HRESULT InternalPreRestore(volatile LONG& finishing);
|
|
|
|
// internal PostRestore call
|
|
HRESULT InternalPostRestore(volatile LONG& finishing);
|
|
|
|
|
|
// internal GatherWriterMetadata call
|
|
HRESULT InternalGatherWriterMetadata(volatile LONG& finishing);
|
|
|
|
// internal GatherWriterStatus call
|
|
HRESULT InternalGatherWriterStatus(volatile LONG& finishing);
|
|
|
|
// operation called at completion of GatherWriterMetadata
|
|
// both by InternalGatherWriterMetadata and IVssAsync::Cancel
|
|
HRESULT PostGatherWriterMetadata(volatile LONG& finishing, VSS_BACKUPCALL_STATE stateSaved, HRESULT hrSuccess,
|
|
bool bCheckRequiredWriters);
|
|
|
|
// called by IVssAsync::Cancel and InternalGatherWriterStatus
|
|
// at completion of GatherWriterStatus
|
|
HRESULT PostGatherWriterStatus(volatile LONG& finishing, VSS_BACKUPCALL_STATE stateSaved, HRESULT hrSuccess,
|
|
bool bCheckResponses);
|
|
|
|
// called by IVssAsync::Cancel and InternalPrepareForBackup
|
|
// at completion of PrepareForBackup
|
|
HRESULT PostPrepareForBackup(volatile LONG& finishing, HRESULT hrSuccess);
|
|
|
|
// called by IVssAsync::Cancel and InternalBackupComplete
|
|
// at completion of BackupComplete
|
|
HRESULT PostBackupComplete(volatile LONG& finishing, HRESULT hrSuccess);
|
|
|
|
// called by IVssAsync::Cancel and InternalPreRestore
|
|
// at completion of PostPreRestore
|
|
HRESULT PostPreRestore(volatile LONG& finishing, HRESULT hrSuccess);
|
|
|
|
// called by IVssAsync::Cancel and InternalPostRestore
|
|
// at completion of PostRestore
|
|
HRESULT PostPostRestore(volatile LONG& finishing, HRESULT hrSuccess);
|
|
|
|
|
|
// called by IVssAsync::Cancel and IVssAsync::QueryStatus
|
|
// at completion of DoSnapshotSet
|
|
HRESULT PostDoSnapshotSet(volatile LONG& finishing, bool bRebuild,
|
|
bool bFree, bool bSucceeded);
|
|
|
|
// Get an IVssCoordinator proxy for the current thread
|
|
// This performs internally an AddRef. It is caller responsibility to do a Release
|
|
void GetCoordinatorInterface(
|
|
IN CVssFunctionTracer &ft,
|
|
OUT CComPtr<IVssCoordinator> & ptrCoord // pass it by reference
|
|
);
|
|
|
|
// position on a WRITER_COMPONENTS element
|
|
CXMLNode PositionOnWriterComponents
|
|
(
|
|
IN CVssFunctionTracer &ft,
|
|
IN VSS_ID *pinstanceId,
|
|
IN VSS_ID writerId,
|
|
IN bool bCreateIfNotThere,
|
|
OUT bool &bCreated,
|
|
IN UINT uStartFromIndex = 0
|
|
) throw(HRESULT);
|
|
|
|
// position on/create a specific component,
|
|
CXMLNode FindComponent
|
|
(
|
|
IN CVssFunctionTracer &ft,
|
|
IN VSS_ID *pinstanceId,
|
|
IN VSS_ID writerId,
|
|
IN LPCWSTR wszComponentType,
|
|
IN LPCWSTR wszLogicalPath,
|
|
IN LPCWSTR wszComponentName,
|
|
IN bool bCreate
|
|
);
|
|
|
|
// rebuild component data after PrepareForBackup
|
|
void RebuildComponentData(IN CVssFunctionTracer &ft);
|
|
|
|
// get an IVssWriterCallback interface. Implements GetComponent
|
|
void GetCallbackInterface(CVssFunctionTracer &ft, IDispatch **ppDispatch);
|
|
|
|
// setup writers interface
|
|
void SetupWriter
|
|
(
|
|
CVssFunctionTracer &ft,
|
|
IVssWriter **ppWriter,
|
|
bool bMetadataFire
|
|
);
|
|
|
|
// add writer data to queue
|
|
HRESULT AddWriterData
|
|
(
|
|
BSTR WriterInstanceId,
|
|
BSTR WriterClassId,
|
|
BSTR WriterName,
|
|
BSTR bstrWriterXMLDocument,
|
|
bool bReinitializing
|
|
);
|
|
|
|
// add writer data to queue and validate using supplied sid
|
|
HRESULT AddWriterDataWithSid
|
|
(
|
|
BSTR WriterInstanceId,
|
|
PSID WriterSid,
|
|
BSTR bstrWriterXMLDocument
|
|
);
|
|
|
|
|
|
// get actual content for the instance
|
|
HRESULT DoGetContent
|
|
(
|
|
VSS_ID idInstance,
|
|
BSTR *pbstrXMLDocContent
|
|
);
|
|
|
|
|
|
// find writer data with a particular instance id
|
|
CInternalWriterData *FindWriterData
|
|
(
|
|
VSS_ID idInstance,
|
|
bool bIsWriterId,
|
|
UINT *piWriter = NULL
|
|
);
|
|
|
|
// find writer data and validate the sid
|
|
void FindAndValidateWriterData
|
|
(
|
|
IN VSS_ID idInstance,
|
|
bool bIsWriterId,
|
|
OUT UINT *piWriter
|
|
);
|
|
|
|
// find writer data and validate using supplied sid
|
|
void FindAndValidateWriterDataWithSid
|
|
(
|
|
IN VSS_ID idInstance,
|
|
IN PSID psid,
|
|
OUT UINT *piWriter
|
|
);
|
|
|
|
|
|
// free all data about all writers
|
|
void FreeAllWriters();
|
|
|
|
// trim writers that are not in the backup components document
|
|
void TrimWriters();
|
|
|
|
// add a writer class to the writer class array
|
|
void AddWriterClass(const VSS_ID &id);
|
|
|
|
// remove a writer class from the writer class array
|
|
void RemoveWriterClass(const VSS_ID &id);
|
|
|
|
// is a writer class disabled
|
|
bool IsWriterClassDisabled(const VSS_ID &id);
|
|
|
|
// is a writer instance disabled
|
|
bool IsWriterInstanceDisabled(const VSS_ID &id);
|
|
|
|
// load the components XML document
|
|
void LoadComponentsDocument(BSTR bstr);
|
|
|
|
// set snapshot set description (by coordinator)
|
|
HRESULT SetSnapshotSetDescription(LPCWSTR wszXML);
|
|
|
|
// semaphore to serialize access to state-changing operations in class
|
|
HANDLE m_hOperation;
|
|
|
|
// used to indicate when an operation can be canceled
|
|
HANDLE m_hCancelEvent;
|
|
|
|
// current state we are in in a callback situation
|
|
// protected by m_hOperation
|
|
VSS_BACKUPCALL_STATE m_state;
|
|
|
|
// snapshot id
|
|
CComBSTR m_bstrSnapshotSetId;
|
|
|
|
// GUID form of the snapshot set ID
|
|
VSS_ID m_guidSnapshotSetId;
|
|
|
|
// Global pointer to IGlobalInterfaceTable
|
|
CVssSafeComPtr<IVssCoordinator> m_spCoordinator;
|
|
|
|
// synchronization protecting m_pMetadataFirst and m_cWriters
|
|
CVssSafeCriticalSection m_csWriters;
|
|
|
|
// count of writers,
|
|
// protected by m_csWriters
|
|
UINT m_cWriters;
|
|
|
|
// # of writer instances
|
|
UINT m_cWriterInstances;
|
|
|
|
// array of writer instances participating in the backup
|
|
VSS_ID *m_rgWriterInstances;
|
|
|
|
// count of writer classes to exclude
|
|
UINT m_cWriterClasses;
|
|
|
|
// writer classes to exclude
|
|
VSS_ID *m_rgWriterClasses;
|
|
|
|
// writer data,
|
|
// protected by m_csWriters
|
|
CInternalWriterData *m_pDataFirst;
|
|
|
|
CComPtr<IVssWriterCallback> m_pCallback;
|
|
|
|
// writer properties in GatherWriterStatus, GetWriterStatus
|
|
VSS_WRITER_PROP *m_rgWriterProp;
|
|
|
|
// is this a restore
|
|
bool m_bRestore;
|
|
|
|
// has this structure been initialized
|
|
bool m_bInitialized;
|
|
|
|
// has gather writer metdata completed
|
|
bool m_bGatherWriterMetadataComplete;
|
|
|
|
// has gather writer status completed
|
|
bool m_bGatherWriterStatusComplete;
|
|
|
|
// has SetBackupState been called
|
|
bool m_bSetBackupStateCalled;
|
|
|
|
// are writer classes excluded or included
|
|
bool m_bIncludeWriterClasses;
|
|
|
|
bool m_bWritersInSequence;
|
|
|
|
// root node of document
|
|
CComPtr<IXMLDOMNode> m_pNodeRoot;
|
|
|
|
// context used
|
|
LONG m_lContext;
|
|
|
|
// encapsulates the list of writer sids that are allowed to call back into the class
|
|
CVssSidCollection m_SidCollection;
|
|
|
|
// Used to keep track the last writer-related events
|
|
CVssDiag m_diagnose;
|
|
|
|
// has gather writer metdata been called? Do not call it twice on the same instance (BUG# 650274)
|
|
bool m_bGatherWriterMetadataCalled;
|
|
};
|
|
|
|
class IVssLunInformation : public IUnknown
|
|
{
|
|
public:
|
|
STDMETHOD(SetLunBasicType)
|
|
(
|
|
IN UCHAR DeviceType,
|
|
IN UCHAR DeviceTypeModifier,
|
|
IN BOOL bCommandQueueing,
|
|
IN LPCSTR wszVendorId,
|
|
IN LPCSTR wszProductId,
|
|
IN LPCSTR wszProductRevision,
|
|
IN LPCSTR wszSerialNumber,
|
|
IN VDS_STORAGE_BUS_TYPE busType
|
|
) = 0;
|
|
|
|
STDMETHOD(GetLunBasicType)
|
|
(
|
|
OUT UCHAR *pDeviceType,
|
|
OUT UCHAR *pDeviceTypeModifier,
|
|
OUT BOOL *pbCommandQueueing,
|
|
OUT LPSTR *pstrVendorId,
|
|
OUT LPSTR *pstrProductId,
|
|
OUT LPSTR *pstrProductRevision,
|
|
OUT LPSTR *pstrSerialNumber,
|
|
OUT VDS_STORAGE_BUS_TYPE *pBusType
|
|
) = 0;
|
|
|
|
STDMETHOD(GetDiskSignature)
|
|
(
|
|
OUT VSS_ID *pidSignature
|
|
) = 0;
|
|
|
|
STDMETHOD(SetDiskSignature)
|
|
(
|
|
IN VSS_ID idSignature
|
|
) = 0;
|
|
|
|
STDMETHOD(AddInterconnectAddress)
|
|
(
|
|
IN VDS_INTERCONNECT_ADDRESS_TYPE type,
|
|
ULONG cbPort,
|
|
const BYTE *pbPort,
|
|
ULONG cbAddress,
|
|
const BYTE *pbAddress
|
|
) = 0;
|
|
|
|
STDMETHOD(GetInterconnectAddressCount)
|
|
(
|
|
OUT UINT *pcAddresses
|
|
) = 0;
|
|
|
|
STDMETHOD(GetInterconnectAddress)
|
|
(
|
|
IN UINT iAddress,
|
|
OUT VDS_INTERCONNECT_ADDRESS_TYPE *pType,
|
|
OUT ULONG *pcbPort,
|
|
OUT LPBYTE *ppbPort,
|
|
OUT ULONG *pcbAddress,
|
|
OUT LPBYTE *ppbAddress
|
|
) = 0;
|
|
|
|
STDMETHOD(SetStorageDeviceIdDescriptor)
|
|
(
|
|
IN STORAGE_DEVICE_ID_DESCRIPTOR *pDescriptor
|
|
) = 0;
|
|
|
|
|
|
STDMETHOD(GetStorageDeviceIdDescriptor)
|
|
(
|
|
OUT STORAGE_DEVICE_ID_DESCRIPTOR **ppDescriptor
|
|
) = 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
class IVssLunMapping : public IUnknown
|
|
{
|
|
public:
|
|
STDMETHOD(AddDiskExtent)
|
|
(
|
|
IN ULONGLONG startingOffset,
|
|
IN ULONGLONG length
|
|
) = 0;
|
|
|
|
STDMETHOD(GetDiskExtentCount)
|
|
(
|
|
OUT UINT *pcExtents
|
|
) = 0;
|
|
|
|
STDMETHOD(GetDiskExtent)
|
|
(
|
|
IN UINT iExtent,
|
|
OUT ULONGLONG *pllStartingOffset,
|
|
OUT ULONGLONG *pllLength
|
|
) = 0;
|
|
|
|
STDMETHOD(GetSourceDevice)
|
|
(
|
|
OUT BSTR *pbstrSourceDevice
|
|
) = 0;
|
|
|
|
STDMETHOD(SetSourceDevice)
|
|
(
|
|
IN LPCWSTR wszSourceDevice
|
|
) = 0;
|
|
|
|
|
|
STDMETHOD(GetSourceLun)
|
|
(
|
|
OUT IVssLunInformation **ppLun
|
|
) = 0;
|
|
|
|
STDMETHOD(GetDestinationLun)
|
|
(
|
|
OUT IVssLunInformation **ppLun
|
|
) = 0;
|
|
};
|
|
|
|
|
|
|
|
class IVssSnapshotDescription : public IUnknown
|
|
{
|
|
public:
|
|
STDMETHOD(GetSnapshotId)
|
|
(
|
|
OUT VSS_ID *pidSnapshot
|
|
) = 0;
|
|
|
|
STDMETHOD(GetProviderId)
|
|
(
|
|
OUT VSS_ID *pidProvider
|
|
) = 0;
|
|
|
|
STDMETHOD(GetTimestamp)
|
|
(
|
|
OUT VSS_TIMESTAMP *pTimestamp
|
|
) = 0;
|
|
|
|
STDMETHOD(SetTimestamp)
|
|
(
|
|
IN VSS_TIMESTAMP timestamp
|
|
) = 0;
|
|
|
|
STDMETHOD(GetAttributes)
|
|
(
|
|
OUT LONG *plAttributes
|
|
) = 0;
|
|
|
|
|
|
STDMETHOD(SetAttributes)
|
|
(
|
|
IN LONG lAttributes
|
|
) = 0;
|
|
|
|
STDMETHOD(GetOrigin)
|
|
(
|
|
OUT BSTR *pbstrOriginatingMachine,
|
|
OUT BSTR *pbstrOriginalVolume
|
|
) = 0;
|
|
|
|
STDMETHOD(SetOrigin)
|
|
(
|
|
IN LPCWSTR wszOriginatingMachine,
|
|
IN LPCWSTR wszOriginalVolume
|
|
) = 0;
|
|
|
|
STDMETHOD(IsDynamicVolume)
|
|
(
|
|
OUT bool *pbIsDynamic
|
|
) = 0;
|
|
|
|
STDMETHOD(SetIsDynamicVolume)
|
|
(
|
|
IN bool bIsDynamic
|
|
) = 0;
|
|
|
|
STDMETHOD(GetServiceMachine)
|
|
(
|
|
OUT BSTR *pbstrServiceMachine
|
|
) = 0;
|
|
|
|
STDMETHOD(SetServiceMachine)
|
|
(
|
|
IN LPCWSTR wszServiceMachine
|
|
) = 0;
|
|
|
|
STDMETHOD(GetDeviceName)
|
|
(
|
|
OUT BSTR *pbstrDeviceName
|
|
) = 0;
|
|
|
|
STDMETHOD(SetDeviceName)
|
|
(
|
|
IN LPCWSTR wszDeviceName
|
|
) = 0;
|
|
|
|
STDMETHOD(GetExposure)
|
|
(
|
|
OUT BSTR *pbstrExposedName,
|
|
OUT BSTR *pbstrExposedPath
|
|
) = 0;
|
|
|
|
STDMETHOD(SetExposure)
|
|
(
|
|
IN LPCWSTR wszExposedName,
|
|
IN LPCWSTR wszExposedPath
|
|
) = 0;
|
|
|
|
STDMETHOD(GetLunCount)
|
|
(
|
|
OUT UINT *pcLuns
|
|
) = 0;
|
|
|
|
STDMETHOD(AddLunMapping)
|
|
(
|
|
) = 0;
|
|
|
|
STDMETHOD(GetLunMapping)
|
|
(
|
|
UINT iMapping,
|
|
IVssLunMapping **pLunMapping
|
|
) = 0;
|
|
};
|
|
|
|
|
|
// description of a snapshot set
|
|
class IVssSnapshotSetDescription : public IUnknown
|
|
{
|
|
public:
|
|
STDMETHOD(SaveAsXML)
|
|
(
|
|
OUT BSTR *pbstrXML
|
|
) = 0;
|
|
|
|
STDMETHOD(GetToplevelNode)
|
|
(
|
|
OUT IXMLDOMNode **pNode,
|
|
OUT IXMLDOMDocument **ppDoc
|
|
) = 0;
|
|
|
|
STDMETHOD(GetSnapshotSetId)
|
|
(
|
|
OUT VSS_ID *pidSnapshotSet
|
|
) = 0;
|
|
|
|
STDMETHOD(GetDescription)
|
|
(
|
|
OUT BSTR *pbstrDescription
|
|
) = 0;
|
|
|
|
STDMETHOD(SetDescription)
|
|
(
|
|
IN LPCWSTR wszDescription
|
|
) = 0;
|
|
|
|
STDMETHOD(GetMetadata)
|
|
(
|
|
OUT BSTR *pbstrMetadata
|
|
) = 0;
|
|
|
|
STDMETHOD(SetMetadata)
|
|
(
|
|
IN LPCWSTR wszMetadata
|
|
) = 0;
|
|
|
|
STDMETHOD(GetContext)
|
|
(
|
|
OUT LONG *plContext
|
|
) = 0;
|
|
|
|
STDMETHOD(GetSnapshotCount)
|
|
(
|
|
OUT UINT *pcSnapshots
|
|
) = 0;
|
|
|
|
STDMETHOD(GetOriginalSnapshotCount)
|
|
(
|
|
OUT LONG *plSnapshotsCount
|
|
) = 0;
|
|
|
|
STDMETHOD(SetOriginalSnapshotCount)
|
|
(
|
|
IN LONG lSnapshotsCount
|
|
) = 0;
|
|
|
|
STDMETHOD(GetSnapshotDescription)
|
|
(
|
|
IN UINT iSnapshot,
|
|
OUT IVssSnapshotDescription **pSnapshot
|
|
) = 0;
|
|
|
|
STDMETHOD(FindSnapshotDescription)
|
|
(
|
|
IN VSS_ID SnapshotId,
|
|
OUT IVssSnapshotDescription **pSnapshot
|
|
) = 0;
|
|
|
|
|
|
STDMETHOD(AddSnapshotDescription)
|
|
(
|
|
IN VSS_ID idSnapshot,
|
|
IN VSS_ID idProvider
|
|
) = 0;
|
|
|
|
STDMETHOD(DeleteSnapshotDescription)
|
|
(
|
|
IN VSS_ID idSnapshot
|
|
) = 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class CVssSnapshotSetDescription :
|
|
public CVssMetadataHelper,
|
|
public IVssSnapshotSetDescription
|
|
{
|
|
public:
|
|
// constructor
|
|
CVssSnapshotSetDescription() :
|
|
m_cRef(0)
|
|
{
|
|
}
|
|
|
|
CVssSnapshotSetDescription
|
|
(
|
|
IXMLDOMNode *pNode,
|
|
IXMLDOMDocument *pDoc
|
|
) :
|
|
CVssMetadataHelper(pNode, pDoc),
|
|
m_cRef(0)
|
|
{
|
|
}
|
|
|
|
// 2nd phase of initialization
|
|
void Initialize(CVssFunctionTracer &ft)
|
|
{
|
|
InitializeHelper(ft);
|
|
}
|
|
|
|
void LoadFromXML(LPCWSTR wszXML);
|
|
|
|
STDMETHOD(SaveAsXML)
|
|
(
|
|
OUT BSTR *pbstrXML
|
|
);
|
|
|
|
STDMETHOD(GetToplevelNode)
|
|
(
|
|
IXMLDOMNode **ppNode,
|
|
IXMLDOMDocument **ppDoc
|
|
);
|
|
|
|
|
|
STDMETHOD(GetSnapshotSetId)
|
|
(
|
|
OUT VSS_ID *pidSnapshotSet
|
|
);
|
|
|
|
STDMETHOD(GetDescription)
|
|
(
|
|
OUT BSTR *pbstrDescription
|
|
);
|
|
|
|
STDMETHOD(SetDescription)
|
|
(
|
|
IN LPCWSTR wszDescription
|
|
);
|
|
|
|
STDMETHOD(GetMetadata)
|
|
(
|
|
OUT BSTR *pbstrMetadata
|
|
);
|
|
|
|
STDMETHOD(SetMetadata)
|
|
(
|
|
IN LPCWSTR wszMetadata
|
|
);
|
|
|
|
STDMETHOD(GetContext)
|
|
(
|
|
OUT LONG *plContext
|
|
);
|
|
|
|
STDMETHOD(GetSnapshotCount)
|
|
(
|
|
OUT UINT *pcSnapshots
|
|
);
|
|
|
|
STDMETHOD(GetOriginalSnapshotCount)
|
|
(
|
|
OUT LONG *pcSnapshots
|
|
);
|
|
|
|
STDMETHOD(SetOriginalSnapshotCount)
|
|
(
|
|
IN LONG cSnapshots
|
|
);
|
|
|
|
|
|
STDMETHOD(GetSnapshotDescription)
|
|
(
|
|
IN UINT iSnapshot,
|
|
OUT IVssSnapshotDescription **pSnapshot
|
|
);
|
|
|
|
STDMETHOD(FindSnapshotDescription)
|
|
(
|
|
IN VSS_ID SnapshotId,
|
|
OUT IVssSnapshotDescription **pSnapshot
|
|
);
|
|
|
|
|
|
STDMETHOD(AddSnapshotDescription)
|
|
(
|
|
IN VSS_ID idSnapshot,
|
|
IN VSS_ID idProvider
|
|
);
|
|
|
|
STDMETHOD(DeleteSnapshotDescription)
|
|
(
|
|
IN VSS_ID idSnapshot
|
|
);
|
|
|
|
|
|
|
|
// IUnknown methods
|
|
STDMETHOD(QueryInterface)(REFIID, void **);
|
|
|
|
STDMETHOD_ (ULONG, AddRef)();
|
|
|
|
STDMETHOD_ (ULONG, Release)();
|
|
|
|
private:
|
|
LONG m_cRef;
|
|
};
|
|
|
|
|
|
|
|
class CVssSnapshotDescription :
|
|
public CVssMetadataHelper,
|
|
public IVssSnapshotDescription
|
|
{
|
|
friend class CVssSnapshotSetDescription;
|
|
|
|
private:
|
|
// can only be called by CVssSnapshotSetDescription
|
|
CVssSnapshotDescription
|
|
(
|
|
IXMLDOMNode *pNode,
|
|
IXMLDOMDocument *pDoc
|
|
) :
|
|
CVssMetadataHelper(pNode, pDoc),
|
|
m_cRef(0)
|
|
{
|
|
}
|
|
|
|
// 2nd phase of initialization
|
|
void Initialize(CVssFunctionTracer &ft)
|
|
{
|
|
InitializeHelper(ft);
|
|
}
|
|
|
|
|
|
public:
|
|
STDMETHOD(GetSnapshotId)
|
|
(
|
|
OUT VSS_ID *pidSnapshot
|
|
);
|
|
|
|
STDMETHOD(GetProviderId)
|
|
(
|
|
OUT VSS_ID *pidProvider
|
|
);
|
|
|
|
STDMETHOD(GetTimestamp)
|
|
(
|
|
OUT VSS_TIMESTAMP *pTimestamp
|
|
);
|
|
|
|
STDMETHOD(SetTimestamp)
|
|
(
|
|
IN VSS_TIMESTAMP timestamp
|
|
);
|
|
|
|
STDMETHOD(GetAttributes)
|
|
(
|
|
OUT LONG *plAttributes
|
|
);
|
|
|
|
|
|
STDMETHOD(SetAttributes)
|
|
(
|
|
IN LONG lAttributes
|
|
);
|
|
|
|
STDMETHOD(GetOrigin)
|
|
(
|
|
OUT BSTR *pbstrOriginatingMachine,
|
|
OUT BSTR *pbstrOriginalVolume
|
|
);
|
|
|
|
STDMETHOD(SetOrigin)
|
|
(
|
|
IN LPCWSTR wszOriginatingMachine,
|
|
IN LPCWSTR wszOriginalVolume
|
|
);
|
|
|
|
STDMETHOD(IsDynamicVolume)
|
|
(
|
|
OUT bool *pbIsDynamic
|
|
);
|
|
|
|
STDMETHOD(SetIsDynamicVolume)
|
|
(
|
|
IN bool bIsDynamic
|
|
);
|
|
|
|
|
|
STDMETHOD(GetServiceMachine)
|
|
(
|
|
OUT BSTR *pbstrServiceMachine
|
|
);
|
|
|
|
STDMETHOD(SetServiceMachine)
|
|
(
|
|
IN LPCWSTR wszServiceMachine
|
|
);
|
|
|
|
STDMETHOD(GetDeviceName)
|
|
(
|
|
OUT BSTR *pbstrDeviceName
|
|
);
|
|
|
|
STDMETHOD(SetDeviceName)
|
|
(
|
|
IN LPCWSTR wszDeviceName
|
|
);
|
|
|
|
STDMETHOD(GetExposure)
|
|
(
|
|
OUT BSTR *pbstrExposedName,
|
|
OUT BSTR *pbstrExposedPath
|
|
);
|
|
|
|
STDMETHOD(SetExposure)
|
|
(
|
|
IN LPCWSTR wszExposedName,
|
|
IN LPCWSTR wszExposedPath
|
|
);
|
|
|
|
STDMETHOD(GetLunCount)
|
|
(
|
|
OUT UINT *pcLuns
|
|
);
|
|
|
|
STDMETHOD(AddLunMapping)
|
|
(
|
|
);
|
|
|
|
STDMETHOD(GetLunMapping)
|
|
(
|
|
UINT iMapping,
|
|
IVssLunMapping **ppLunMapping
|
|
);
|
|
|
|
// IUnknown methods
|
|
STDMETHOD(QueryInterface)(REFIID, void **);
|
|
|
|
STDMETHOD_ (ULONG, AddRef)();
|
|
|
|
STDMETHOD_ (ULONG, Release)();
|
|
|
|
|
|
private:
|
|
LONG m_cRef;
|
|
};
|
|
|
|
|
|
class CVssLunMapping :
|
|
public CVssMetadataHelper,
|
|
public IVssLunMapping
|
|
{
|
|
friend class CVssSnapshotDescription;
|
|
|
|
private:
|
|
// can only be called by CVssSnapshotDescription
|
|
CVssLunMapping
|
|
(
|
|
IXMLDOMNode *pNode,
|
|
IXMLDOMDocument *pDoc
|
|
) :
|
|
CVssMetadataHelper(pNode, pDoc),
|
|
m_cRef(0)
|
|
{
|
|
}
|
|
|
|
// 2nd phase of initialization
|
|
void Initialize(CVssFunctionTracer &ft)
|
|
{
|
|
InitializeHelper(ft);
|
|
}
|
|
|
|
|
|
public:
|
|
|
|
STDMETHOD(AddDiskExtent)
|
|
(
|
|
IN ULONGLONG startingOffset,
|
|
IN ULONGLONG length
|
|
);
|
|
|
|
STDMETHOD(GetDiskExtentCount)
|
|
(
|
|
OUT UINT *pcExtents
|
|
);
|
|
|
|
STDMETHOD(GetDiskExtent)
|
|
(
|
|
IN UINT iExtent,
|
|
OUT ULONGLONG *pllStartingOffset,
|
|
OUT ULONGLONG *pllLength
|
|
);
|
|
|
|
STDMETHOD(GetSourceDevice)
|
|
(
|
|
OUT BSTR *pbstrSourceDevice
|
|
);
|
|
|
|
STDMETHOD(SetSourceDevice)
|
|
(
|
|
IN LPCWSTR wszSourceDevice
|
|
);
|
|
|
|
|
|
STDMETHOD(GetSourceLun)
|
|
(
|
|
OUT IVssLunInformation **ppLun
|
|
);
|
|
|
|
STDMETHOD(GetDestinationLun)
|
|
(
|
|
OUT IVssLunInformation **ppLun
|
|
);
|
|
|
|
|
|
|
|
// IUnknown methods
|
|
STDMETHOD(QueryInterface)(REFIID, void **);
|
|
|
|
STDMETHOD_ (ULONG, AddRef)();
|
|
|
|
STDMETHOD_ (ULONG, Release)();
|
|
|
|
private:
|
|
|
|
HRESULT GetLunInformation
|
|
(
|
|
IN LPCWSTR wszElement,
|
|
OUT IVssLunInformation **ppLun
|
|
);
|
|
|
|
LONG m_cRef;
|
|
};
|
|
|
|
|
|
class CVssLunInformation :
|
|
public CVssMetadataHelper,
|
|
public IVssLunInformation
|
|
{
|
|
friend class CVssLunMapping;
|
|
|
|
private:
|
|
// can only be called by CVssLunMapping
|
|
CVssLunInformation
|
|
(
|
|
IXMLDOMNode *pNode,
|
|
IXMLDOMDocument *pDoc
|
|
) :
|
|
CVssMetadataHelper(pNode, pDoc),
|
|
m_cRef(0)
|
|
{
|
|
}
|
|
|
|
// 2nd phase of initialization
|
|
void Initialize(CVssFunctionTracer &ft)
|
|
{
|
|
InitializeHelper(ft);
|
|
}
|
|
|
|
|
|
public:
|
|
STDMETHOD(SetLunBasicType)
|
|
(
|
|
IN UCHAR DeviceType,
|
|
IN UCHAR DeviceTypeModifier,
|
|
IN BOOL bCommandQueueing,
|
|
IN LPCSTR szVendorId,
|
|
IN LPCSTR szProductId,
|
|
IN LPCSTR szProductRevision,
|
|
IN LPCSTR szSerialNumber,
|
|
IN VDS_STORAGE_BUS_TYPE busType
|
|
);
|
|
|
|
STDMETHOD(GetLunBasicType)
|
|
(
|
|
OUT UCHAR *pDeviceType,
|
|
OUT UCHAR *pDeviceTypeModifier,
|
|
OUT BOOL *pbCommandQueueing,
|
|
OUT LPSTR *pstrVendorId,
|
|
OUT LPSTR *pstrProductId,
|
|
OUT LPSTR *pstrProductRevision,
|
|
OUT LPSTR *pstrSerialNumber,
|
|
OUT VDS_STORAGE_BUS_TYPE *pBusType
|
|
);
|
|
|
|
STDMETHOD(GetDiskSignature)
|
|
(
|
|
OUT VSS_ID *pidSignature
|
|
);
|
|
|
|
STDMETHOD(SetDiskSignature)
|
|
(
|
|
IN VSS_ID idSignature
|
|
);
|
|
|
|
STDMETHOD(AddInterconnectAddress)
|
|
(
|
|
IN VDS_INTERCONNECT_ADDRESS_TYPE type,
|
|
IN ULONG cbPort,
|
|
IN const BYTE *pbPort,
|
|
IN ULONG cbAddress,
|
|
IN const BYTE *pbAddress
|
|
);
|
|
|
|
STDMETHOD(GetInterconnectAddressCount)
|
|
(
|
|
OUT UINT *pcAddresses
|
|
);
|
|
|
|
STDMETHOD(GetInterconnectAddress)
|
|
(
|
|
IN UINT iAddress,
|
|
OUT VDS_INTERCONNECT_ADDRESS_TYPE *pType,
|
|
OUT ULONG *pcbPort,
|
|
OUT LPBYTE *ppbPort,
|
|
OUT ULONG *pcbAddress,
|
|
OUT LPBYTE *ppbInterconnectAddress
|
|
);
|
|
|
|
STDMETHOD(SetStorageDeviceIdDescriptor)
|
|
(
|
|
IN STORAGE_DEVICE_ID_DESCRIPTOR *pDescriptor
|
|
);
|
|
|
|
STDMETHOD(GetStorageDeviceIdDescriptor)
|
|
(
|
|
OUT STORAGE_DEVICE_ID_DESCRIPTOR **ppDescriptor
|
|
);
|
|
|
|
// IUnknown methods
|
|
STDMETHOD(QueryInterface)(REFIID, void **);
|
|
|
|
STDMETHOD_ (ULONG, AddRef)();
|
|
|
|
STDMETHOD_ (ULONG, Release)();
|
|
|
|
private:
|
|
LONG m_cRef;
|
|
};
|
|
|
|
|
|
|
|
|
|
__declspec(dllexport)
|
|
HRESULT STDAPICALLTYPE CreateVssSnapshotSetDescription
|
|
(
|
|
IN VSS_ID idSnapshotSet,
|
|
IN LONG lContext,
|
|
OUT IVssSnapshotSetDescription **ppSnapshotSet
|
|
);
|
|
|
|
__declspec(dllexport)
|
|
HRESULT STDAPICALLTYPE LoadVssSnapshotSetDescription
|
|
(
|
|
IN LPCWSTR wszXML,
|
|
OUT IVssSnapshotSetDescription **ppSnapshotSet
|
|
);
|
|
|
|
|