// Licensed under the Apache License, Version 2.0 // or the MIT license // , at your option. // All files in the project carrying such notice may not be copied, modified, or distributed // except according to those terms. //! Declaration of backup interfaces. use ctypes::c_void; use shared::guiddef::IID; use shared::minwindef::{BOOL, BYTE, DWORD, UINT}; use shared::wtypes::BSTR; use um::unknwnbase::{IUnknown, IUnknownVtbl}; use um::vss::{ IVssAsync, IVssEnumObject, VSS_BACKUP_TYPE, VSS_ID, VSS_OBJECT_TYPE, VSS_PWSZ, VSS_RESTORE_TYPE, VSS_ROLLFORWARD_TYPE, VSS_SNAPSHOT_PROP, VSS_WRITER_STATE }; use um::vswriter::{ IVssWMDependency, IVssWMFiledesc, IVssWriterComponentsVtbl, VSS_COMPONENT_TYPE, VSS_FILE_RESTORE_STATUS, VSS_RESTOREMETHOD_ENUM, VSS_SOURCE_TYPE, VSS_USAGE_TYPE, VSS_WRITERRESTORE_ENUM }; use um::winnt::{HRESULT, LONG, LPCWSTR}; DEFINE_GUID!{IID_IVssExamineWriterMetadata, 0x902fcf7f, 0xb7fd, 0x42f8, 0x81, 0xf1, 0xb2, 0xe4, 0x00, 0xb1, 0xe5, 0xbd} DEFINE_GUID!{IID_IVssExamineWriterMetadataEx, 0x0c0e5ec0, 0xca44, 0x472b, 0xb7, 0x02, 0xe6, 0x52, 0xdb, 0x1c, 0x04, 0x51} DEFINE_GUID!{IID_IVssBackupComponents, 0x665c1d5f, 0xc218, 0x414d, 0xa0, 0x5d, 0x7f, 0xef, 0x5f, 0x9d, 0x5c, 0x86} DEFINE_GUID!{IID_IVssBackupComponentsEx, 0x963f03ad, 0x9e4c, 0x4a34, 0xac, 0x15, 0xe4, 0xb6, 0x17, 0x4e, 0x50, 0x36} STRUCT!{struct VSS_COMPONENTINFO { type_: VSS_COMPONENT_TYPE, // type is a keyword in rust bstrLogicalPath: BSTR, bstrComponentName: BSTR, bstrCaption: BSTR, pbIcon: *mut BYTE, cbIcon: UINT, bRestoreMetadata: bool, bNotifyOnBackupComplete: bool, bSelectable: bool, bSelectableForRestore: bool, dwComponentFlags: DWORD, cFileCount: UINT, cDatabases: UINT, cLogFiles: UINT, cDependencies: UINT, }} pub type PVSSCOMPONENTINFO = *const VSS_COMPONENTINFO; RIDL!{#[uuid(0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)] interface IVssWMComponent(IVssWMComponentVtbl): IUnknown(IUnknownVtbl) { fn GetComponentInfo( ppInfo: *mut PVSSCOMPONENTINFO, ) -> HRESULT, fn FreeComponentInfo( pInfo: PVSSCOMPONENTINFO, ) -> HRESULT, fn GetFile( iFile: UINT, ppFiledesc: *mut *mut IVssWMFiledesc, ) -> HRESULT, fn GetDatabaseFile( iDBFile: UINT, ppFiledesc: *mut *mut IVssWMFiledesc, ) -> HRESULT, fn GetDatabaseLogFile( iDbLogFile: UINT, ppFiledesc: *mut *mut IVssWMFiledesc, ) -> HRESULT, fn GetDependency( iDependency: UINT, ppDependency: *mut *mut IVssWMDependency, ) -> HRESULT, }} RIDL!{#[uuid(0x902fcf7f, 0xb7fd, 0x42f8, 0x81, 0xf1, 0xb2, 0xe4, 0x00, 0xb1, 0xe5, 0xbd)] interface IVssExamineWriterMetadata(IVssExamineWriterMetadataVtbl): IUnknown(IUnknownVtbl) { fn GetIdentity( pidInstance: *mut VSS_ID, pidWriter: *mut VSS_ID, pbstrWriterName: *mut BSTR, pUsage: *mut VSS_USAGE_TYPE, pSource: *mut VSS_SOURCE_TYPE, ) -> HRESULT, fn GetFileCounts( pcIncludeFiles: *mut UINT, pcExcludeFiles: *mut UINT, pcComponents: *mut UINT, ) -> HRESULT, fn GetIncludeFile( iFile: UINT, ppFiledesc: *mut *mut IVssWMFiledesc, ) -> HRESULT, fn GetExcludeFile( iFile: UINT, ppFiledesc: *mut *mut IVssWMFiledesc, ) -> HRESULT, fn GetComponent( iComponent: UINT, ppComponent: *mut *mut IVssWMComponent, ) -> HRESULT, fn GetRestoreMethod( pMethod: *mut VSS_RESTOREMETHOD_ENUM, pbstrService: *mut BSTR, pbstrUserProcedure: *mut BSTR, pwriterRestore: *mut VSS_WRITERRESTORE_ENUM, pbRebootRequired: *mut bool, pcMappings: *mut UINT, ) -> HRESULT, fn GetAlternateLocationMapping( iMapping: UINT, ppFiledesc: *mut *mut IVssWMFiledesc, ) -> HRESULT, fn GetBackupSchema( pdwSchemaMask: *mut DWORD, ) -> HRESULT, fn GetDocument( pDoc: *mut c_void, ) -> HRESULT, //TODO IXMLDOMDocument, fn SaveAsXML( pbstrXML: *mut BSTR, ) -> HRESULT, fn LoadFromXML( pbstrXML: *mut BSTR, ) -> HRESULT, }} RIDL!{#[uuid(0x0c0e5ec0, 0xca44, 0x472b, 0xb7, 0x02, 0xe6, 0x52, 0xdb, 0x1c, 0x04, 0x51)] interface IVssExamineWriterMetadataEx(IVssExamineWriterMetadataExVtbl): IVssExamineWriterMetadata(IVssExamineWriterMetadataVtbl) { fn GetIdentityEx( pidInstance: *mut VSS_ID, pidWriter: *mut VSS_ID, pbstrWriterName: *mut BSTR, pbstrInstanceName: *mut BSTR, pUsage: *mut VSS_USAGE_TYPE, pSource: *mut VSS_SOURCE_TYPE, ) -> HRESULT, }} RIDL!{#[uuid(0xce115780, 0xa611, 0x431b, 0xb5, 0x7f, 0xc3, 0x83, 0x03, 0xab, 0x6a, 0xee)] interface IVssExamineWriterMetadataEx2(IVssExamineWriterMetadataEx2Vtbl): IVssExamineWriterMetadataEx(IVssExamineWriterMetadataExVtbl) { fn GetVersion( pdwMajorVersion: *mut DWORD, pdwMinorVersion: *mut DWORD, ) -> HRESULT, fn GetExcludeFromSnapshotCount( pcExcludedFromSnapshot: *mut UINT, ) -> HRESULT, fn GetExcludeFromSnapshotFile( iFile: UINT, ppFiledesc: *mut *mut IVssWMFiledesc, ) -> HRESULT, }} #[repr(C)] pub struct IVssWriterComponentsExt { pub lpVtbl: *const IVssWriterComponentsExtVtbl, } #[repr(C)] pub struct IVssWriterComponentsExtVtbl { pub parent1: IVssWriterComponentsVtbl, pub parent2: IUnknownVtbl, } RIDL!{#[uuid(0x665c1d5f, 0xc218, 0x414d, 0xa0, 0x5d, 0x7f, 0xef, 0x5f, 0x9d, 0x5c, 0x86)] interface IVssBackupComponents(IVssBackupComponentsVtbl): IUnknown(IUnknownVtbl) { fn GetWriterComponentsCount( pcComponents: *mut UINT, ) -> HRESULT, fn GetWriterComponents( iWriter: UINT, ppWriter: *mut *mut IVssWriterComponentsExt, ) -> HRESULT, fn InitializeForBackup( bstrXML: BSTR, ) -> HRESULT, fn SetBackupState( bSelectComponents: bool, bBackupBootableSystemState: bool, backupType: VSS_BACKUP_TYPE, bPartialFileSupport: bool, ) -> HRESULT, fn InitializeForRestore( bstrXML: BSTR, ) -> HRESULT, fn SetRestoreState( restoreType: VSS_RESTORE_TYPE, ) -> HRESULT, fn GatherWriterMetadata( pAsync: *mut *mut IVssAsync, ) -> HRESULT, fn GetWriterMetadataCount( pcWriters: *mut UINT, ) -> HRESULT, fn GetWriterMetadata( iWriter: UINT, pidInstance: *mut VSS_ID, ppMetadata: *mut *mut IVssExamineWriterMetadata, ) -> HRESULT, fn FreeWriterMetadata() -> HRESULT, fn AddComponent( instanceId: VSS_ID, writerId: VSS_ID, ct: VSS_COMPONENT_TYPE, wszLogicalPath: LPCWSTR, wszComponentName: LPCWSTR, ) -> HRESULT, fn PrepareForBackup( ppAsync: *mut *mut IVssAsync, ) -> HRESULT, fn AbortBackup() -> HRESULT, fn GatherWriterStatus( ppAsync: *mut *mut IVssAsync, ) -> HRESULT, fn GetWriterStatusCount( pcWriters: *mut UINT, ) -> HRESULT, fn FreeWriterStatus() -> HRESULT, fn GetWriterStatus( iWriter: UINT, pidInstance: *mut VSS_ID, pidWriter: *mut VSS_ID, pbstrWriter: *mut BSTR, pnStatus: *mut VSS_WRITER_STATE, phResultFailure: *mut HRESULT, ) -> HRESULT, fn SetBackupSucceeded( instanceId: VSS_ID, writerId: VSS_ID, ct: VSS_COMPONENT_TYPE, wszLogicalPath: LPCWSTR, wszComponentName: LPCWSTR, bSucceded: bool, ) -> HRESULT, fn SetBackupOptions( writerId: VSS_ID, ct: VSS_COMPONENT_TYPE, wszLogicalPath: LPCWSTR, wszComponentName: LPCWSTR, wszBackupOptions: LPCWSTR, ) -> HRESULT, fn SetSelectedForRestore( writerId: VSS_ID, ct: VSS_COMPONENT_TYPE, wszLogicalPath: LPCWSTR, wszComponentName: LPCWSTR, bSelectedForRestore: bool, ) -> HRESULT, fn SetRestoreOptions( writerId: VSS_ID, ct: VSS_COMPONENT_TYPE, wszLogicalPath: LPCWSTR, wszComponentName: LPCWSTR, wszRestoreOptions: LPCWSTR, ) -> HRESULT, fn SetAdditionalRestores( writerId: VSS_ID, ct: VSS_COMPONENT_TYPE, wszLogicalPath: LPCWSTR, wszComponentName: LPCWSTR, bAdditionalRestores: bool, ) -> HRESULT, fn SetPreviousBackupStamp( writerId: VSS_ID, ct: VSS_COMPONENT_TYPE, wszLogicalPath: LPCWSTR, wszComponentName: LPCWSTR, wszPreviousBackupStamp: LPCWSTR, ) -> HRESULT, fn SaveAsXML( pbstrXML: *mut BSTR, ) -> HRESULT, fn BackupComplete( ppAsync: *mut *mut IVssAsync, ) -> HRESULT, fn AddAlternativeLocationMapping( writerId: VSS_ID, ct: VSS_COMPONENT_TYPE, wszLogicalPath: LPCWSTR, wszComponentName: LPCWSTR, wszPath: LPCWSTR, wszFilespec: LPCWSTR, bRecursive: bool, wszDestination: LPCWSTR, ) -> HRESULT, fn AddRestoreSubcomponent( writerId: VSS_ID, ct: VSS_COMPONENT_TYPE, wszLogicalPath: LPCWSTR, wszComponentName: LPCWSTR, wszSubComponentLogicalPath: LPCWSTR, wszSubComponentName: LPCWSTR, bRepair: bool, ) -> HRESULT, fn SetFileRestoreStatus( writerId: VSS_ID, ct: VSS_COMPONENT_TYPE, wszLogicalPath: LPCWSTR, wszComponentName: LPCWSTR, status: VSS_FILE_RESTORE_STATUS, ) -> HRESULT, fn AddNewTarget( writerId: VSS_ID, ct: VSS_COMPONENT_TYPE, wszLogicalPath: LPCWSTR, wszComponentName: LPCWSTR, wszPath: LPCWSTR, wszFileName: LPCWSTR, bRecursive: bool, wszAlternatePath: LPCWSTR, ) -> HRESULT, fn SetRangesFilePath( writerId: VSS_ID, ct: VSS_COMPONENT_TYPE, wszLogicalPath: LPCWSTR, wszComponentName: LPCWSTR, iPartialFile: UINT, wszRangesFile: LPCWSTR, ) -> HRESULT, fn PreRestore( ppAsync: *mut *mut IVssAsync, ) -> HRESULT, fn PostRestore( ppAsync: *mut *mut IVssAsync, ) -> HRESULT, fn SetContext( lContext: LONG, ) -> HRESULT, fn StartSnapshotSet( pSnapshotSetId: *mut VSS_ID, ) -> HRESULT, fn AddToSnapshotSet( pwszVolumeName: VSS_PWSZ, ProviderId: VSS_ID, pidSnapshot: *mut VSS_ID, ) -> HRESULT, fn DoSnapshotSet( ppAsync: *mut *mut IVssAsync, ) -> HRESULT, fn DeleteSnapshots( SourceObjectId: VSS_ID, eSourceObjectType: VSS_OBJECT_TYPE, bForceDelete: BOOL, plDeletedSnapshots: *mut LONG, pNondeletedSnapshotID: *mut VSS_ID, ) -> HRESULT, fn ImportSnapshots( ppAsync: *mut *mut IVssAsync, ) -> HRESULT, fn BreakSnapshotSet( SnapshotSetId: VSS_ID, ) -> HRESULT, fn GetSnapshotProperties( SnapshotId: VSS_ID, pProp: *mut VSS_SNAPSHOT_PROP, ) -> HRESULT, fn Query( QueriedObjectId: VSS_ID, eQueriedObjectType: VSS_OBJECT_TYPE, eReturnedObjectsType: VSS_OBJECT_TYPE, ppEnum: *mut *mut IVssEnumObject, ) -> HRESULT, fn IsVolumeSupported( ProviderId: VSS_ID, pwszVolumeName: VSS_PWSZ, pbSupportedByThisProvider: *mut BOOL, ) -> HRESULT, fn DisableWriterClasses( rgWriterClassId: *const VSS_ID, cClassId: UINT, ) -> HRESULT, fn EnableWriterClasses( rgWriterClassId: *const VSS_ID, cClassId: UINT, ) -> HRESULT, fn DisableWriterInstances( rgWriterInstanceId: *const VSS_ID, cInstanceId: UINT, ) -> HRESULT, fn ExposeSnapshot( SnapshotId: VSS_ID, wszPathFromRoot: VSS_PWSZ, lAttributes: LONG, wszExpose: VSS_PWSZ, pwszExposed: VSS_PWSZ, ) -> HRESULT, fn RevertToSnapshot( SnapshotId: VSS_ID, bForceDismount: BOOL, ) -> HRESULT, fn QueryRevertStatus( pwszVolume: VSS_PWSZ, ppAsync: *mut *mut IVssAsync, ) -> HRESULT, }} RIDL!{#[uuid(0x963f03ad, 0x9e4c, 0x4a34, 0xac, 0x15, 0xe4, 0xb6, 0x17, 0x4e, 0x50, 0x36)] interface IVssBackupComponentsEx(IVssBackupComponentsExVtbl): IVssBackupComponents(IVssBackupComponentsVtbl) { fn GetWriterMetadataEx( iWriter: UINT, pidInstance: *mut VSS_ID, ppMetadata: *mut *mut IVssExamineWriterMetadataEx, ) -> HRESULT, fn SetSelectedForRestoreEx( writerId: VSS_ID, ct: VSS_COMPONENT_TYPE, wszLogicalPath: LPCWSTR, wszComponentName: LPCWSTR, bSelectedForRestore: bool, instanceId: VSS_ID, ) -> HRESULT, }} RIDL!{#[uuid(0xacfe2b3a, 0x22c9, 0x4ef8, 0xbd, 0x03, 0x2f, 0x9c, 0xa2, 0x30, 0x08, 0x4e)] interface IVssBackupComponentsEx2(IVssBackupComponentsEx2Vtbl): IVssBackupComponentsEx(IVssBackupComponentsExVtbl) { fn UnexposeSnapshot( snapshotId: VSS_ID, ) -> HRESULT, fn SetAuthoritativeRestore( writerId: VSS_ID, ct: VSS_COMPONENT_TYPE, wszLogicalPath: LPCWSTR, wszComponentName: LPCWSTR, bAuth: bool, ) -> HRESULT, fn SetRollForward( writerId: VSS_ID, ct: VSS_COMPONENT_TYPE, wszLogicalPath: LPCWSTR, wszComponentName: LPCWSTR, rollType: VSS_ROLLFORWARD_TYPE, wszRollForwardPoint: LPCWSTR, ) -> HRESULT, fn SetRestoreName( writerId: VSS_ID, ct: VSS_COMPONENT_TYPE, wszLogicalPath: LPCWSTR, wszComponentName: LPCWSTR, wszRestoreName: LPCWSTR, ) -> HRESULT, fn BreakSnapshotSetEx( SnapshotSetID: VSS_ID, dwBreakFlags: DWORD, ppAsync: *mut *mut IVssAsync, ) -> HRESULT, fn PreFastRecovery( SnapshotSetID: VSS_ID, dwPreFastRecoveryFlags: DWORD, ppAsync: *mut *mut IVssAsync, ) -> HRESULT, fn FastRecovery( SnapshotSetID: VSS_ID, dwFastRecoveryFlags: DWORD, ppAsync: *mut *mut IVssAsync, ) -> HRESULT, }} RIDL!{#[uuid(0xc191bfbc, 0xb602, 0x4675, 0x8b, 0xd1, 0x67, 0xd6, 0x42, 0xf5, 0x29, 0xd5)] interface IVssBackupComponentsEx3(IVssBackupComponentsEx3Vtbl): IVssBackupComponentsEx2(IVssBackupComponentsEx2Vtbl) { fn GetWriterStatusEx( iWriter: UINT, pidInstance: *mut VSS_ID, pidWriter: *mut VSS_ID, pbstrWriter: *mut BSTR, pnStatus: *mut VSS_WRITER_STATE, phrFailureWriter: *mut HRESULT, phrApplication: *mut HRESULT, pbstrApplicationMessage: *mut BSTR, ) -> HRESULT, fn AddSnapshotToRecoverySet( snapshotId: VSS_ID, dwFlags: DWORD, pwszDestinationVolume: VSS_PWSZ, ) -> HRESULT, fn RecoverSet( dwFlags: DWORD, ppAsync: *mut *mut IVssAsync, ) -> HRESULT, fn GetSessionId( idSession: *mut VSS_ID, ) -> HRESULT, }} RIDL!{#[uuid(0xf434c2fd, 0xb553, 0x4961, 0xa9, 0xf9, 0xa8, 0xe9, 0x0b, 0x67, 0x3e, 0x53)] interface IVssBackupComponentsEx4(IVssBackupComponentsEx4Vtbl): IVssBackupComponentsEx3(IVssBackupComponentsEx3Vtbl) { fn GetRootAndLogicalPrefixPaths( pwszFilePath: VSS_PWSZ, ppwszRootPath: *mut VSS_PWSZ, ppwszLogicalPrefix: *mut VSS_PWSZ, bNormalizeFQDNforRootPath: BOOL, ) -> HRESULT, }} pub const VSS_SW_BOOTABLE_STATE: DWORD = 1; extern "system" { #[link_name="CreateVssBackupComponentsInternal"] pub fn CreateVssBackupComponents( ppBackup: *mut *mut IVssBackupComponents, ) -> HRESULT; #[link_name="CreateVssExamineWriterMetadataInternal"] pub fn CreateVssExamineWriterMetadata( bstrXML: BSTR, ppMetadata: *mut *mut IVssExamineWriterMetadata, ) -> HRESULT; #[link_name="IsVolumeSnapshottedInternal"] pub fn IsVolumeSnapshotted( pwszVolumeName: VSS_PWSZ, pbSnapshotsPresent: *mut BOOL, plSnapshotCapability: *mut LONG, ) -> HRESULT; #[link_name="VssFreeSnapshotPropertiesInternal"] pub fn VssFreeSnapshotProperties( pProp: *mut VSS_SNAPSHOT_PROP, ); #[link_name="GetProviderMgmtInterfaceInternal"] pub fn GetProviderMgmtInterface( ProviderId: VSS_ID, InterfaceId: IID, ppItf: *mut *mut IUnknown, ) -> HRESULT; #[link_name="ShouldBlockRevertInternal"] pub fn ShouldBlockRevert( wszVolumeName: LPCWSTR, pbBlock: *mut bool, ) -> HRESULT; }