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.
1164 lines
28 KiB
1164 lines
28 KiB
/*
|
|
**++
|
|
**
|
|
** Copyright (c) 2000-2001 Microsoft Corporation
|
|
**
|
|
**
|
|
** Module Name:
|
|
**
|
|
** simsnap.cpp
|
|
**
|
|
**
|
|
** Abstract:
|
|
**
|
|
** Test program to drive the VSS Writer Shim contained in VssAPI.DLL
|
|
**
|
|
**
|
|
** Author:
|
|
**
|
|
** Michael C. Johnson [mikejohn] 24-May-2000
|
|
**
|
|
**
|
|
** Revision History:
|
|
**
|
|
** X-5 MCJ Michael C. Johnson 15-Sep-2000
|
|
** Add test for invalid volume array pointer, interleaved calls
|
|
** and so on.
|
|
**
|
|
** X-4 MCJ Michael C. Johnson 15-Sep-2000
|
|
** Add test for invalid bits in options parameter of call to
|
|
** SimulateSnapshotFreeze()
|
|
**
|
|
** X-3 MCJ Michael C. Johnson 30-Jun-2000
|
|
** Remove calls to RegisterSnapshotSubscriptions() and
|
|
** UnregisterSnapshotSubscriptions() as these are no longer
|
|
** required.
|
|
**
|
|
** X-2 MCJ Michael C. Johnson 26-May-2000
|
|
** Add some extra tests to validate shim is properly sensitive
|
|
** to volume name array contents.
|
|
**--
|
|
*/
|
|
|
|
/*
|
|
** 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 <windows.h>
|
|
#include <wtypes.h>
|
|
#include <stddef.h>
|
|
#include <stdio.h>
|
|
#include <objbase.h>
|
|
#include <guiddef.h>
|
|
|
|
#include "vs_idl.hxx"
|
|
|
|
#include <vswriter.h>
|
|
#include <vsbackup.h>
|
|
|
|
|
|
static BOOL AssertPrivilege (LPCWSTR privName);
|
|
|
|
static HRESULT DoTest01 (VOID);
|
|
static HRESULT DoTest02 (VOID);
|
|
static HRESULT DoTest03 (VOID);
|
|
static HRESULT DoTest05 (VOID);
|
|
static HRESULT DoTest06 (VOID);
|
|
static HRESULT DoTest07 (VOID);
|
|
static HRESULT DoTest08 (VOID);
|
|
static HRESULT DoTest09 (VOID);
|
|
static HRESULT DoTest10 (VOID);
|
|
static HRESULT DoTest11 (VOID);
|
|
static HRESULT DoTest12 (VOID);
|
|
static HRESULT DoTest13 (VOID);
|
|
static HRESULT DoTest14 (VOID);
|
|
|
|
|
|
|
|
|
|
extern "C" int __cdecl wmain (int argc, char *argv[])
|
|
{
|
|
HRESULT hrStatus;
|
|
|
|
|
|
UNREFERENCED_PARAMETER (argv);
|
|
UNREFERENCED_PARAMETER (argc);
|
|
|
|
|
|
wprintf (L"Test for SimulateSnapshotXxxx calls (ProcessId 0x%04x)\nChecking privileges\n",
|
|
GetCurrentProcessId ());
|
|
|
|
|
|
if (!AssertPrivilege (SE_BACKUP_NAME))
|
|
{
|
|
wprintf (L"AssertPrivilege returned error 0x%08X\n", GetLastError ());
|
|
return 2;
|
|
}
|
|
|
|
|
|
|
|
wprintf (L"Initializing COM\n");
|
|
|
|
hrStatus = CoInitializeEx (NULL, COINIT_MULTITHREADED);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"CoInitialize() returned 0x%08X\n", GetLastError ());
|
|
return 1;
|
|
}
|
|
|
|
|
|
|
|
if ( argc == 1 )
|
|
{
|
|
hrStatus = DoTest01 ();
|
|
|
|
hrStatus = DoTest02 ();
|
|
|
|
hrStatus = DoTest05 ();
|
|
|
|
hrStatus = DoTest06 ();
|
|
|
|
hrStatus = DoTest02 ();
|
|
|
|
hrStatus = DoTest07 ();
|
|
|
|
hrStatus = DoTest08 ();
|
|
|
|
hrStatus = DoTest09 ();
|
|
|
|
hrStatus = DoTest10 ();
|
|
|
|
hrStatus = DoTest11 ();
|
|
|
|
hrStatus = DoTest12 ();
|
|
|
|
hrStatus = DoTest13 ();
|
|
|
|
hrStatus = DoTest14 ();
|
|
}
|
|
else
|
|
{
|
|
hrStatus = DoTest03();
|
|
}
|
|
|
|
|
|
CoUninitialize();
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
static BOOL AssertPrivilege (LPCWSTR privName)
|
|
{
|
|
HANDLE tokenHandle;
|
|
BOOL stat = FALSE;
|
|
|
|
if (OpenProcessToken (GetCurrentProcess (), TOKEN_ADJUST_PRIVILEGES, &tokenHandle))
|
|
{
|
|
LUID value;
|
|
|
|
if (LookupPrivilegeValue (NULL, privName, &value))
|
|
{
|
|
TOKEN_PRIVILEGES newState;
|
|
DWORD error;
|
|
|
|
newState.PrivilegeCount = 1;
|
|
newState.Privileges[0].Luid = value;
|
|
newState.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
|
|
|
|
/*
|
|
** We will always call GetLastError below, so clear
|
|
** any prior error values on this thread.
|
|
*/
|
|
SetLastError (ERROR_SUCCESS);
|
|
|
|
stat = AdjustTokenPrivileges (tokenHandle,
|
|
FALSE,
|
|
&newState,
|
|
(DWORD)0,
|
|
NULL,
|
|
NULL);
|
|
|
|
/*
|
|
** Supposedly, AdjustTokenPriveleges always returns TRUE
|
|
** (even when it fails). So, call GetLastError to be
|
|
** extra sure everything's cool.
|
|
*/
|
|
if ((error = GetLastError()) != ERROR_SUCCESS)
|
|
{
|
|
stat = FALSE;
|
|
}
|
|
|
|
if (!stat)
|
|
{
|
|
wprintf (L"AdjustTokenPrivileges for %s failed with 0x%08X",
|
|
privName,
|
|
error);
|
|
}
|
|
}
|
|
|
|
|
|
CloseHandle (tokenHandle);
|
|
}
|
|
|
|
return stat;
|
|
}
|
|
|
|
|
|
|
|
static HRESULT DoTest01 ()
|
|
{
|
|
HRESULT hrStatus;
|
|
LPWSTR pwszVolumeArray [3] = {L"C:\\", L"V:\\", L"E:\\"};
|
|
ULONG ulOptionFlags = VSS_SW_BOOTABLE_STATE;
|
|
GUID guidSnapshotSetId;
|
|
|
|
::CoCreateGuid( &guidSnapshotSetId );
|
|
|
|
IVssAsync *pIAsync = NULL;
|
|
|
|
wprintf (L"\n\nTest 1 - Bootable State, Synchronous\n\n");
|
|
wprintf (L"Simulating snapshot freeze - should work\n");
|
|
|
|
hrStatus = SimulateSnapshotFreeze (guidSnapshotSetId,
|
|
ulOptionFlags,
|
|
sizeof (pwszVolumeArray) / sizeof (pwszVolumeArray [0]),
|
|
pwszVolumeArray,
|
|
&pIAsync);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotFreeze() returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
if ( pIAsync != NULL )
|
|
{
|
|
HRESULT hrStatusAsync;
|
|
hrStatus = pIAsync->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync->Wait();
|
|
|
|
hrStatus = pIAsync->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync->Release();
|
|
}
|
|
|
|
wprintf (L"Simulating snapshot thaw\n");
|
|
|
|
hrStatus = SimulateSnapshotThaw (guidSnapshotSetId);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotThaw() returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
|
|
return (hrStatus);
|
|
}
|
|
|
|
|
|
|
|
static HRESULT DoTest02 ()
|
|
{
|
|
HRESULT hrStatus;
|
|
LPWSTR pwszVolumeArray [3] = {L"C:\\", L"V:\\", L"E:\\"};
|
|
ULONG ulOptionFlags = 0;
|
|
GUID guidSnapshotSetId;
|
|
|
|
::CoCreateGuid( &guidSnapshotSetId );
|
|
|
|
IVssAsync *pIAsync = NULL;
|
|
|
|
wprintf (L"\n\nTest 2 - Service State, Synchronous\n\n");
|
|
wprintf (L"Simulating snapshot freeze - should work\n");
|
|
|
|
hrStatus = SimulateSnapshotFreeze (guidSnapshotSetId,
|
|
ulOptionFlags,
|
|
sizeof (pwszVolumeArray) / sizeof (pwszVolumeArray [0]),
|
|
pwszVolumeArray,
|
|
&pIAsync);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotFreeze() returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
if ( pIAsync != NULL )
|
|
{
|
|
HRESULT hrStatusAsync;
|
|
hrStatus = pIAsync->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync->Wait();
|
|
|
|
hrStatus = pIAsync->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync->Release();
|
|
}
|
|
|
|
|
|
wprintf (L"Simulating snapshot thaw\n");
|
|
|
|
hrStatus = SimulateSnapshotThaw (guidSnapshotSetId);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotThaw() returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
|
|
|
|
return (hrStatus);
|
|
}
|
|
|
|
|
|
static HRESULT DoTest03()
|
|
{
|
|
HRESULT hrStatus;
|
|
LPWSTR pwszVolumeArray [3] = {L"C:\\", L"V:\\", L"E:\\"};
|
|
ULONG ulOptionFlags = VSS_SW_BOOTABLE_STATE;
|
|
GUID guidSnapshotSetId;
|
|
|
|
::CoCreateGuid( &guidSnapshotSetId );
|
|
|
|
IVssAsync *pIAsync = NULL;
|
|
|
|
wprintf (L"\n\nTest 3 - Bootable State, Asynchronous\n\n");
|
|
wprintf (L"Simulating snapshot freeze with Cancel - should work\n");
|
|
|
|
hrStatus = SimulateSnapshotFreeze (guidSnapshotSetId,
|
|
ulOptionFlags,
|
|
sizeof (pwszVolumeArray) / sizeof (pwszVolumeArray [0]),
|
|
pwszVolumeArray,
|
|
&pIAsync);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotFreeze() returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
if ( pIAsync != NULL )
|
|
{
|
|
HRESULT hrStatusAsync;
|
|
hrStatus = pIAsync->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
wprintf (L"Waiting 5 seconds and then calling Cancel\n" );
|
|
Sleep( 5000 );
|
|
wprintf (L"Cancelling\n" );
|
|
pIAsync->Cancel();
|
|
|
|
do {
|
|
Sleep( 1000 );
|
|
hrStatus = pIAsync->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
} while ( !FAILED( hrStatus ) && hrStatusAsync == VSS_S_ASYNC_PENDING );
|
|
|
|
pIAsync->Release();
|
|
}
|
|
#if 0
|
|
wprintf (L"Simulating snapshot thaw\n");
|
|
|
|
hrStatus = SimulateSnapshotThaw (guidSnapshotSetId);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotThaw() returned 0x%08X\n", hrStatus);
|
|
}
|
|
#endif
|
|
return (hrStatus);
|
|
}
|
|
|
|
|
|
|
|
static HRESULT DoTest05 ()
|
|
{
|
|
HRESULT hrStatus;
|
|
ULONG ulOptionFlags = VSS_SW_BOOTABLE_STATE;
|
|
GUID guidSnapshotSetId;
|
|
|
|
::CoCreateGuid( &guidSnapshotSetId );
|
|
|
|
IVssAsync *pIAsync = NULL;
|
|
|
|
wprintf (L"\n\nTest 5 - Bootable State, Synchronous, no volumes\n\n");
|
|
wprintf (L"Simulating snapshot freeze - should work\n");
|
|
|
|
hrStatus = SimulateSnapshotFreeze (guidSnapshotSetId,
|
|
ulOptionFlags,
|
|
0,
|
|
NULL,
|
|
&pIAsync);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotFreeze() returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
if ( pIAsync != NULL )
|
|
{
|
|
HRESULT hrStatusAsync;
|
|
hrStatus = pIAsync->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync->Wait();
|
|
|
|
hrStatus = pIAsync->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync->Release();
|
|
}
|
|
|
|
|
|
wprintf (L"Simulating snapshot thaw\n");
|
|
|
|
hrStatus = SimulateSnapshotThaw (guidSnapshotSetId);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotThaw() returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
|
|
|
|
return (hrStatus);
|
|
}
|
|
|
|
|
|
|
|
static HRESULT DoTest06 ()
|
|
{
|
|
HRESULT hrStatus;
|
|
ULONG ulOptionFlags = 0;
|
|
GUID guidSnapshotSetId;
|
|
IVssAsync *pIAsync = NULL;
|
|
|
|
::CoCreateGuid( &guidSnapshotSetId );
|
|
|
|
wprintf (L"\n\nTest 6 - Service State, Synchronous, no volumes\n\n");
|
|
wprintf (L"Simulating snapshot freeze - should NOT work\n");
|
|
|
|
hrStatus = SimulateSnapshotFreeze (guidSnapshotSetId,
|
|
ulOptionFlags,
|
|
0,
|
|
NULL,
|
|
&pIAsync);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotFreeze() returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
if ( pIAsync != NULL )
|
|
{
|
|
HRESULT hrStatusAsync;
|
|
hrStatus = pIAsync->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync->Wait();
|
|
|
|
hrStatus = pIAsync->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync->Release();
|
|
}
|
|
|
|
|
|
wprintf (L"Simulating snapshot thaw\n");
|
|
|
|
hrStatus = SimulateSnapshotThaw (guidSnapshotSetId);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotThaw() returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
|
|
|
|
return (hrStatus);
|
|
}
|
|
|
|
|
|
|
|
|
|
static HRESULT DoTest07 ()
|
|
{
|
|
HRESULT hrStatus;
|
|
LPWSTR pwszVolumeArray [3] = {L"C:\\", L"V:\\", L"E:\\"};
|
|
ULONG ulOptionFlags = 0x40 | VSS_SW_BOOTABLE_STATE;
|
|
GUID guidSnapshotSetId;
|
|
IVssAsync *pIAsync = NULL;
|
|
|
|
::CoCreateGuid( &guidSnapshotSetId );
|
|
|
|
wprintf (L"\n\nTest 7 - Bootable State, Synchronous, Extra Options set\n\n");
|
|
wprintf (L"Simulating snapshot freeze - should NOT work\n");
|
|
|
|
hrStatus = SimulateSnapshotFreeze (guidSnapshotSetId,
|
|
ulOptionFlags,
|
|
sizeof (pwszVolumeArray) / sizeof (pwszVolumeArray [0]),
|
|
pwszVolumeArray,
|
|
&pIAsync);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotFreeze() returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
if ( pIAsync != NULL )
|
|
{
|
|
HRESULT hrStatusAsync;
|
|
hrStatus = pIAsync->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync->Wait();
|
|
|
|
hrStatus = pIAsync->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync->Release();
|
|
}
|
|
|
|
|
|
|
|
wprintf (L"Simulating snapshot thaw\n");
|
|
|
|
hrStatus = SimulateSnapshotThaw (guidSnapshotSetId);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotThaw() returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
|
|
|
|
return (hrStatus);
|
|
}
|
|
|
|
|
|
|
|
static HRESULT DoTest08 ()
|
|
{
|
|
HRESULT hrStatus;
|
|
LPWSTR pwszVolumeArray [3] = {L"C:\\", L"V:\\", L"E:\\"};
|
|
ULONG ulOptionFlags = 0x40;
|
|
GUID guidSnapshotSetId;
|
|
IVssAsync *pIAsync = NULL;
|
|
|
|
::CoCreateGuid( &guidSnapshotSetId );
|
|
|
|
wprintf (L"\n\nTest 8 - Service State, Synchronous, Extra Options set\n\n");
|
|
wprintf (L"Simulating snapshot freeze - should NOT work\n");
|
|
|
|
hrStatus = SimulateSnapshotFreeze (guidSnapshotSetId,
|
|
ulOptionFlags,
|
|
sizeof (pwszVolumeArray) / sizeof (pwszVolumeArray [0]),
|
|
pwszVolumeArray,
|
|
&pIAsync);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotFreeze() returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
if ( pIAsync != NULL )
|
|
{
|
|
HRESULT hrStatusAsync;
|
|
hrStatus = pIAsync->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync->Wait();
|
|
|
|
hrStatus = pIAsync->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync->Release();
|
|
}
|
|
|
|
|
|
wprintf (L"Simulating snapshot thaw\n");
|
|
|
|
hrStatus = SimulateSnapshotThaw (guidSnapshotSetId);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotThaw() returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
|
|
|
|
return (hrStatus);
|
|
}
|
|
|
|
|
|
static HRESULT DoTest09 ()
|
|
{
|
|
HRESULT hrStatus;
|
|
ULONG ulOptionFlags = 0x0 | VSS_SW_BOOTABLE_STATE;
|
|
GUID guidSnapshotSetId;
|
|
IVssAsync *pIAsync = NULL;
|
|
|
|
::CoCreateGuid( &guidSnapshotSetId );
|
|
|
|
wprintf (L"\n\nTest 9 - Bootable State, Synchronous, No volume list\n\n");
|
|
wprintf (L"Simulating snapshot freeze - should work\n");
|
|
|
|
hrStatus = SimulateSnapshotFreeze (guidSnapshotSetId,
|
|
ulOptionFlags,
|
|
0,
|
|
NULL,
|
|
&pIAsync);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotFreeze() returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
if ( pIAsync != NULL )
|
|
{
|
|
HRESULT hrStatusAsync;
|
|
hrStatus = pIAsync->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync->Wait();
|
|
|
|
hrStatus = pIAsync->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync->Release();
|
|
}
|
|
|
|
|
|
wprintf (L"Simulating snapshot thaw\n");
|
|
|
|
hrStatus = SimulateSnapshotThaw (guidSnapshotSetId);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotThaw() returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
|
|
|
|
return (hrStatus);
|
|
}
|
|
|
|
|
|
static HRESULT DoTest10 ()
|
|
{
|
|
HRESULT hrStatus;
|
|
ULONG ulOptionFlags = 0x0;
|
|
GUID guidSnapshotSetId;
|
|
IVssAsync *pIAsync = NULL;
|
|
|
|
::CoCreateGuid( &guidSnapshotSetId );
|
|
|
|
wprintf (L"\n\nTest 10 - Service State, Synchronous, No volume list\n\n");
|
|
wprintf (L"Simulating snapshot freeze - should NOT work\n");
|
|
|
|
hrStatus = SimulateSnapshotFreeze (guidSnapshotSetId,
|
|
ulOptionFlags,
|
|
0,
|
|
NULL,
|
|
&pIAsync);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotFreeze() returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
if ( pIAsync != NULL )
|
|
{
|
|
HRESULT hrStatusAsync;
|
|
hrStatus = pIAsync->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync->Wait();
|
|
|
|
hrStatus = pIAsync->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync->Release();
|
|
}
|
|
|
|
|
|
wprintf (L"Simulating snapshot thaw\n");
|
|
|
|
hrStatus = SimulateSnapshotThaw (guidSnapshotSetId);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotThaw() returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
|
|
|
|
return (hrStatus);
|
|
}
|
|
|
|
|
|
static HRESULT DoTest11 ()
|
|
{
|
|
HRESULT hrStatus;
|
|
ULONG ulOptionFlags = 0x0;
|
|
GUID guidSnapshotSetId;
|
|
IVssAsync *pIAsync = NULL;
|
|
|
|
::CoCreateGuid( &guidSnapshotSetId );
|
|
|
|
wprintf (L"\n\nTest 11 - Service State, Synchronous, One volume with bad volume list pointer\n\n");
|
|
wprintf (L"Simulating snapshot freeze - should NOT work\n");
|
|
|
|
hrStatus = SimulateSnapshotFreeze (guidSnapshotSetId,
|
|
ulOptionFlags,
|
|
01,
|
|
NULL,
|
|
&pIAsync);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotFreeze() returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
if ( pIAsync != NULL )
|
|
{
|
|
HRESULT hrStatusAsync;
|
|
hrStatus = pIAsync->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync->Wait();
|
|
|
|
hrStatus = pIAsync->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync->Release();
|
|
}
|
|
|
|
|
|
wprintf (L"Simulating snapshot thaw\n");
|
|
|
|
hrStatus = SimulateSnapshotThaw (guidSnapshotSetId);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotThaw() returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
|
|
|
|
return (hrStatus);
|
|
}
|
|
|
|
|
|
static HRESULT DoTest12 ()
|
|
{
|
|
HRESULT hrStatus;
|
|
LPWSTR pwszVolumeArray [3] = {L"C:\\", L"V:\\", L"E:\\"};
|
|
ULONG ulOptionFlags = 0x0;
|
|
GUID guidSnapshotSetId1;
|
|
GUID guidSnapshotSetId2;
|
|
IVssAsync *pIAsync = NULL;
|
|
|
|
::CoCreateGuid( &guidSnapshotSetId1 );
|
|
::CoCreateGuid( &guidSnapshotSetId2 );
|
|
|
|
wprintf (L"\n\nTest 12 - Service State, Synchronous, nested call\n\n");
|
|
wprintf (L"Simulating snapshot freeze (GUID1)\n");
|
|
|
|
hrStatus = SimulateSnapshotFreeze (guidSnapshotSetId1,
|
|
ulOptionFlags,
|
|
sizeof (pwszVolumeArray) / sizeof (pwszVolumeArray [0]),
|
|
pwszVolumeArray,
|
|
&pIAsync);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotFreeze(GUID1) returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
if ( pIAsync != NULL )
|
|
{
|
|
HRESULT hrStatusAsync;
|
|
hrStatus = pIAsync->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync->Wait();
|
|
|
|
hrStatus = pIAsync->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync->Release();
|
|
}
|
|
|
|
|
|
IVssAsync *pIAsync2 = NULL;
|
|
|
|
wprintf (L"Simulating snapshot freeze (GUID2) - should NOT work\n");
|
|
|
|
hrStatus = SimulateSnapshotFreeze (guidSnapshotSetId2,
|
|
ulOptionFlags,
|
|
sizeof (pwszVolumeArray) / sizeof (pwszVolumeArray [0]),
|
|
pwszVolumeArray,
|
|
&pIAsync2);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotFreeze(GUID2) returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
if ( pIAsync2 != NULL )
|
|
{
|
|
HRESULT hrStatusAsync;
|
|
hrStatus = pIAsync2->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync2->Wait();
|
|
|
|
hrStatus = pIAsync2->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync2->Release();
|
|
}
|
|
|
|
wprintf (L"Simulating snapshot thaw (GUID2)\n");
|
|
|
|
hrStatus = SimulateSnapshotThaw (guidSnapshotSetId2);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotThaw(GUID2) returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
|
|
wprintf (L"Simulating snapshot thaw (GUID1)\n");
|
|
|
|
hrStatus = SimulateSnapshotThaw (guidSnapshotSetId1);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotThaw(GUID1) returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
|
|
|
|
return (hrStatus);
|
|
}
|
|
|
|
|
|
|
|
static HRESULT DoTest13 ()
|
|
{
|
|
HRESULT hrStatus;
|
|
LPWSTR pwszVolumeArray [3] = {L"C:\\", L"V:\\", L"E:\\"};
|
|
ULONG ulOptionFlags = 0x0;
|
|
GUID guidSnapshotSetId1;
|
|
GUID guidSnapshotSetId2;
|
|
IVssAsync *pIAsync = NULL;
|
|
|
|
::CoCreateGuid( &guidSnapshotSetId1 );
|
|
::CoCreateGuid( &guidSnapshotSetId2 );
|
|
|
|
wprintf (L"\n\nTest 13 - Service State, Synchronous, nested call (reverse thaw)\n\n");
|
|
wprintf (L"Simulating snapshot freeze (GUID1)\n");
|
|
|
|
hrStatus = SimulateSnapshotFreeze (guidSnapshotSetId1,
|
|
ulOptionFlags,
|
|
sizeof (pwszVolumeArray) / sizeof (pwszVolumeArray [0]),
|
|
pwszVolumeArray,
|
|
&pIAsync);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotFreeze(GUID1) returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
if ( pIAsync != NULL )
|
|
{
|
|
HRESULT hrStatusAsync;
|
|
hrStatus = pIAsync->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync->Wait();
|
|
|
|
hrStatus = pIAsync->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync->Release();
|
|
}
|
|
|
|
|
|
IVssAsync *pIAsync2 = NULL;
|
|
|
|
|
|
wprintf (L"Simulating snapshot freeze (GUID2)\n");
|
|
|
|
hrStatus = SimulateSnapshotFreeze (guidSnapshotSetId2,
|
|
ulOptionFlags,
|
|
sizeof (pwszVolumeArray) / sizeof (pwszVolumeArray [0]),
|
|
pwszVolumeArray,
|
|
&pIAsync2);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotFreeze(GUID2) returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
if ( pIAsync2 != NULL )
|
|
{
|
|
HRESULT hrStatusAsync;
|
|
hrStatus = pIAsync2->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync2->Wait();
|
|
|
|
hrStatus = pIAsync2->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync2->Release();
|
|
}
|
|
|
|
|
|
wprintf (L"Simulating snapshot thaw (GUID1)\n");
|
|
|
|
hrStatus = SimulateSnapshotThaw (guidSnapshotSetId1);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotThaw(GUID1) returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
|
|
wprintf (L"Simulating snapshot thaw (GUID2)\n");
|
|
|
|
hrStatus = SimulateSnapshotThaw (guidSnapshotSetId2);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotThaw(GUID2) returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
|
|
|
|
return (hrStatus);
|
|
}
|
|
|
|
|
|
|
|
|
|
static HRESULT DoTest14 ()
|
|
{
|
|
HRESULT hrStatus = NOERROR;
|
|
HRESULT hrStatusAsync = NOERROR;
|
|
IVssBackupComponents *pIVssBackupComponents = NULL;
|
|
VSS_ID SnapshotId = GUID_NULL;
|
|
IVssAsync *pIVssAsync = NULL;
|
|
GUID guidSnapshotSetId = GUID_NULL;
|
|
GUID guidSnapshotSetId2;
|
|
|
|
::CoCreateGuid( &guidSnapshotSetId2 );
|
|
|
|
wprintf (L"\n\nTest 14 - Bootable State, Synchronous, during DoSnapshot\n\n");
|
|
|
|
wprintf (L"Calling CreateVssBackupComponents ()\n");
|
|
|
|
hrStatus = CreateVssBackupComponents (&pIVssBackupComponents);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"CreateVssBackupComponents () returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
|
|
|
|
wprintf (L"Calling InitializeForBackup ()\n");
|
|
|
|
hrStatus = pIVssBackupComponents->InitializeForBackup ();
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"InitializeForBackup () returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
wprintf (L"Calling SetBackupState ()\n");
|
|
|
|
hrStatus = pIVssBackupComponents->SetBackupState (true, true, VSS_BT_FULL);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SetBackupState () returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
|
|
|
|
wprintf (L"Calling GatherWriterMetadata ()\n");
|
|
|
|
hrStatus = pIVssBackupComponents->GatherWriterMetadata (&pIVssAsync);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"GatherWriterMetadata () returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
|
|
wprintf (L"Calling Wait () (for GatherWriterMetadata() to complete)\n");
|
|
|
|
hrStatus = pIVssAsync->Wait ();
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"Wait () returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
|
|
|
|
|
|
wprintf (L"Calling StartSnapshotSet ()\n");
|
|
|
|
hrStatus = pIVssBackupComponents->StartSnapshotSet (&guidSnapshotSetId);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"StartSnapshotSet () returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
|
|
|
|
|
|
wprintf (L"Calling AddToSnapshotSet ()\n");
|
|
|
|
hrStatus = pIVssBackupComponents->AddToSnapshotSet (L"E:\\",
|
|
GUID_NULL,
|
|
&SnapshotId);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"AddToSnapshotSet () returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
|
|
|
|
|
|
wprintf (L"Calling PrepareForBackup ()\n");
|
|
|
|
hrStatus = pIVssBackupComponents->PrepareForBackup (&pIVssAsync);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"PrepareForBackup () returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
|
|
|
|
|
|
wprintf (L"Calling Wait () (for PrepareForBackup() to complete)\n");
|
|
|
|
hrStatus = pIVssAsync->Wait ();
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"Wait () returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
|
|
|
|
|
|
wprintf (L"Calling QueryStatus ()\n");
|
|
|
|
hrStatus = pIVssAsync->QueryStatus (&hrStatusAsync, 0);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"QueryStatus () returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
|
|
|
|
|
|
wprintf (L"Calling DoSnapshotSet ()\n");
|
|
|
|
hrStatus = pIVssBackupComponents->DoSnapshotSet (&pIVssAsync);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"DoSnapshotSet () returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
|
|
|
|
wprintf (L"Calling SimulateSnapshotFreeze () - should NOT work\n");
|
|
|
|
IVssAsync *pIAsync = NULL;
|
|
|
|
hrStatus = SimulateSnapshotFreeze (guidSnapshotSetId2,
|
|
VSS_SW_BOOTABLE_STATE,
|
|
0,
|
|
NULL,
|
|
&pIAsync);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotFreeze () returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
if ( pIAsync != NULL )
|
|
{
|
|
HRESULT hrStatusAsync;
|
|
hrStatus = pIAsync->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync->Wait();
|
|
|
|
hrStatus = pIAsync->QueryStatus( &hrStatusAsync, 0 );
|
|
wprintf (L"QueryStatus () returned: 0x%08X, hrStatusAsync: 0x%08x\n", hrStatus, hrStatusAsync);
|
|
|
|
pIAsync->Release();
|
|
}
|
|
|
|
|
|
wprintf (L"Calling SimulateSnapshotThaw ()\n");
|
|
|
|
hrStatus = SimulateSnapshotThaw (guidSnapshotSetId2);
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"SimulateSnapshotThaw () returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
|
|
wprintf (L"Calling Wait () (for DoSnapshotSet () to complete) ()\n");
|
|
|
|
hrStatus = pIVssAsync->Wait();
|
|
|
|
if (FAILED (hrStatus))
|
|
{
|
|
wprintf (L"Wait () returned 0x%08X\n", hrStatus);
|
|
}
|
|
|
|
pIVssAsync->Release();
|
|
pIVssBackupComponents->Release();
|
|
|
|
return (hrStatus);
|
|
}
|
|
|