Leaked source code of windows server 2003
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

/*
**++
**
** 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);
}