//////////////////////////////////////////////////////////////////////////////
//
//	Copyright (c) 2000-2001 Microsoft Corporation
//



///////////////////////////////////////////////////////////////////////////////
//	Imports
//


import "oaidl.idl";
import "ocidl.idl";


///////////////////////////////////////////////////////////////////////////////
// Forward declarations
//

interface IVssEnumObject;

// interfaces supported by the provider
interface IVssSnapshot; 								

														
///////////////////////////////////////////////////////////////////////////////
// Constants and enums
//

typedef enum _VSS_OBJECT_TYPE {
	VSS_OBJECT_UNKNOWN = 0, 						
	VSS_OBJECT_NONE,								
	VSS_OBJECT_SNAPSHOT_SET,							
	VSS_OBJECT_SNAPSHOT,							
	VSS_OBJECT_PROVIDER,							
	VSS_OBJECT_TYPE_COUNT
} VSS_OBJECT_TYPE, *PVSS_OBJECT_TYPE;


typedef enum _VSS_SNAPSHOT_STATE {
	VSS_SS_UNKNOWN = 0,							
	VSS_SS_PREPARING, 							
	VSS_SS_PROCESSING_PREPARE,								
	VSS_SS_PREPARED, 							
	VSS_SS_PROCESSING_PRECOMMIT,								
	VSS_SS_PRECOMMITTED,							
	VSS_SS_PROCESSING_COMMIT,								
	VSS_SS_COMMITTED, 							
	VSS_SS_PROCESSING_POSTCOMMIT,								
	VSS_SS_CREATED,								
	VSS_SS_ABORTED,								
	VSS_SS_DELETED,								
	VSS_SS_COUNT
} VSS_SNAPSHOT_STATE, *PVSS_SNAPSHOT_STATE;


enum _VSS_VOLUME_SNAPSHOT_ATTRIBUTES {
	VSS_VOLSNAP_ATTR_PERSISTENT 		= 0x00000001,
	VSS_VOLSNAP_ATTR_READ_WRITE			= 0x00000002,
	VSS_VOLSNAP_ATTR_CLIENT_ACCESSIBLE	= 0x00000004,
	VSS_VOLSNAP_ATTR_NO_AUTO_RELEASE   	= 0x00000008,
	VSS_VOLSNAP_ATTR_NO_WRITERS         = 0x00000010,
	VSS_VOLSNAP_ATTR_TRANSPORTABLE	    = 0x00000020,
	VSS_VOLSNAP_ATTR_NOT_SURFACED	    = 0x00000040,
	VSS_VOLSNAP_ATTR_HARDWARE_ASSISTED	= 0x00010000,
	VSS_VOLSNAP_ATTR_DIFFERENTIAL		= 0x00020000,
	VSS_VOLSNAP_ATTR_PLEX				= 0x00040000,
	VSS_VOLSNAP_ATTR_IMPORTED			= 0x00080000,
	VSS_VOLSNAP_ATTR_EXPOSED_LOCALLY    = 0x00100000,
	VSS_VOLSNAP_ATTR_EXPOSED_REMOTELY   = 0x00200000,
};


enum _VSS_SNAPSHOT_CONTEXT {
    VSS_CTX_BACKUP                      = 0x00000000,
    VSS_CTX_FILE_SHARE_BACKUP           = VSS_VOLSNAP_ATTR_NO_WRITERS,
    VSS_CTX_NAS_ROLLBACK                = VSS_VOLSNAP_ATTR_PERSISTENT |
                                          VSS_VOLSNAP_ATTR_NO_AUTO_RELEASE |
                                          VSS_VOLSNAP_ATTR_NO_WRITERS,
    VSS_CTX_APP_ROLLBACK                = VSS_VOLSNAP_ATTR_PERSISTENT |
                                          VSS_VOLSNAP_ATTR_NO_AUTO_RELEASE,
    VSS_CTX_CLIENT_ACCESSIBLE            = VSS_VOLSNAP_ATTR_CLIENT_ACCESSIBLE |
                                          VSS_VOLSNAP_ATTR_NO_AUTO_RELEASE |
                                          VSS_VOLSNAP_ATTR_NO_WRITERS,
    VSS_CTX_PERSISTENT_CLIENT_ACCESSIBLE = VSS_VOLSNAP_ATTR_PERSISTENT |
                                          VSS_VOLSNAP_ATTR_CLIENT_ACCESSIBLE |
                                          VSS_VOLSNAP_ATTR_NO_AUTO_RELEASE |
                                          VSS_VOLSNAP_ATTR_NO_WRITERS,
    VSS_CTX_ALL                         = 0xFFFFFFFF,
};


