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.
190 lines
5.0 KiB
190 lines
5.0 KiB
/*++
|
|
|
|
Copyright (c) 200 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
assrt.cxx
|
|
|
|
Abstract:
|
|
assertion code used by BS_ASSERT
|
|
|
|
Author:
|
|
|
|
|
|
Revision History:
|
|
Name Date Comments
|
|
brianb 04/19/2000 created
|
|
aoltean 06/20/2000 Adding VssSetDebugReport
|
|
|
|
--*/
|
|
|
|
|
|
extern "C" {
|
|
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
}
|
|
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
|
|
#define STRSAFE_NO_DEPRECATE
|
|
#include <strsafe.h>
|
|
|
|
#undef ASSERT
|
|
|
|
#include "vs_assert.hxx"
|
|
#include "vs_trace.hxx"
|
|
#include "vssmsg.h"
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
// Standard foo for file name aliasing. This code block must be after
|
|
// all includes of VSS header files.
|
|
//
|
|
#ifdef VSS_FILE_ALIAS
|
|
#undef VSS_FILE_ALIAS
|
|
#endif
|
|
#define VSS_FILE_ALIAS "TRCASRTC"
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
// Size of a constant array
|
|
#define SIZEOF_ARRAY(_array) (sizeof (_array) / sizeof ((_array)[0]))
|
|
|
|
|
|
// First two parameters to StringCChPrintf routines.
|
|
#define STRING_CCH_PARAM(_array) _array, (SIZEOF_ARRAY(_array))
|
|
|
|
|
|
// No MP protection...
|
|
static LONG g_lVssDebugReportFlags = VSS_DBG_TO_DEBUG_CONSOLE | VSS_DBG_MESSAGE_BOX;
|
|
|
|
const CHAR x_szEventLogVssSourceName[] = "VSS";
|
|
|
|
|
|
VOID
|
|
AssertFail
|
|
(
|
|
IN LPCSTR FileName,
|
|
IN UINT LineNumber,
|
|
IN LPCSTR Condition
|
|
)
|
|
{
|
|
int i;
|
|
CHAR Title[4096];
|
|
CHAR Msg[4096];
|
|
|
|
DWORD dwCurrentProcessId = GetCurrentProcessId();
|
|
DWORD dwCurrentThreadId = GetCurrentThreadId();
|
|
|
|
if (g_lVssDebugReportFlags & VSS_DBG_TO_DEBUG_CONSOLE)
|
|
{
|
|
StringCchPrintfA(
|
|
STRING_CCH_PARAM(Msg),
|
|
"VSS(PID:%ld,TID:%ld): %s(%d): *** Assertion failure *** %s\n",
|
|
dwCurrentProcessId,
|
|
dwCurrentThreadId,
|
|
FileName,
|
|
LineNumber,
|
|
Condition
|
|
);
|
|
|
|
|
|
::OutputDebugStringA(Msg);
|
|
/*
|
|
::DbgPrintEx(
|
|
DPFLTR_VSS_ID,
|
|
1,
|
|
Msg
|
|
);
|
|
*/
|
|
}
|
|
|
|
if (g_lVssDebugReportFlags & VSS_DBG_MESSAGE_BOX)
|
|
{
|
|
LPSTR szCommandLine = GetCommandLineA();
|
|
|
|
//
|
|
// Print the assertion and the command line
|
|
//
|
|
StringCchPrintfA(
|
|
STRING_CCH_PARAM(Msg),
|
|
"Assertion failure: %s\nFile: %s\nLine: %u\nCommand: %s\nProcess ID: %ld\nThread ID: %ld",
|
|
Condition,
|
|
FileName,
|
|
LineNumber,
|
|
szCommandLine,
|
|
dwCurrentProcessId,
|
|
dwCurrentThreadId
|
|
);
|
|
|
|
// Get a handle to use with ReportEvent()
|
|
HANDLE hEventSource = ::RegisterEventSourceA(
|
|
NULL, // IN LPCWSTR lpUNCServerName,
|
|
x_szEventLogVssSourceName // IN LPCWSTR lpSourceName
|
|
);
|
|
if (hEventSource)
|
|
{
|
|
LPCSTR ppszStringTable[1];
|
|
ppszStringTable[0] = const_cast<LPCSTR>(Msg);
|
|
|
|
// Write to event log. Ignore return code.
|
|
::ReportEventA(
|
|
hEventSource, // IN HANDLE hEventLog,
|
|
EVENTLOG_ERROR_TYPE, // IN WORD wType,
|
|
0, // IN WORD wCategory,
|
|
VSS_ERROR_ASSERT, // IN DWORD dwEventID,
|
|
NULL, // IN PSID lpUserSid,
|
|
1, // IN WORD wNumStrings,
|
|
0, // IN DWORD dwDataSize,
|
|
ppszStringTable, // IN LPCWSTR *lpStrings,
|
|
NULL // IN LPVOID lpRawData
|
|
);
|
|
|
|
// Close the handle to the event log
|
|
::DeregisterEventSource( hEventSource );
|
|
}
|
|
|
|
//
|
|
// Use dll name as caption
|
|
//
|
|
StringCchPrintfA(
|
|
STRING_CCH_PARAM(Title),
|
|
"Volume Snapshots (PID:%ld,TID:%ld)",
|
|
dwCurrentProcessId,
|
|
dwCurrentThreadId
|
|
);
|
|
|
|
//
|
|
// Print the assertion and the command line
|
|
//
|
|
StringCchPrintfA(
|
|
STRING_CCH_PARAM(Msg),
|
|
"Assertion failure at line %u in file %s: %s\n\nCommand line: %s\n\nHit Cancel to break into the debugger.",
|
|
LineNumber,
|
|
FileName,
|
|
Condition,
|
|
szCommandLine
|
|
);
|
|
|
|
i = MessageBoxA
|
|
(
|
|
NULL,
|
|
Msg,
|
|
Title,
|
|
MB_SYSTEMMODAL | MB_ICONSTOP | MB_OKCANCEL | MB_SERVICE_NOTIFICATION
|
|
);
|
|
|
|
if(i == IDCANCEL)
|
|
DebugBreak();
|
|
}
|
|
}
|
|
|
|
void VssSetDebugReport( LONG lDebugReportFlags )
|
|
{
|
|
g_lVssDebugReportFlags = lDebugReportFlags;
|
|
}
|
|
|