/* **++ ** ** Copyright (c) 2000-2001 Microsoft Corporation ** ** ** Module Name: ** ** vsreq.h ** ** ** Abstract: ** ** Sample program to ** - obtain and display the Writer metadata. ** - create a snapshot set ** ** Author: ** ** Adi Oltean [aoltean] 05-Dec-2000 ** ** The sample is based on the Metasnap test program written by Michael C. Johnson. ** ** ** Revision History: ** **-- */ /* ** Defines ** ** ** C4290: C++ Exception Specification ignored ** warning C4511: 'CVssCOMApplication' : copy constructor could not be generated ** warning C4127: conditional expression is constant */ #pragma warning(disable:4290) #pragma warning(disable:4511) #pragma warning(disable:4127) /* ** Includes */ #include #include #include #include #include #include #include #include #include #include #include #define ATLASSERT(_condition) #include #include extern CComModule _Module; #include /////////////////////////////////////////////////////////////////////////////// // Useful macros #define WSTR_GUID_FMT L"{%.8x-%.4x-%.4x-%.2x%.2x-%.2x%.2x%.2x%.2x%.2x%.2x}" #define GUID_PRINTF_ARG( X ) \ (X).Data1, \ (X).Data2, \ (X).Data3, \ (X).Data4[0], (X).Data4[1], (X).Data4[2], (X).Data4[3], \ (X).Data4[4], (X).Data4[5], (X).Data4[6], (X).Data4[7] // Execute the given call and check that the return code must be S_OK #define CHECK_SUCCESS( Call ) \ { \ m_hr = Call; \ if (m_hr != S_OK) \ Error(1, L"\nError in %S(%d): \n\t- Call %S not succeeded. \n" \ L"\t Error code = 0x%08lx. Error description = %s\n", \ __FILE__, __LINE__, #Call, m_hr, GetStringFromFailureType(m_hr)); \ } #define CHECK_NOFAIL( Call ) \ { \ m_hr = Call; \ if (FAILED(m_hr)) \ Error(1, L"\nError in %S(%d): \n\t- Call %S not succeeded. \n" \ L"\t Error code = 0x%08lx. Error description = %s\n", \ __FILE__, __LINE__, #Call, m_hr, GetStringFromFailureType(m_hr)); \ } /////////////////////////////////////////////////////////////////////////////// // Constants const MAX_VOLUMES = 64; const MAX_TEXT_BUFFER = 512; /////////////////////////////////////////////////////////////////////////////// // Main class class CVssSampleRequestor { // Constructors& destructors public: CVssSampleRequestor(); ~CVssSampleRequestor(); // Attributes public: // Operations public: // Initialize internal members void Initialize(); // Parse command line arguments void ParseCommandLine( IN INT nArgsCount, IN WCHAR ** ppwszArgsArray ); // Creates a snapshot set void CreateSnapshotSet(); // Completes the backup void BackupComplete(); void GatherWriterMetadata(); void GatherWriterStatus( IN LPCWSTR wszWhen ); // Private methods: private: LPCWSTR GetStringFromUsageType (VSS_USAGE_TYPE eUsageType); LPCWSTR GetStringFromSourceType (VSS_SOURCE_TYPE eSourceType); LPCWSTR GetStringFromRestoreMethod (VSS_RESTOREMETHOD_ENUM eRestoreMethod); LPCWSTR GetStringFromWriterRestoreMethod (VSS_WRITERRESTORE_ENUM eWriterRestoreMethod); LPCWSTR GetStringFromComponentType (VSS_COMPONENT_TYPE eComponentType); LPCWSTR GetStringFromFailureType (HRESULT hrStatus); LPCWSTR GetStringFromWriterStatus(VSS_WRITER_STATE eWriterStatus); void PrintUsage(); void Error(INT nReturnCode, const WCHAR* pwszMsgFormat, ...); void PrintFiledesc (IVssWMFiledesc *pFiledesc, LPCWSTR wszDescription); void AddVolumeForComponent( IN IVssWMFiledesc* pFileDesc ); bool AddVolume( IN WCHAR* pwszVolume, OUT bool & bAdded ); // Implementation private: CComPtr m_pBackupComponents; bool m_bCoInitializeSucceeded; bool m_bBootableSystemState; bool m_bComponentSelectionEnabled; INT m_nVolumesCount; WCHAR* m_ppwszVolumesList[MAX_VOLUMES]; WCHAR* m_ppwszVolumeNamesList[MAX_VOLUMES]; HRESULT m_hr; bool m_bMetadataGathered; WCHAR* m_pwszXmlFile; FILE* m_pXmlFile; };