You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
605 lines
14 KiB
605 lines
14 KiB
/*++
|
|
|
|
Copyright (c) 1999 Microsoft Corporation
|
|
|
|
Abstract:
|
|
|
|
@doc
|
|
@module vssadmin.hxx | header of VSS demo
|
|
@end
|
|
|
|
Author:
|
|
|
|
Adi Oltean [aoltean] 09/17/1999
|
|
|
|
TBD:
|
|
|
|
Add comments.
|
|
|
|
Revision History:
|
|
|
|
Name Date Comments
|
|
aoltean 09/17/1999 Created
|
|
|
|
--*/
|
|
|
|
|
|
#ifndef __VSS_DEMO_H_
|
|
#define __VSS_DEMO_H_
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Defines and pragmas
|
|
|
|
// C4290: C++ Exception Specification ignored
|
|
#pragma warning(disable:4290)
|
|
// warning C4511: copy constructor could not be generated
|
|
#pragma warning(disable:4511)
|
|
// warning C4127: conditional expression is constant
|
|
#pragma warning(disable:4127)
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Includes
|
|
|
|
|
|
#include <wtypes.h>
|
|
#include <stddef.h>
|
|
#include <oleauto.h>
|
|
#include <comadmin.h>
|
|
|
|
// Enabling asserts in ATL and VSS
|
|
#include "vs_assert.hxx"
|
|
|
|
// ATL
|
|
#include <atlconv.h>
|
|
#include <atlbase.h>
|
|
|
|
// Application specific
|
|
#include "vs_inc.hxx"
|
|
|
|
// Generated MIDL headers
|
|
#include "vs_idl.hxx"
|
|
|
|
#include "copy.hxx"
|
|
#include "pointer.hxx"
|
|
|
|
#include "resource.h"
|
|
|
|
#include "vssmsg.h"
|
|
#include "msg.h"
|
|
|
|
#include "vswriter.h"
|
|
#include "vsbackup.h"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Constants
|
|
|
|
const x_nStringBufferSize = 1024; // Includes the zero character
|
|
|
|
const x_nPollingInterval = 2500; // Three seconds
|
|
|
|
const x_nMaxRetriesCount = 4; // Retries for polling
|
|
|
|
const WCHAR x_wszVssOptBoolTrue[] = L"TRUE";
|
|
|
|
#define VSSADM_E_NO_ITEMS_IN_QUERY S_FALSE
|
|
#define VSSADM_E_FIRST_PARSING_ERROR 0x1001
|
|
#define VSSADM_E_INVALID_NUMBER 0x1001
|
|
#define VSSADM_E_INVALID_COMMAND 0x1002
|
|
#define VSSADM_E_INVALID_OPTION 0x1003
|
|
#define VSSADM_E_INVALID_OPTION_VALUE 0x1004
|
|
#define VSSADM_E_DUPLICATE_OPTION 0x1005
|
|
#define VSSADM_E_OPTION_NOT_ALLOWED_FOR_COMMAND 0x1006
|
|
#define VSSADM_E_REQUIRED_OPTION_MISSING 0x1007
|
|
#define VSSADM_E_INVALID_SET_OF_OPTIONS 0x1008
|
|
#define VSSADM_E_SNAPSHOT_NOT_FOUND 0x1009
|
|
#define VSSADM_E_DELETION_DENIED 0x100a
|
|
#define VSSADM_E_LAST_PARSING_ERROR 0x100a
|
|
|
|
// Note: if any skus are added in the CVssSKU class, they need to
|
|
// be updated here. Make sure to update the SKU_INT and SKU_A
|
|
// definitions as well.
|
|
#define SKU_C CVssSKU::VSS_SKU_CLIENT
|
|
#define SKU_S CVssSKU::VSS_SKU_SERVER
|
|
#define SKU_N CVssSKU::VSS_SKU_NAS
|
|
#define SKU_I CVssSKU::VSS_SKU_INVALID
|
|
|
|
#define SKU_INT ((DWORD)(~SKU_C & ~ SKU_S & ~SKU_N))
|
|
|
|
#define SKU_A ( SKU_C | SKU_S | SKU_N | SKU_INT) // 0xffff
|
|
#define SKU_SN ( SKU_S | SKU_N )
|
|
#define SKU_SNI (SKU_S | SKU_N | SKU_INT)
|
|
|
|
enum EVssAdmSnapshotType
|
|
{
|
|
VSSADM_ST_FIRST = 0,
|
|
VSSADM_ST_NAS_ROLLBACK = 0,
|
|
VSSADM_ST_PERSISTENT_TIMEWARP,
|
|
VSSADM_ST_TIMEWARP,
|
|
VSSADM_ST_NUM_TYPES,
|
|
VSSADM_ST_INVALID,
|
|
VSSADM_ST_ALL
|
|
};
|
|
|
|
struct SVssAdmSnapshotTypeName
|
|
{
|
|
LPCWSTR pwszName;
|
|
DWORD dwSKUs; // Specifies which SKUs this type is supported for snapshot creation using vssadmin, formed from ORing CVssSKU::EVssSKUType
|
|
LONG lSnapshotContext; // The snapshot context from vss.idl
|
|
LONG pwszDescription;
|
|
};
|
|
|
|
//
|
|
// List of all options. This list must remain in sync with the g_asAdmOptions list.
|
|
//
|
|
enum EVssAdmOption
|
|
{
|
|
VSSADM_O_FIRST = 0,
|
|
VSSADM_O_ALL = 0,
|
|
VSSADM_O_AUTORETRY,
|
|
VSSADM_O_EXPOSE_USING,
|
|
VSSADM_O_FOR,
|
|
VSSADM_O_MAXSIZE,
|
|
VSSADM_O_OLDEST,
|
|
VSSADM_O_ON,
|
|
VSSADM_O_PROVIDER,
|
|
VSSADM_O_QUIET,
|
|
VSSADM_O_SET,
|
|
VSSADM_O_SHAREPATH,
|
|
VSSADM_O_SNAPSHOT,
|
|
VSSADM_O_SNAPTYPE,
|
|
VSSADM_O_NUM_OPTIONS,
|
|
VSSADM_O_INVALID
|
|
};
|
|
|
|
//
|
|
// LIst of all commands. This list must remain in sync with the g_asAdmCommands list.
|
|
//
|
|
enum EVssAdmCommand
|
|
{
|
|
VSSADM_C_FIRST = 0,
|
|
VSSADM_C_ADD_DIFFAREA_INT = 0,
|
|
VSSADM_C_ADD_DIFFAREA_PUB,
|
|
VSSADM_C_CREATE_SNAPSHOT_INT,
|
|
VSSADM_C_CREATE_SNAPSHOT_PUB,
|
|
VSSADM_C_DELETE_SNAPSHOTS_INT,
|
|
VSSADM_C_DELETE_SNAPSHOTS_PUB,
|
|
VSSADM_C_DELETE_DIFFAREAS_INT,
|
|
VSSADM_C_DELETE_DIFFAREAS_PUB,
|
|
VSSADM_C_EXPOSE_SNAPSHOT,
|
|
VSSADM_C_LIST_PROVIDERS,
|
|
VSSADM_C_LIST_SNAPSHOTS_INT,
|
|
VSSADM_C_LIST_SNAPSHOTS_PUB,
|
|
VSSADM_C_LIST_DIFFAREAS_INT,
|
|
VSSADM_C_LIST_DIFFAREAS_PUB,
|
|
VSSADM_C_LIST_VOLUMES_INT,
|
|
VSSADM_C_LIST_VOLUMES_PUB,
|
|
VSSADM_C_LIST_WRITERS,
|
|
VSSADM_C_RESIZE_DIFFAREA_INT,
|
|
VSSADM_C_RESIZE_DIFFAREA_PUB,
|
|
VSSADM_C_NUM_COMMANDS,
|
|
VSSADM_C_INVALID
|
|
};
|
|
|
|
enum EVssAdmOptionType
|
|
{
|
|
VSSADM_OT_BOOL = 0, // no qualifier on the option, i.e. /quiet, TRUE if present
|
|
VSSADM_OT_STR,
|
|
VSSADM_OT_NUM
|
|
};
|
|
|
|
struct SVssAdmOption
|
|
{
|
|
EVssAdmOption eOpt;
|
|
LPCWSTR pwszOptName; // The option name as typed on the command-line, i.e. the "for" in /for=XXXX
|
|
EVssAdmOptionType eOptType;
|
|
};
|
|
|
|
//
|
|
// Specifies the validity of the option for a particular command.
|
|
//
|
|
enum EVssAdmOptionFlag
|
|
{
|
|
V_NO = 0, // Option not allowed
|
|
V_YES, // Option manditory
|
|
V_OPT // Option optional
|
|
};
|
|
|
|
//
|
|
// The main command structure. The commands are structured like:
|
|
// vssadmin <pwszMajorOption> <pwszMinorOption> <OPTIONS>
|
|
//
|
|
struct SVssAdmCommandsEntry
|
|
{
|
|
LPCWSTR pwszMajorOption;
|
|
LPCWSTR pwszMinorOption;
|
|
EVssAdmCommand eAdmCmd;
|
|
DWORD dwSKUs; // Specifies which SKUs this command is supported, formed from ORing CVssSKU::EVssSKUType
|
|
LONG lMsgGen;
|
|
LONG lMsgDetail;
|
|
BOOL bShowSSTypes; // If true, in detailed usage show a list of valid snapshot types at end of message
|
|
EVssAdmOptionFlag aeOptionFlags[VSSADM_O_NUM_OPTIONS]; // Array of option flags indexed by EVssAdmOption
|
|
};
|
|
|
|
|
|
//
|
|
// The structure of the parsed command. One of these is created by the
|
|
// ParseCmdLine method.
|
|
//
|
|
struct SVssAdmParsedCommand
|
|
{
|
|
EVssAdmCommand eAdmCmd;
|
|
LPWSTR apwszOptionValues[VSSADM_O_NUM_OPTIONS];
|
|
|
|
// Simple initializer constructor
|
|
SVssAdmParsedCommand()
|
|
{
|
|
eAdmCmd = VSSADM_C_INVALID;
|
|
// psUnnamedOptions = NULL;
|
|
|
|
// Clear out the option values arrays
|
|
for ( INT i = 0; i < VSSADM_O_NUM_OPTIONS; ++i )
|
|
apwszOptionValues[ i ] = NULL;
|
|
};
|
|
~SVssAdmParsedCommand()
|
|
{
|
|
// Free any allocated memory
|
|
for ( INT i = 0; i < VSSADM_O_NUM_OPTIONS; ++i )
|
|
::VssFreeString( apwszOptionValues[ i ] );
|
|
|
|
}
|
|
};
|
|
|
|
extern const SVssAdmOption g_asAdmOptions[];
|
|
extern const SVssAdmCommandsEntry g_asAdmCommands[];
|
|
extern const SVssAdmSnapshotTypeName g_asAdmTypeNames[];
|
|
|
|
LPWSTR GuidToString(
|
|
IN GUID guid
|
|
);
|
|
|
|
LPWSTR LonglongToString(
|
|
IN LONGLONG llValue
|
|
);
|
|
|
|
LPWSTR DateTimeToString(
|
|
IN VSS_TIMESTAMP *pTimeStamp
|
|
);
|
|
|
|
WCHAR MyGetChar(
|
|
);
|
|
|
|
BOOL MapVssErrorToMsg(
|
|
IN HRESULT hr,
|
|
OUT LONG *plMsgNum
|
|
) throw( HRESULT );
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// class CVssAdminCLI
|
|
|
|
class CCommandVerifier;
|
|
|
|
class CVssAdminCLI
|
|
{
|
|
// Enums and typedefs
|
|
private:
|
|
|
|
enum _RETURN_VALUE
|
|
{
|
|
VSS_CMDRET_SUCCESS = 0,
|
|
VSS_CMDRET_EMPTY_RESULT = 1,
|
|
VSS_CMDRET_ERROR = 2,
|
|
};
|
|
|
|
// Constructors& destructors
|
|
private:
|
|
CVssAdminCLI(const CVssAdminCLI&);
|
|
CVssAdminCLI();
|
|
|
|
public:
|
|
CVssAdminCLI(
|
|
IN INT argc,
|
|
IN PWSTR argv[]
|
|
);
|
|
~CVssAdminCLI();
|
|
|
|
// Attributes
|
|
private:
|
|
BOOL IsQuiet() { return GetOptionValueBool( VSSADM_O_QUIET ); }
|
|
|
|
INT GetReturnValue() { return m_nReturnValue; };
|
|
|
|
LPWSTR GetOptionValueStr(
|
|
IN EVssAdmOption eOption
|
|
)
|
|
{
|
|
CVssFunctionTracer ft( VSSDBG_VSSADMIN, L"CVssAdminCLI::GetOptionValueStr" );
|
|
|
|
BS_ASSERT( g_asAdmOptions[ eOption ].eOptType == VSSADM_OT_STR );
|
|
// BS_ASSERT( g_asAdmCommands[ m_sParsedCommand.eAdmCmd].aeOptionFlags[ eOption ] != V_NO );
|
|
return m_sParsedCommand.apwszOptionValues[ eOption ];
|
|
};
|
|
|
|
BOOL GetOptionValueBool(
|
|
IN EVssAdmOption eOption
|
|
)
|
|
{
|
|
CVssFunctionTracer ft( VSSDBG_VSSADMIN, L"CVssAdminCLI::GetOptionValueBool" );
|
|
|
|
BS_ASSERT( g_asAdmOptions[ eOption ].eOptType == VSSADM_OT_BOOL );
|
|
BS_ASSERT( g_asAdmCommands[ m_sParsedCommand.eAdmCmd].aeOptionFlags[ eOption ] != V_NO );
|
|
return m_sParsedCommand.apwszOptionValues[ eOption ] != NULL;
|
|
};
|
|
|
|
BOOL GetOptionValueNum(
|
|
IN EVssAdmOption eOption,
|
|
OUT LONGLONG *pllValue,
|
|
IN BOOL bSuffixAllowed = TRUE
|
|
) throw( HRESULT )
|
|
{
|
|
CVssFunctionTracer ft( VSSDBG_VSSADMIN, L"CVssAdminCLI::GetOptionValueNum" );
|
|
|
|
BS_ASSERT( g_asAdmOptions[ eOption ].eOptType == VSSADM_OT_NUM );
|
|
BS_ASSERT( g_asAdmCommands[ m_sParsedCommand.eAdmCmd].aeOptionFlags[ eOption ] != V_NO );
|
|
if ( m_sParsedCommand.apwszOptionValues[ eOption ] == NULL )
|
|
{
|
|
BS_ASSERT( g_asAdmCommands[ m_sParsedCommand.eAdmCmd].aeOptionFlags[ eOption ] == V_OPT );
|
|
// Option wasn't specified on command line - an optional one
|
|
*pllValue = 0;
|
|
return FALSE;
|
|
}
|
|
*pllValue = ScanNumber( m_sParsedCommand.apwszOptionValues[ eOption ], bSuffixAllowed );
|
|
|
|
return TRUE;
|
|
};
|
|
|
|
|
|
// Operations
|
|
public:
|
|
|
|
static HRESULT Main(
|
|
IN INT argc,
|
|
IN PWSTR argv[]
|
|
);
|
|
|
|
private:
|
|
|
|
void Initialize(
|
|
) throw(HRESULT);
|
|
|
|
BOOL ParseCmdLine(
|
|
) throw(HRESULT);
|
|
|
|
void DoProcessing(
|
|
) throw(HRESULT);
|
|
|
|
void Finalize();
|
|
|
|
// Processing
|
|
private:
|
|
|
|
void PrintUsage(
|
|
) throw(HRESULT);
|
|
|
|
// The following are the methods that get called for each command.
|
|
void AddDiffArea(
|
|
) throw(HRESULT);
|
|
|
|
void CreateSnapshot(
|
|
) throw(HRESULT);
|
|
|
|
void DeleteDiffAreas(
|
|
) throw(HRESULT);
|
|
|
|
void DeleteSnapshots(
|
|
) throw(HRESULT);
|
|
|
|
void ExposeSnapshot(
|
|
) throw(HRESULT);
|
|
|
|
void ListDiffAreas(
|
|
) throw(HRESULT);
|
|
|
|
void ListProviders(
|
|
) throw(HRESULT);
|
|
|
|
void ListSnapshots(
|
|
) throw(HRESULT);
|
|
|
|
void ListVolumes(
|
|
) throw(HRESULT);
|
|
|
|
void ListWriters(
|
|
) throw(HRESULT);
|
|
|
|
void ResizeDiffArea(
|
|
) throw(HRESULT);
|
|
|
|
// Implementation
|
|
private:
|
|
static BOOL UnloggableError(IN HRESULT hError);
|
|
|
|
void GetDifferentialSoftwareSnapshotMgmtInterface(
|
|
IN VSS_ID ProviderId,
|
|
IN IVssSnapshotMgmt *pIMgmt,
|
|
OUT IUnknown** ppItf
|
|
);
|
|
|
|
LPCWSTR GetVolumeDisplayName(
|
|
IN LPCWSTR pwszVolumeName
|
|
);
|
|
|
|
LONG DetermineSnapshotType(
|
|
IN LPCWSTR pwszType
|
|
) throw(HRESULT);
|
|
|
|
LPWSTR DetermineSnapshotType(
|
|
IN LONG lSnapshotAttributes
|
|
) throw(HRESULT);
|
|
|
|
void DisplayDiffAreasPrivate(
|
|
IVssEnumMgmtObject *pIEnumMgmt
|
|
) throw(HRESULT);
|
|
|
|
LPWSTR BuildSnapshotAttributeDisplayString(
|
|
IN DWORD Attr
|
|
) throw(HRESULT);
|
|
|
|
void DumpSnapshotTypes(
|
|
) throw(HRESULT);
|
|
|
|
LPCWSTR LoadString(
|
|
IN UINT nStringId
|
|
) throw(HRESULT);
|
|
|
|
LPCWSTR GetNextCmdlineToken(
|
|
IN bool bFirstToken = false
|
|
) throw(HRESULT);
|
|
|
|
bool Match(
|
|
IN LPCWSTR wszString,
|
|
IN LPCWSTR wszPatternString
|
|
) throw(HRESULT);
|
|
|
|
bool ScanGuid(
|
|
IN LPCWSTR wszString,
|
|
OUT VSS_ID& Guid
|
|
) throw(HRESULT);
|
|
|
|
void Output(
|
|
IN LPCWSTR wszFormat,
|
|
...
|
|
) throw(HRESULT);
|
|
|
|
void OutputMsg(
|
|
IN LONG msgId,
|
|
...
|
|
) throw(HRESULT);
|
|
|
|
void OutputOnConsole(
|
|
IN LPCWSTR wszStr
|
|
);
|
|
|
|
|
|
LPWSTR GetMsg(
|
|
IN BOOL bLineBreaks,
|
|
IN LONG msgId,
|
|
...
|
|
);
|
|
|
|
void AppendMessageToStr(
|
|
IN LPWSTR pwszString,
|
|
IN SIZE_T cMaxStrLen,
|
|
IN LONG lMsgId,
|
|
IN DWORD AttrBit,
|
|
IN LPCWSTR pwszDelimitStr
|
|
) throw( HRESULT );
|
|
|
|
LONGLONG ScanNumber(
|
|
IN LPCWSTR pwszNumToConvert,
|
|
IN BOOL bSuffixAllowed
|
|
) throw( HRESULT );
|
|
|
|
LPWSTR FormatNumber(
|
|
IN LONGLONG llNum
|
|
) throw(HRESULT);
|
|
|
|
void OutputErrorMsg(
|
|
IN LONG msgId,
|
|
...
|
|
) throw(HRESULT);
|
|
|
|
BOOL PromptUserForConfirmation(
|
|
IN LONG lPromptMsgId,
|
|
IN ULONG ulNum
|
|
);
|
|
|
|
void GetProviderId(
|
|
OUT VSS_ID *pProviderId
|
|
);
|
|
|
|
LPCWSTR GetProviderName(
|
|
IN VSS_ID& ProviderId
|
|
) throw(HRESULT);
|
|
|
|
BOOL GetProviderIdByName(
|
|
IN LPCWSTR pwszProviderName,
|
|
OUT VSS_ID *pProviderId
|
|
) throw(HRESULT);
|
|
|
|
// Data members
|
|
private:
|
|
CCommandVerifier* m_pVerifier;
|
|
HANDLE m_hConsoleOutput;
|
|
CVssSimpleMap<UINT, LPCWSTR> m_mapCachedResourceStrings;
|
|
CVssSimpleMap<VSS_ID, LPCWSTR> m_mapCachedProviderNames;
|
|
CVssSimpleMap<LPCWSTR, LPCWSTR> *m_pMapVolumeNames;
|
|
|
|
INT m_nReturnValue;
|
|
|
|
INT m_argc;
|
|
PWSTR *m_argv;
|
|
|
|
EVssAdmCommand m_eCommandType;
|
|
SVssAdmParsedCommand m_sParsedCommand;
|
|
VSS_OBJECT_TYPE m_eFilterObjectType;
|
|
VSS_OBJECT_TYPE m_eListedObjectType;
|
|
VSS_ID m_FilterSnapshotId;
|
|
};
|
|
|
|
class CVssAutoSnapshotProperties
|
|
{
|
|
// Constructors/destructors
|
|
private:
|
|
CVssAutoSnapshotProperties(const CVssAutoSnapshotProperties&);
|
|
|
|
public:
|
|
CVssAutoSnapshotProperties(VSS_SNAPSHOT_PROP &Snap): m_pSnap(&Snap) {};
|
|
CVssAutoSnapshotProperties(VSS_OBJECT_PROP &Prop): m_pSnap(&Prop.Obj.Snap) {};
|
|
|
|
// Automatically closes the handle
|
|
~CVssAutoSnapshotProperties() {
|
|
Clear();
|
|
};
|
|
|
|
// Operations
|
|
public:
|
|
|
|
// Returns the value
|
|
VSS_SNAPSHOT_PROP *GetPtr() {
|
|
return m_pSnap;
|
|
}
|
|
|
|
// NULLs out the pointer. Used after a pointer has been transferred to another
|
|
// funtion.
|
|
void Transferred() {
|
|
m_pSnap = NULL;
|
|
}
|
|
|
|
// Clears the contents of the auto string
|
|
void Clear() {
|
|
if ( m_pSnap != NULL )
|
|
{
|
|
::VssFreeSnapshotProperties(m_pSnap);
|
|
m_pSnap = NULL;
|
|
}
|
|
}
|
|
|
|
// Returns the value to the actual pointer
|
|
VSS_SNAPSHOT_PROP* operator->() const {
|
|
return m_pSnap;
|
|
}
|
|
|
|
// Returns the value of the actual pointer
|
|
operator VSS_SNAPSHOT_PROP* () const {
|
|
return m_pSnap;
|
|
}
|
|
|
|
private:
|
|
VSS_SNAPSHOT_PROP *m_pSnap;
|
|
};
|
|
|
|
|
|
#endif //__VSS_DEMO_H_
|