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