/*++ Copyright (c) Microsoft Corporation. All rights reserved. Module Name: vsbackup.h Abstract: Declaration of backup interfaces IVssExamineWriterMetadata and IVssBackupComponents, IVssWMComponent Brian Berkowitz [brianb] 3/13/2000 TBD: Add comments. Revision History: Name Date Comments brianb 03/30/2000 Created brianb 04/18/2000 Added IVssCancelCallback brianb 05/03/2000 Changed IVssWriter::Initialize method brianb 05/16/2000 Remove cancel stuff mikejohn 05/24/2000 Changed parameters on SimulateXxxx() calls mikejohn 09/18/2000 176860: Added calling convention methods where missing ssteiner 11/10/2000 143801 MOve SimulateSnashotXxxx() calls to be hosted by VssSvc --*/ #ifndef _VSBACKUP_H_ #define _VSBACKUP_H_ // description of a component typedef struct _VSS_COMPONENTINFO { VSS_COMPONENT_TYPE type; // either VSS_CT_DATABASE or VSS_CT_FILEGROUP BSTR bstrLogicalPath; // logical path to component BSTR bstrComponentName; // component name BSTR bstrCaption; // description of component BYTE *pbIcon; // icon UINT cbIcon; // icon bool bRestoreMetadata; // whether component supplies restore metadata bool bNotifyOnBackupComplete; // whether component needs to be informed if backup was successful bool bSelectable; // is component selectable bool bSelectableForRestore; // is component selectable for restore DWORD dwComponentFlags; // extra attribute flags for the component UINT cFileCount; // # of files in file group UINT cDatabases; // # of database files UINT cLogFiles; // # of log files UINT cDependencies; // # of components that this component depends on } VSS_COMPONENTINFO; typedef const VSS_COMPONENTINFO *PVSSCOMPONENTINFO; // component information class IVssWMComponent : public IUnknown { public: // get component information STDMETHOD(GetComponentInfo)(PVSSCOMPONENTINFO *ppInfo) = 0; // free component information STDMETHOD(FreeComponentInfo)(PVSSCOMPONENTINFO pInfo) = 0; // obtain a specific file in a file group STDMETHOD(GetFile) ( IN UINT iFile, OUT IVssWMFiledesc **ppFiledesc ) = 0; // obtain a specific physical database file for a database STDMETHOD(GetDatabaseFile) ( IN UINT iDBFile, OUT IVssWMFiledesc **ppFiledesc ) = 0; // obtain a specific physical log file for a database STDMETHOD(GetDatabaseLogFile) ( IN UINT iDbLogFile, OUT IVssWMFiledesc **ppFiledesc ) = 0; STDMETHOD(GetDependency) ( IN UINT iDependency, OUT IVssWMDependency **ppDependency ) = 0; }; // interface to examine writer metadata class IVssExamineWriterMetadata : public IUnknown { public: // obtain identity of the writer STDMETHOD(GetIdentity) ( OUT VSS_ID *pidInstance, OUT VSS_ID *pidWriter, OUT BSTR *pbstrWriterName, OUT VSS_USAGE_TYPE *pUsage, OUT VSS_SOURCE_TYPE *pSource ) = 0; // obtain number of include files, exclude files, and components STDMETHOD(GetFileCounts) ( OUT UINT *pcIncludeFiles, OUT UINT *pcExcludeFiles, OUT UINT *pcComponents ) = 0; // obtain specific include files STDMETHOD(GetIncludeFile) ( IN UINT iFile, OUT IVssWMFiledesc **ppFiledesc ) = 0; // obtain specific exclude files STDMETHOD(GetExcludeFile) ( IN UINT iFile, OUT IVssWMFiledesc **ppFiledesc ) = 0; // obtain specific component STDMETHOD(GetComponent) ( IN UINT iComponent, OUT IVssWMComponent **ppComponent ) = 0; // obtain restoration method STDMETHOD(GetRestoreMethod) ( OUT VSS_RESTOREMETHOD_ENUM *pMethod, OUT BSTR *pbstrService, OUT BSTR *pbstrUserProcedure, OUT VSS_WRITERRESTORE_ENUM *pwriterRestore, OUT bool *pbRebootRequired, UINT *pcMappings ) = 0; // obtain a specific alternative location mapping STDMETHOD(GetAlternateLocationMapping) ( IN UINT iMapping, OUT IVssWMFiledesc **ppFiledesc ) = 0; // get the backup schema STDMETHOD(GetBackupSchema) ( OUT DWORD *pdwSchemaMask ) = 0; // obtain reference to actual XML document STDMETHOD(GetDocument)(IXMLDOMDocument **pDoc) = 0; // convert document to a XML string STDMETHOD(SaveAsXML)(BSTR *pbstrXML) = 0; // load document from an XML string STDMETHOD(LoadFromXML)(BSTR bstrXML) = 0; }; class IVssWriterComponentsExt : public IVssWriterComponents, public IUnknown { }; // backup components interface class IVssBackupComponents : public IUnknown { public: // get count of writer components STDMETHOD(GetWriterComponentsCount)(OUT UINT *pcComponents) = 0; // obtain a specific writer component STDMETHOD(GetWriterComponents) ( IN UINT iWriter, OUT IVssWriterComponentsExt **ppWriter ) = 0; // initialize and create BACKUP_COMPONENTS document STDMETHOD(InitializeForBackup)(IN BSTR bstrXML = NULL) = 0; // set state describing backup STDMETHOD(SetBackupState) ( IN bool bSelectComponents, IN bool bBackupBootableSystemState, IN VSS_BACKUP_TYPE backupType, IN bool bPartialFileSupport = false ) = 0; STDMETHOD(InitializeForRestore)(IN BSTR bstrXML) = 0; // set state describing restore STDMETHOD(SetRestoreState) ( VSS_RESTORE_TYPE restoreType ) = 0; // gather writer metadata STDMETHOD(GatherWriterMetadata) ( OUT IVssAsync **pAsync ) = 0; // get count of writers with metadata STDMETHOD(GetWriterMetadataCount) ( OUT UINT *pcWriters ) = 0; // get writer metadata for a specific writer STDMETHOD(GetWriterMetadata) ( IN UINT iWriter, OUT VSS_ID *pidInstance, OUT IVssExamineWriterMetadata **ppMetadata ) = 0; // free writer metadata STDMETHOD(FreeWriterMetadata)() = 0; // 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 ) = 0; // dispatch PrepareForBackup event to writers STDMETHOD(PrepareForBackup) ( OUT IVssAsync **ppAsync ) = 0; // abort the backup STDMETHOD(AbortBackup)() = 0; // dispatch the Identify event so writers can expose their metadata STDMETHOD(GatherWriterStatus) ( OUT IVssAsync **pAsync ) = 0; // get count of writers with status STDMETHOD(GetWriterStatusCount) ( OUT UINT *pcWriters ) = 0; STDMETHOD(FreeWriterStatus)() = 0; STDMETHOD(GetWriterStatus) ( IN UINT iWriter, OUT VSS_ID *pidInstance, OUT VSS_ID *pidWriter, OUT BSTR *pbstrWriter, OUT VSS_WRITER_STATE *pnStatus, OUT HRESULT *phResultFailure ) = 0; // 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 ) = 0; // 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 ) = 0; // 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 ) = 0; // 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 ) = 0; // 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 ) = 0; // 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 ) = 0; // save BACKUP_COMPONENTS document as XML string STDMETHOD(SaveAsXML)(BSTR *pbstrXML) = 0; // signal BackupComplete event to the writers STDMETHOD(BackupComplete)(OUT IVssAsync **ppAsync) = 0; // 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 ) = 0; // 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 wszSubComponentLogicalPath, IN LPCWSTR wszSubComponentName, IN bool bRepair ) = 0; // 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 ) = 0; // 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 ) = 0; // 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 ) = 0; // signal PreRestore event to the writers STDMETHOD(PreRestore)(OUT IVssAsync **ppAsync) = 0; // signal PostRestore event to the writers STDMETHOD(PostRestore)(OUT IVssAsync **ppAsync) = 0; // Called to set the context for subsequent snapshot-related operations STDMETHOD(SetContext) ( IN LONG lContext ) = 0; // start a snapshot set STDMETHOD(StartSnapshotSet) ( OUT VSS_ID *pSnapshotSetId ) = 0; // add a volume to a snapshot set STDMETHOD(AddToSnapshotSet) ( IN VSS_PWSZ pwszVolumeName, IN VSS_ID ProviderId, OUT VSS_ID *pidSnapshot ) = 0; // create the snapshot set STDMETHOD(DoSnapshotSet) ( OUT IVssAsync** ppAsync ) = 0; STDMETHOD(DeleteSnapshots) ( IN VSS_ID SourceObjectId, IN VSS_OBJECT_TYPE eSourceObjectType, IN BOOL bForceDelete, IN LONG* plDeletedSnapshots, IN VSS_ID* pNondeletedSnapshotID ) = 0; STDMETHOD(ImportSnapshots) ( OUT IVssAsync** ppAsync ) = 0; STDMETHOD(BreakSnapshotSet) ( IN VSS_ID SnapshotSetId ) = 0; STDMETHOD(GetSnapshotProperties) ( IN VSS_ID SnapshotId, OUT VSS_SNAPSHOT_PROP *pProp ) = 0; STDMETHOD(Query) ( IN VSS_ID QueriedObjectId, IN VSS_OBJECT_TYPE eQueriedObjectType, IN VSS_OBJECT_TYPE eReturnedObjectsType, IN IVssEnumObject **ppEnum ) = 0; STDMETHOD(IsVolumeSupported) ( IN VSS_ID ProviderId, IN VSS_PWSZ pwszVolumeName, IN BOOL * pbSupportedByThisProvider ) = 0; STDMETHOD(DisableWriterClasses) ( IN const VSS_ID *rgWriterClassId, IN UINT cClassId ) = 0; STDMETHOD(EnableWriterClasses) ( IN const VSS_ID *rgWriterClassId, IN UINT cClassId ) = 0; STDMETHOD(DisableWriterInstances) ( IN const VSS_ID *rgWriterInstanceId, IN UINT cInstanceId ) = 0; // 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 ) = 0; STDMETHOD(RevertToSnapshot) ( IN VSS_ID SnapshotId, IN BOOL bForceDismount ) = 0; STDMETHOD(QueryRevertStatus) ( IN VSS_PWSZ pwszVolume, OUT IVssAsync **ppAsync ) = 0; }; __declspec(dllexport) HRESULT STDAPICALLTYPE CreateVssBackupComponents( OUT IVssBackupComponents **ppBackup ); __declspec(dllexport) HRESULT STDAPICALLTYPE CreateVssExamineWriterMetadata ( IN BSTR bstrXML, OUT IVssExamineWriterMetadata **ppMetadata ); #define VSS_SW_BOOTABLE_STATE (1 << 0) __declspec(dllexport) HRESULT APIENTRY SimulateSnapshotFreeze ( IN GUID guidSnapshotSetId, IN ULONG ulOptionFlags, IN ULONG ulVolumeCount, IN LPWSTR *ppwszVolumeNamesArray, OUT IVssAsync **ppAsync ); __declspec(dllexport) HRESULT APIENTRY SimulateSnapshotThaw( IN GUID guidSnapshotSetId ); __declspec(dllexport) HRESULT APIENTRY IsVolumeSnapshotted( IN VSS_PWSZ pwszVolumeName, OUT BOOL *pbSnapshotsPresent, OUT LONG *plSnapshotCapability ); ///////////////////////////////////////////////////////////////////// // Life-management methods for structure members __declspec(dllexport) void APIENTRY VssFreeSnapshotProperties( IN VSS_SNAPSHOT_PROP* pProp ); /// #endif // _VSBACKUP_H_