typedef enum _VSS_WRITER_STATE {
	VSS_WS_UNKNOWN = 0, 						
	VSS_WS_STABLE,										
	VSS_WS_WAITING_FOR_FREEZE,		
	VSS_WS_WAITING_FOR_THAW,
	VSS_WS_WAITING_FOR_POST_SNAPSHOT,
	VSS_WS_WAITING_FOR_BACKUP_COMPLETE,
	VSS_WS_FAILED_AT_IDENTIFY,						
	VSS_WS_FAILED_AT_PREPARE_BACKUP,						
	VSS_WS_FAILED_AT_PREPARE_SNAPSHOT,
	VSS_WS_FAILED_AT_FREEZE,							
	VSS_WS_FAILED_AT_THAW,
	VSS_WS_FAILED_AT_POST_SNAPSHOT,
	VSS_WS_FAILED_AT_BACKUP_COMPLETE,
	VSS_WS_FAILED_AT_PRE_RESTORE,
	VSS_WS_FAILED_AT_POST_RESTORE,
	VSS_WS_COUNT
} VSS_WRITER_STATE, *PVSS_WRITER_STATE;


typedef enum _VSS_BACKUP_TYPE {
	VSS_BT_UNDEFINED,
	VSS_BT_FULL,
	VSS_BT_INCREMENTAL,
	VSS_BT_DIFFERENTIAL,
	VSS_BT_LOG,
	VSS_BT_OTHER
} VSS_BACKUP_TYPE;



typedef enum _VSS_PROVIDER_TYPE
{
	VSS_PROV_UNKNOWN			= 0,
	VSS_PROV_SYSTEM				= 1,
	VSS_PROV_SOFTWARE			= 2,
	VSS_PROV_HARDWARE			= 3,
} VSS_PROVIDER_TYPE, *PVSS_PROVIDER_TYPE;


typedef enum _VSS_APPLICATION_LEVEL
{
	VSS_APP_UNKNOWN				= 0,
	VSS_APP_SYSTEM				= 1,
	VSS_APP_BACK_END			= 2,
	VSS_APP_FRONT_END			= 3,
	VSS_APP_AUTO				= -1,
} VSS_APPLICATION_LEVEL, *PVSS_APPLICATION_LEVEL;


// mask containing flags indicating what
typedef enum _VSS_SNAPSHOT_COMPATIBILITY
	{
	VSS_SC_DISABLE_DEFRAG = 0x1,
	VSS_SC_DISABLE_CONTENTINDEX = 0x2
	} VSS_SNAPSHOT_COMPATIBILITY;


typedef enum _VSS_SNAPSHOT_PROPERTY_ID {
	VSS_SPROPID_UNKNOWN 			= 0x0000000, 						
	VSS_SPROPID_SNAPSHOT_ID			= 0x0000001,								
	VSS_SPROPID_SNAPSHOT_SET_ID		= 0x0000002,								
	VSS_SPROPID_SNAPSHOTS_COUNT		= 0x0000003,								
	VSS_SPROPID_SNAPSHOT_DEVICE		= 0x0000004,								
	VSS_SPROPID_ORIGINAL_VOLUME		= 0x0000005,								
	VSS_SPROPID_ORIGINATING_MACHINE	= 0x0000006,								
	VSS_SPROPID_SERVICE_MACHINE		= 0x0000007,								
	VSS_SPROPID_EXPOSED_NAME		= 0x0000008,								
	VSS_SPROPID_EXPOSED_PATH		= 0x0000009,								
	VSS_SPROPID_PROVIDER_ID			= 0x000000A,								
	VSS_SPROPID_SNAPSHOT_ATTRIBUTES	= 0x000000B,								
	VSS_SPROPID_CREATION_TIMESTAMP	= 0x000000C,								
	VSS_SPROPID_STATUS				= 0x000000D,
} VSS_SNAPSHOT_PROPERTY_ID, *PVSS_SNAPSHOT_PROPERTY_ID;



