blob: 0a7f2602c2f3c6c4525a6f7364391911d2f945aa [file] [log] [blame]
// Licensed under the Apache License, Version 2.0
// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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;
}