/*++ Copyright (c) 1999 Microsoft Corporation Abstract: @doc @module Writer.cpp | Implementation of Writer @end Author: Adi Oltean [aoltean] 08/18/1999 TBD: Add comments. Revision History: Name Date Comments aoltean 08/18/1999 Created aoltean 09/22/1999 Making console output clearer mikejohn 09/19/2000 176860: Added calling convention methods where missing --*/ ///////////////////////////////////////////////////////////////////////////// // 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 "vs_assert.hxx" #include "vss.h" #include "vsevent.h" #include "vswriter.h" #include "tsub.h" ///////////////////////////////////////////////////////////////////////////// // constants const WCHAR g_wszTSubApplicationName[] = L"TSub"; ///////////////////////////////////////////////////////////////////////////// // globals DWORD g_dwMainThreadId = 0; VSS_ID s_WRITERID = { 0xac510e8c, 0x6bef, 0x4c78, 0x86, 0xb7, 0xcb, 0x99, 0xcd, 0x93, 0x45, 0x6c }; LPCWSTR s_WRITERNAME = L"TESTWRITER"; CVssTSubWriter::CVssTSubWriter() { Initialize ( s_WRITERID, s_WRITERNAME, VSS_UT_USERDATA, VSS_ST_OTHER, VSS_APP_FRONT_END, 60 * 1000 * 10 ); // Timeout - ten minutes } ///////////////////////////////////////////////////////////////////////////// // class CVssTSubWriter bool STDMETHODCALLTYPE CVssTSubWriter::OnPrepareSnapshot() { wprintf( L"OnPrepare\n\t#volumes = %ld\n", GetCurrentVolumeCount() ); for(UINT nIndex = 0; nIndex < GetCurrentVolumeCount(); nIndex++) wprintf( L"\tVolume no. %ld: %s\n", nIndex, GetCurrentVolumeArray()[nIndex]); WCHAR wszPwd[MAX_PATH]; DWORD dwChars = GetCurrentDirectoryW( MAX_PATH, wszPwd); bool bPwdIsAffected = IsPathAffected( wszPwd ); if (dwChars > 0) wprintf( L"Current directory %s is affected by snapshot? %s\n\n", wszPwd, bPwdIsAffected? L"Yes": L"No"); return true; } bool STDMETHODCALLTYPE CVssTSubWriter::OnFreeze() { wprintf ( L"OnFreeze\n\tmy level = %d\n\n", GetCurrentLevel() ); return true; } bool STDMETHODCALLTYPE CVssTSubWriter::OnThaw() { wprintf( L"OnThaw\n\n"); return true; } bool STDMETHODCALLTYPE CVssTSubWriter::OnAbort() { wprintf( L"OnAbort\n\n"); return true; } ///////////////////////////////////////////////////////////////////////////// // Control-C handler routine BOOL WINAPI CtrlC_HandlerRoutine( IN DWORD /* dwType */ ) { // End the message loop if (g_dwMainThreadId != 0) PostThreadMessage(g_dwMainThreadId, WM_QUIT, 0, 0); // Mark that the break was handled. return TRUE; } ///////////////////////////////////////////////////////////////////////////// // WinMain extern "C" int __cdecl wmain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPTSTR /*lpCmdLine*/, int /*nShowCmd*/) { int nRet = 0; try { // Preparing the CTRL-C handling routine - only for testing... g_dwMainThreadId = GetCurrentThreadId(); ::SetConsoleCtrlHandler(CtrlC_HandlerRoutine, TRUE); // Initialize COM library HRESULT hr = CoInitialize(NULL); if (FAILED(hr)) { _ASSERTE(FALSE && "Failure in initializing the COM library"); throw hr; } // Declare a CVssTSubWriter instance CVssTSubWriter *pInstance = new CVssTSubWriter; if (pInstance == NULL) throw E_OUTOFMEMORY; // Subscribe the object. pInstance->Subscribe(); // message loop - need for STA server MSG msg; while (GetMessage(&msg, 0, 0, 0)) DispatchMessage(&msg); // Subscribe the object. pInstance->Unsubscribe(); delete pInstance; // Uninitialize COM library CoUninitialize(); } catch(...) { _ASSERTE(FALSE && "Unexpected exception"); } return nRet; }