////////////////////////////////////////////////////////
// Typedefs and structures
//


typedef GUID VSS_ID;


typedef [unique, string] WCHAR* VSS_PWSZ;


typedef LONGLONG  VSS_TIMESTAMP;


typedef struct _VSS_SNAPSHOT_PROP {
	VSS_ID			m_SnapshotId;								
	VSS_ID			m_SnapshotSetId;					
	LONG			m_lSnapshotsCount;					
	VSS_PWSZ		m_pwszSnapshotDeviceObject; 		
	VSS_PWSZ		m_pwszOriginalVolumeName;			
	VSS_PWSZ		m_pwszOriginatingMachine;
    VSS_PWSZ        m_pwszServiceMachine;       
	VSS_PWSZ		m_pwszExposedName;
	VSS_PWSZ		m_pwszExposedPath;
	VSS_ID			m_ProviderId;						
	LONG			m_lSnapshotAttributes;				
	VSS_TIMESTAMP	m_tsCreationTimestamp;				
	VSS_SNAPSHOT_STATE		m_eStatus;
} VSS_SNAPSHOT_PROP, *PVSS_SNAPSHOT_PROP;				
														

typedef struct _VSS_PROVIDER_PROP {
	VSS_ID			m_ProviderId;					
	VSS_PWSZ		m_pwszProviderName; 			
	VSS_PROVIDER_TYPE m_eProviderType;
	VSS_PWSZ		m_pwszProviderVersion;			
	VSS_ID			m_ProviderVersionId;			
	CLSID			m_ClassId;						
} VSS_PROVIDER_PROP, *PVSS_PROVIDER_PROP;			


[ switch_type(VSS_OBJECT_TYPE) ]
typedef union { 					
	[case(VSS_OBJECT_SNAPSHOT)] 	VSS_SNAPSHOT_PROP		Snap;
	[case(VSS_OBJECT_PROVIDER)] 	VSS_PROVIDER_PROP		Prov;
	[default];
} VSS_OBJECT_UNION;


typedef struct _VSS_OBJECT_PROP {
	VSS_OBJECT_TYPE Type;							
	[ switch_is(Type) ] VSS_OBJECT_UNION Obj;		
} VSS_OBJECT_PROP, *PVSS_OBJECT_PROP;



[
	object,
	uuid(AE1C7110-2F60-11d3-8A39-00C04F72D8E3),
	helpstring("IVssEnumObject Interface"),
	pointer_default(unique)
]
interface IVssEnumObject : IUnknown
{
	HRESULT Next(										
		[in]	ULONG celt, 							
		[out, size_is(celt), length_is(*pceltFetched)]
				VSS_OBJECT_PROP *rgelt, 				
		[out]	ULONG *pceltFetched 					
		);												

	HRESULT Skip(										
		[in] ULONG celt 								
		);												

	HRESULT Reset();									

	HRESULT Clone(										
		[in, out] IVssEnumObject **ppenum				
		);												
};



[
	object,
	uuid(C7B98A22-222D-4e62-B875-1A44980634AF),
	helpstring("IVssAsync Interface"),
	pointer_default(unique)
]
interface IVssAsync : IUnknown
{
	[helpstring("method Cancel")]						
	HRESULT Cancel();									

	[helpstring("method Wait")] 						
	HRESULT Wait(); 									

