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.
164 lines
4.7 KiB
164 lines
4.7 KiB
/*++
|
|
|
|
Copyright (c) 2000-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
client.cpp
|
|
|
|
Abstract:
|
|
|
|
Test program to drive the VSS Writer Shim contained in VssAPI.DLL
|
|
|
|
Author:
|
|
|
|
Stefan R. Steiner [ssteiner] 01-30-2000
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Defines
|
|
|
|
// C4290: C++ Exception Specification ignored
|
|
#pragma warning(disable:4290)
|
|
// warning C4511: 'CVssCOMApplication' : copy constructor could not be generated
|
|
#pragma warning(disable:4511)
|
|
// warning C4127: conditional expression is constant
|
|
#pragma warning(disable:4127)
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Includes
|
|
|
|
#include <windows.h>
|
|
#include <wtypes.h>
|
|
#include <stddef.h>
|
|
#include <stdio.h>
|
|
#include <objbase.h>
|
|
|
|
#include <vss.h>
|
|
|
|
typedef HRESULT ( APIENTRY *PFUNC_RegisterSnapshotSubscriptions )( void );
|
|
typedef HRESULT ( APIENTRY *PFUNC_UnregisterSnapshotSubscriptions )( void );
|
|
typedef HRESULT ( APIENTRY *PFUNC_SimulateSnapshotFreeze )( PWCHAR pwszSnapshotSetId, PWCHAR pwszVolumeNamesList );
|
|
typedef HRESULT ( APIENTRY *PFUNC_SimulateSnapshotThaw )( PWCHAR pwszSnapshotSetId );
|
|
|
|
|
|
|
|
static BOOL AssertPrivilege( LPCWSTR privName );
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// WinMain
|
|
|
|
extern "C" int __cdecl wmain( int argc, WCHAR *argv[] )
|
|
{
|
|
HINSTANCE hInstLib;
|
|
PFUNC_RegisterSnapshotSubscriptions pFnRegisterSS;
|
|
PFUNC_UnregisterSnapshotSubscriptions pFnUnregisterSS;
|
|
HRESULT hr;
|
|
|
|
if ( !AssertPrivilege( SE_BACKUP_NAME ) )
|
|
{
|
|
wprintf( L"AssertPrivilege returned error, rc:%d\n", GetLastError() );
|
|
return 2;
|
|
}
|
|
|
|
hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
|
|
if ( FAILED( hr ) )
|
|
{
|
|
wprintf( L"CoInitialize() returned rc:%d\n", GetLastError() );
|
|
return 1;
|
|
}
|
|
|
|
// Get a handle to the DLL module
|
|
hInstLib = LoadLibrary( L"VssAPI.dll" );
|
|
|
|
if ( hInstLib != NULL )
|
|
{
|
|
pFnRegisterSS = ( PFUNC_RegisterSnapshotSubscriptions )GetProcAddress( hInstLib, "RegisterSnapshotSubscriptions" );
|
|
if ( pFnRegisterSS != NULL )
|
|
wprintf( L"pFnRegisterSS returned: 0x%08x\n", ( pFnRegisterSS )() );
|
|
else
|
|
wprintf( L"Couldn't import RegisterSnapshotSubscriptions function, rc:%d\n", GetLastError() );
|
|
|
|
wprintf( L"\nPress return to continue...\n" );
|
|
getchar();
|
|
wprintf( L"continuing...\n" );
|
|
|
|
pFnUnregisterSS = ( PFUNC_UnregisterSnapshotSubscriptions )GetProcAddress( hInstLib, "UnregisterSnapshotSubscriptions" );
|
|
if ( pFnUnregisterSS != NULL )
|
|
wprintf( L"pFnUnregisterSS returned: 0x%08x\n", ( pFnUnregisterSS )() );
|
|
else
|
|
wprintf( L"Couldn't import UnregisterSnapshotSubscriptions function, rc:%d\n", GetLastError() );
|
|
|
|
FreeLibrary( hInstLib );
|
|
}
|
|
else
|
|
printf( "LoadLibrary error, rc:%d\n", GetLastError() );
|
|
|
|
|
|
// Uninitialize COM library
|
|
CoUninitialize();
|
|
|
|
return 0;
|
|
|
|
UNREFERENCED_PARAMETER( argv );
|
|
UNREFERENCED_PARAMETER( argc );
|
|
}
|
|
|
|
|
|
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 %d",
|
|
privName,
|
|
error );
|
|
}
|
|
}
|
|
CloseHandle( tokenHandle );
|
|
}
|
|
return stat;
|
|
}
|
|
|