2025-11-28 00:35:46 +09:00

188 lines
7.1 KiB
C++

/////////////////////////////////////////////////////////////////////////
// Copyright © Microsoft Corporation. All rights reserved.
//
// This file may contain preliminary information or inaccuracies,
// and may not correctly represent any associated Microsoft
// Product as commercially released. All Materials are provided entirely
// “AS IS.” To the extent permitted by law, MICROSOFT MAKES NO
// WARRANTY OF ANY KIND, DISCLAIMS ALL EXPRESS, IMPLIED AND STATUTORY
// WARRANTIES, AND ASSUMES NO LIABILITY TO YOU FOR ANY DAMAGES OF
// ANY TYPE IN CONNECTION WITH THESE MATERIALS OR ANY INTELLECTUAL PROPERTY IN THEM.
//
// Main header
#include "stdafx.h"
/////////////////////////////////////////////////////////////////////////
// Tracing class (very simple implementation)
//
bool FunctionTracer::m_traceEnabled = false;
// Console logging routine
// Can throw HRESULT on invalid formats
void FunctionTracer::WriteLine(wstring format, ...)
{
wstring buffer;
VPRINTF_VAR_PARAMS(buffer, format);
wprintf(L"%s\n", buffer.c_str());
Trace(m_fileName, m_lineNumber, m_functionName, L"OUTPUT: %s", buffer.c_str());
}
// Tracing routine
// Can throw HRESULT on invalid formats
void FunctionTracer::Trace(wstring file, int line, wstring functionName, wstring format, ...)
{
if (m_traceEnabled)
{
wstring buffer;
VPRINTF_VAR_PARAMS(buffer, format);
size_t pos = file.find_last_of(L"\\");
wstring fileName = (pos == wstring::npos)? file: file.substr(pos+1);
// TODO - put here your own implementation of a tracing routine, if needed
wprintf(L"[[%40s @ %10s:%4d]] %s\n", functionName.c_str(), fileName.c_str(), line, buffer.c_str());
}
}
// Constructor
FunctionTracer::FunctionTracer(wstring fileName, INT lineNumber, wstring functionName):
m_fileName(fileName), m_lineNumber(lineNumber), m_functionName(functionName)
{
if (m_traceEnabled)
Trace(m_fileName, m_lineNumber, m_functionName, L"ENTER %s", m_functionName.c_str());
}
// Destructor
FunctionTracer::~FunctionTracer()
{
if (m_traceEnabled)
Trace(m_fileName, m_lineNumber, m_functionName, L"EXIT %s", m_functionName.c_str());;
}
// Enable tracing mode
void FunctionTracer::EnableTracingMode()
{
m_traceEnabled = true;
}
// Convert a failure type into a string
wstring FunctionTracer::HResult2String(HRESULT hrError)
{
switch (hrError)
{
CHECK_CASE_FOR_CONSTANT(VSS_E_BAD_STATE );
CHECK_CASE_FOR_CONSTANT(VSS_E_UNEXPECTED );
CHECK_CASE_FOR_CONSTANT(VSS_E_PROVIDER_ALREADY_REGISTERED );
CHECK_CASE_FOR_CONSTANT(VSS_E_PROVIDER_NOT_REGISTERED);
CHECK_CASE_FOR_CONSTANT(VSS_E_PROVIDER_VETO );
CHECK_CASE_FOR_CONSTANT(VSS_E_PROVIDER_IN_USE);
CHECK_CASE_FOR_CONSTANT(VSS_E_OBJECT_NOT_FOUND);
CHECK_CASE_FOR_CONSTANT(VSS_S_ASYNC_PENDING );
CHECK_CASE_FOR_CONSTANT(VSS_S_ASYNC_FINISHED);
CHECK_CASE_FOR_CONSTANT(VSS_S_ASYNC_CANCELLED);
CHECK_CASE_FOR_CONSTANT(VSS_E_VOLUME_NOT_SUPPORTED );
CHECK_CASE_FOR_CONSTANT(VSS_E_VOLUME_NOT_SUPPORTED_BY_PROVIDER );
CHECK_CASE_FOR_CONSTANT(VSS_E_OBJECT_ALREADY_EXISTS );
CHECK_CASE_FOR_CONSTANT(VSS_E_UNEXPECTED_PROVIDER_ERROR );
CHECK_CASE_FOR_CONSTANT(VSS_E_INVALID_XML_DOCUMENT );
CHECK_CASE_FOR_CONSTANT(VSS_E_MAXIMUM_NUMBER_OF_VOLUMES_REACHED );
CHECK_CASE_FOR_CONSTANT(VSS_E_FLUSH_WRITES_TIMEOUT );
CHECK_CASE_FOR_CONSTANT(VSS_E_HOLD_WRITES_TIMEOUT );
CHECK_CASE_FOR_CONSTANT(VSS_E_UNEXPECTED_WRITER_ERROR );
CHECK_CASE_FOR_CONSTANT(VSS_E_SNAPSHOT_SET_IN_PROGRESS );
CHECK_CASE_FOR_CONSTANT(VSS_E_MAXIMUM_NUMBER_OF_SNAPSHOTS_REACHED );
CHECK_CASE_FOR_CONSTANT(VSS_E_WRITER_INFRASTRUCTURE );
CHECK_CASE_FOR_CONSTANT(VSS_E_WRITER_NOT_RESPONDING );
CHECK_CASE_FOR_CONSTANT(VSS_E_WRITER_ALREADY_SUBSCRIBED );
CHECK_CASE_FOR_CONSTANT(VSS_E_UNSUPPORTED_CONTEXT );
CHECK_CASE_FOR_CONSTANT(VSS_E_VOLUME_IN_USE );
CHECK_CASE_FOR_CONSTANT(VSS_E_MAXIMUM_DIFFAREA_ASSOCIATIONS_REACHED );
CHECK_CASE_FOR_CONSTANT(VSS_E_INSUFFICIENT_STORAGE );
CHECK_CASE_FOR_CONSTANT(VSS_E_NO_SNAPSHOTS_IMPORTED );
CHECK_CASE_FOR_CONSTANT(VSS_S_SOME_SNAPSHOTS_NOT_IMPORTED );
CHECK_CASE_FOR_CONSTANT(VSS_E_MAXIMUM_NUMBER_OF_REMOTE_MACHINES_REACHED );
CHECK_CASE_FOR_CONSTANT(VSS_E_REMOTE_SERVER_UNAVAILABLE );
CHECK_CASE_FOR_CONSTANT(VSS_E_REMOTE_SERVER_UNSUPPORTED );
CHECK_CASE_FOR_CONSTANT(VSS_E_REVERT_IN_PROGRESS );
CHECK_CASE_FOR_CONSTANT(VSS_E_REVERT_VOLUME_LOST );
CHECK_CASE_FOR_CONSTANT(VSS_E_REBOOT_REQUIRED );
CHECK_CASE_FOR_CONSTANT(VSS_E_TRANSACTION_FREEZE_TIMEOUT );
CHECK_CASE_FOR_CONSTANT(VSS_E_TRANSACTION_THAW_TIMEOUT );
CHECK_CASE_FOR_CONSTANT(VSS_E_WRITERERROR_INCONSISTENTSNAPSHOT );
CHECK_CASE_FOR_CONSTANT(VSS_E_WRITERERROR_OUTOFRESOURCES);
CHECK_CASE_FOR_CONSTANT(VSS_E_WRITERERROR_TIMEOUT );
CHECK_CASE_FOR_CONSTANT(VSS_E_WRITERERROR_RETRYABLE);
CHECK_CASE_FOR_CONSTANT(VSS_E_WRITERERROR_NONRETRYABLE);
CHECK_CASE_FOR_CONSTANT(VSS_E_WRITERERROR_RECOVERY_FAILED );
CHECK_CASE_FOR_CONSTANT(VSS_E_BREAK_REVERT_ID_FAILED);
CHECK_CASE_FOR_CONSTANT(VSS_E_LEGACY_PROVIDER);
CHECK_CASE_FOR_CONSTANT(VSS_E_MISSING_DISK );
CHECK_CASE_FOR_CONSTANT(VSS_E_MISSING_HIDDEN_VOLUME );
CHECK_CASE_FOR_CONSTANT(VSS_E_MISSING_VOLUME );
CHECK_CASE_FOR_CONSTANT(VSS_E_AUTORECOVERY_FAILED );
CHECK_CASE_FOR_CONSTANT(VSS_E_DYNAMIC_DISK_ERROR );
CHECK_CASE_FOR_CONSTANT(VSS_E_NONTRANSPORTABLE_BCD );
CHECK_CASE_FOR_CONSTANT(VSS_E_CANNOT_REVERT_DISKID );
CHECK_CASE_FOR_CONSTANT(VSS_E_RESYNC_IN_PROGRESS );
CHECK_CASE_FOR_CONSTANT(VSS_E_CLUSTER_ERROR );
CHECK_CASE_FOR_CONSTANT(VSS_E_ASRERROR_DISK_ASSIGNMENT_FAILED );
CHECK_CASE_FOR_CONSTANT(VSS_E_ASRERROR_DISK_RECREATION_FAILED );
CHECK_CASE_FOR_CONSTANT(VSS_E_ASRERROR_NO_ARCPATH );
CHECK_CASE_FOR_CONSTANT(VSS_E_ASRERROR_MISSING_DYNDISK );
CHECK_CASE_FOR_CONSTANT(VSS_E_ASRERROR_SHARED_CRIDISK );
CHECK_CASE_FOR_CONSTANT(VSS_E_ASRERROR_DATADISK_RDISK0 );
CHECK_CASE_FOR_CONSTANT(VSS_E_ASRERROR_RDISK0_TOOSMALL );
CHECK_CASE_FOR_CONSTANT(VSS_E_ASRERROR_CRITICAL_DISKS_TOO_SMALL );
CHECK_CASE_FOR_CONSTANT(VSS_E_WRITER_STATUS_NOT_AVAILABLE );
CHECK_CASE_FOR_CONSTANT(VSS_E_UNSELECTED_VOLUME );
CHECK_CASE_FOR_CONSTANT(VSS_E_SNAPSHOT_NOT_IN_SET );
CHECK_CASE_FOR_CONSTANT(VSS_E_NESTED_VOLUME_LIMIT );
// Regular COM errors
CHECK_CASE_FOR_CONSTANT(S_OK);
CHECK_CASE_FOR_CONSTANT(S_FALSE);
CHECK_CASE_FOR_CONSTANT(E_UNEXPECTED);
CHECK_CASE_FOR_CONSTANT(E_OUTOFMEMORY);
default:
break;
}
PWCHAR pwszBuffer = NULL;
DWORD dwRet = ::FormatMessageW(
FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_FROM_SYSTEM
| FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, hrError,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPWSTR)&pwszBuffer, 0, NULL);
// No message found for this error. Just return <Unknown>
if (dwRet == 0)
return wstring(L"<Unknown error code>");
// Convert the message into wstring
wstring errorText(pwszBuffer);
LocalFree(pwszBuffer);
return errorText;
}