	[helpstring("method QueryStatus")]					
	HRESULT QueryStatus(								
		[out]	HRESULT* pHrResult, 					
		[in, out, unique]	INT* pReserved				
		);												
};


/////////////////////////////////////////////////////////////////////////////
// VSS HRESULT errors



//
// MessageId: VSS_E_BAD_STATE
//
// MessageText:
//
//  A function call was invalid because of the state of either the
//  backup extensions or the coordinator.  For example calling AddToSnapshot
//  set prior to calling StartSnapshotSet.
//
const HRESULT VSS_E_BAD_STATE                               = (0x80042301L);


//
// MessageId: VSS_E_PROVIDER_ALREADY_REGISTERED
//
// MessageText:
//
//  Calling RegisterProvider
//
const HRESULT VSS_E_PROVIDER_ALREADY_REGISTERED             = (0x80042303L);


//
// MessageId: VSS_E_PROVIDER_NOT_REGISTERED
//
// MessageText:
//
//  Calling UnregisterProvider
//
const HRESULT VSS_E_PROVIDER_NOT_REGISTERED                 = (0x80042304L);


//
// MessageId: VSS_E_PROVIDER_VETO
//
// MessageText:
//
//  Calling DoSnapshotSet
//
const HRESULT VSS_E_PROVIDER_VETO							= (0x80042306L);


//
// MessageId: VSS_E_PROVIDER_IN_USE
//
// MessageText:
//
//  Calling UnregisterProvider, StartSnapshotSet
//
const HRESULT VSS_E_PROVIDER_IN_USE				            = (0x80042307L);


//
// MessageId: VSS_E_OBJECT_NOT_FOUND
//
// MessageText:
//
//  Calling DeleteSnapshots, Query
//
const HRESULT VSS_E_OBJECT_NOT_FOUND						= (0x80042308L);


//
// MessageId: VSS_S_ASYNC_PENDING
//
// MessageText:
//
//  Calling IVssAsync::QueryStatus
//
const HRESULT VSS_S_ASYNC_PENDING							= (0x00042309L);


//
// MessageId: VSS_S_ASYNC_FINISHED
//
// MessageText:
//
//  Calling IVssAsync::QueryStatus
//
const HRESULT VSS_S_ASYNC_FINISHED							= (0x0004230AL);


//
// MessageId: VSS_S_ASYNC_CANCELLED
//
// MessageText:
//
//  Calling IVssAsync::QueryStatus
//
const HRESULT VSS_S_ASYNC_CANCELLED							= (0x0004230BL);


//
// MessageId: VSS_E_VOLUME_NOT_SUPPORTED
//
// MessageText:
//
//  Calling AddToSnapshotSet
//
const HRESULT VSS_E_VOLUME_NOT_SUPPORTED					= (0x8004230CL);



//
// MessageId: VSS_E_VOLUME_NOT_SUPPORTED_BY_PROVIDER
//
// MessageText:
//
//  Calling AddToSnapshotSet
//
const HRESULT VSS_E_VOLUME_NOT_SUPPORTED_BY_PROVIDER		= (0x8004230EL);



//
// MessageId: VSS_E_OBJECT_ALREADY_EXISTS
//
// MessageText:
//
//  Calling ExposeCurrentState
//
const HRESULT VSS_E_OBJECT_ALREADY_EXISTS					= (0x8004230DL);


//
// MessageId: VSS_E_UNEXPECTED_PROVIDER_ERROR
//
// MessageText:
//
//  Calling several methods supported by the providers.
//
const HRESULT VSS_E_UNEXPECTED_PROVIDER_ERROR				= (0x8004230FL);




//
// MessageId: VSS_E_CORRUPT_XML_DOCUMENT
//
// MessageText:
//
//  XML document unexpectedly does not match schema.
//
const HRESULT VSS_E_CORRUPT_XML_DOCUMENT						= (0x80042310L);


//
// MessageId: VSS_E_CORRUPT_XML_DOCUMENT
//
// MessageText:
//
//  An XML document passes as an argument is not valid, i.e., is either
//  not correctly formed XML or does not match the schema
//
const HRESULT VSS_E_INVALID_XML_DOCUMENT						= (0x80042311L);


