2025-04-27 07:49:33 -04:00

541 lines
13 KiB
Objective-C

/*++
Copyright (c) 1999 Microsoft Corporation
Abstract:
@doc
@module vssadmin.cpp | 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"
/////////////////////////////////////////////////////////////////////////////
// Constants
const nStringBufferSize = 1024; // Includes the zero character
const nPollingInterval = 2500; // Three seconds
const MAX_RETRIES_COUNT = 4; // Retries for polling
const WCHAR 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_LAST_PARSING_ERROR 0x1008
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
};
//
// List of all options. This list must remain in sync with the g_asAdmOptions list.
//
enum EVssAdmOption
{
VSSADM_O_FIRST = 0,
VSSADM_O_AUTORETRY = 0,
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 = 0,
VSSADM_C_CREATE_SNAPSHOT,
VSSADM_C_DELETE_SNAPSHOTS,
VSSADM_C_DELETE_DIFFAREAS,
VSSADM_C_EXPOSE_SNAPSHOT,
VSSADM_C_LIST_PROVIDERS,
VSSADM_C_LIST_SNAPSHOTS,
VSSADM_C_LIST_DIFFAREAS,
VSSADM_C_LIST_VOLUMES,
VSSADM_C_LIST_WRITERS,
VSSADM_C_RESIZE_DIFFAREA,
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 CVssFunctionTracer& ft,
IN GUID guid
);
LPWSTR LonglongToString(
IN CVssFunctionTracer& ft,
IN LONGLONG llValue
);
LPWSTR DateTimeToString(
IN CVssFunctionTracer& ft,
IN VSS_TIMESTAMP *pTimeStamp
);
WCHAR MyGetChar(
IN CVssFunctionTracer& ft
);
BOOL MapVssErrorToMsg(
IN CVssFunctionTracer& ft,
IN HRESULT hr,
OUT LONG *plMsgNum
) throw( HRESULT );
/////////////////////////////////////////////////////////////////////////////
// class CVssAdminCLI
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
)
{
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
)
{
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 CVssFunctionTracer& ft,
IN EVssAdmOption eOption,
OUT LONGLONG *pllValue
) throw( HRESULT )
{
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( ft, m_sParsedCommand.apwszOptionValues[ eOption ] );
return TRUE;
};
// Operations
public:
static HRESULT Main(
IN INT argc,
IN PWSTR argv[]
);
private:
void Initialize(
IN CVssFunctionTracer& ft
) throw(HRESULT);
BOOL ParseCmdLine(
IN CVssFunctionTracer& ft
) throw(HRESULT);
void DoProcessing(
IN CVssFunctionTracer& ft
) throw(HRESULT);
void Finalize();
// Processing
private:
void PrintUsage(
IN CVssFunctionTracer& ft
) throw(HRESULT);
// The following are the methods that get called for each command.
void AddDiffArea(
IN CVssFunctionTracer& ft
) throw(HRESULT);
void CreateSnapshot(
IN CVssFunctionTracer& ft
) throw(HRESULT);
void DeleteDiffAreas(
IN CVssFunctionTracer& ft
) throw(HRESULT);
void DeleteSnapshots(
IN CVssFunctionTracer& ft
) throw(HRESULT);
void ExposeSnapshot(
IN CVssFunctionTracer& ft
) throw(HRESULT);
void ListDiffAreas(
IN CVssFunctionTracer& ft
) throw(HRESULT);
void ListProviders(
IN CVssFunctionTracer& ft
) throw(HRESULT);
void ListSnapshots(
IN CVssFunctionTracer& ft
) throw(HRESULT);
void ListVolumes(
IN CVssFunctionTracer& ft
) throw(HRESULT);
void ListWriters(
IN CVssFunctionTracer& ft
) throw(HRESULT);
void ResizeDiffArea(
IN CVssFunctionTracer& ft
) throw(HRESULT);
// Implementation
private:
LONG DetermineSnapshotType(
IN CVssFunctionTracer& ft,
IN LPCWSTR pwszType
) throw(HRESULT);
LPWSTR DetermineSnapshotType(
IN CVssFunctionTracer& ft,
IN LONG lSnapshotAttributes
) throw(HRESULT);
void DisplayDiffAreasPrivate(
IN CVssFunctionTracer& ft,
IVssEnumMgmtObject *pIEnumMgmt
) throw(HRESULT);
void CreateNoWritersSnapshot(
IN LONG lSnapshotContext
) throw(HRESULT);
LPWSTR BuildSnapshotAttributeDisplayString(
IN CVssFunctionTracer& ft,
IN DWORD Attr
) throw(HRESULT);
void DumpSnapshotTypes(
IN CVssFunctionTracer& ft
) throw(HRESULT);
LPCWSTR LoadString(
IN CVssFunctionTracer& ft,
IN UINT nStringId
) throw(HRESULT);
LPCWSTR GetNextCmdlineToken(
IN CVssFunctionTracer& ft,
IN bool bFirstToken = false
) throw(HRESULT);
bool Match(
IN CVssFunctionTracer& ft,
IN LPCWSTR wszString,
IN LPCWSTR wszPatternString
) throw(HRESULT);
bool ScanGuid(
IN CVssFunctionTracer& ft,
IN LPCWSTR wszString,
OUT VSS_ID& Guid
) throw(HRESULT);
void Output(
IN CVssFunctionTracer& ft,
IN LPCWSTR wszFormat,
...
) throw(HRESULT);
void OutputMsg(
IN CVssFunctionTracer& ft,
IN LONG msgId,
...
) throw(HRESULT);
void OutputOnConsole(
IN LPCWSTR wszStr
);
LPWSTR GetMsg(
IN CVssFunctionTracer& ft,
IN BOOL bLineBreaks,
IN LONG msgId,
...
);
void AppendMessageToStr(
IN CVssFunctionTracer& ft,
IN LPWSTR pwszString,
IN SIZE_T cMaxStrLen,
IN LONG lMsgId,
IN DWORD AttrBit,
IN LPCWSTR pwszDelimitStr
) throw( HRESULT );
LONGLONG ScanNumber(
IN CVssFunctionTracer& ft,
IN LPCWSTR pwszNumToConvert
) throw( HRESULT );
LPWSTR FormatNumber(
IN CVssFunctionTracer& ft,
IN LONGLONG llNum
) throw(HRESULT);
void OutputErrorMsg(
IN CVssFunctionTracer& ft,
IN LONG msgId,
...
) throw(HRESULT);
BOOL PromptUserForConfirmation(
IN CVssFunctionTracer& ft,
IN LONG lPromptMsgId,
IN ULONG ulNum
);
LPCWSTR GetProviderName(
IN CVssFunctionTracer& ft,
IN VSS_ID& ProviderId
) throw(HRESULT);
BOOL GetProviderId(
IN CVssFunctionTracer& ft,
IN LPCWSTR pwszProviderName,
OUT VSS_ID *pProviderId
) throw(HRESULT);
// Data members
private:
HANDLE m_hConsoleOutput;
CVssSimpleMap<UINT, LPCWSTR> m_mapCachedResourceStrings;
CVssSimpleMap<VSS_ID, LPCWSTR> m_mapCachedProviderNames;
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;
};
#endif //__VSS_DEMO_H_