//
// MessageId: VSS_E_MAXIMUM_NUMBER_OF_VOLUMES_REACHED
//
// MessageText:
//
//  We cannot add any more volumes since we passed the maximum limit.
//
const HRESULT VSS_E_MAXIMUM_NUMBER_OF_VOLUMES_REACHED   		= (0x80042312L);


//
// MessageId: VSS_E_FLUSH_WRITES_TIMEOUT
//
// MessageText:
//
//  VSS couldn't flush I/O writes anymore.
//
const HRESULT VSS_E_FLUSH_WRITES_TIMEOUT                    	= (0x80042313L);


//
// MessageId: VSS_E_HOLD_WRITES_TIMEOUT
//
// MessageText:
//
//  VSS couldn't hold I/O writes anymore.
//
const HRESULT VSS_E_HOLD_WRITES_TIMEOUT                    		= (0x80042314L);


//
// MessageId: VSS_E_UNEXPECTED_WRITER_ERROR
//
// MessageText:
//
//  VSS encountered problems while sending events to writers
//
const HRESULT VSS_E_UNEXPECTED_WRITER_ERROR                     = (0x80042315L);


//
// MessageId: VSS_E_SNAPSHOT_SET_IN_PROGRESS
//
// MessageText:
//
//  StartSnapshotSet was called when another snapshot set in in the
//  process of being created.
//
const HRESULT VSS_E_SNAPSHOT_SET_IN_PROGRESS                    = (0x80042316L);


//
// MessageId: VSS_E_MAXIMUM_NUMBER_OF_SNAPSHOTS_REACHED
//
// MessageText:
//
//  AddToSnapshotSet was called on a volume that has already reached
//  its maxinum number
//
const HRESULT VSS_E_MAXIMUM_NUMBER_OF_SNAPSHOTS_REACHED         = (0x80042317L);

//
// MessageId: VSS_E_WRITER_INFRASTRUCTURE
//
// The Writer infrastructure is not operating properly.  Check that the
// Event Service and the Volume Snapshot Service are started and check for
// errors associdated with these services in the error log.
//
const HRESULT VSS_E_WRITER_INFRASTRUCTURE	 		            = (0x80042318L);

//
// MessageId: VSS_E_WRITER_NOT_RESPONDING
//
// A writer did not respond to a GetWriterStatus call.  This means that
// the process containing the writer died or is hung.
//
const HRESULT VSS_E_WRITER_NOT_RESPONDING			            = (0x80042319L);


//
// MessageId: VSS_E_WRITER_ALREADY_SUBSCRIBED
//
// A writer has already sucessfully called the Subscribe function.  It cannot call
// subscribe multiple times.
//
const HRESULT VSS_E_WRITER_ALREADY_SUBSCRIBED			        = (0x8004231AL);


//
// MessageId: VSS_E_UNSUPPORTED_CONTEXT
//
// Attempt to use an unsupported context.
//
const HRESULT VSS_E_UNSUPPORTED_CONTEXT                         = (0x8004231BL);


//
// MessageId: VSS_E_VOLUME_IN_USE
//
// MessageText:
//
//  Calling ChangeDiffAreaMaximumSize
//
const HRESULT VSS_E_VOLUME_IN_USE				                = (0x8004231DL);


//
// MessageId: VSS_E_MAXIMUM_DIFFAREA_ASSOCIATIONS_REACHED
//
// MessageText:
//
//  Calling AddDiffArea
//
const HRESULT VSS_E_MAXIMUM_DIFFAREA_ASSOCIATIONS_REACHED       = (0x8004231EL);


//
// MessageId: VSS_E_INSUFFICIENT_STORAGE
//
// MessageText:
//
//  Calling EndPrepareSnapshots, ChangeDiffAreaMaximumSize
//
const HRESULT VSS_E_INSUFFICIENT_STORAGE		                = (0x8004231FL);





