windows-nt/Source/XPSP1/NT/com/ole32/stg/props/iprop/assert.cxx
2020-09-26 16:20:57 +08:00

171 lines
4 KiB
C++

// This file provides dbgout implementations for use when the property
// set code is built into a standalone dll (so that we don't require a
// checked OLE32).
#include <pch.cxx>
#if DBG == 1
unsigned long Win4InfoLevel = DEF_INFOLEVEL;
unsigned long Win4InfoMask = 0xffffffff;
unsigned long Win4AssertLevel = ASSRT_MESSAGE | ASSRT_BREAK | ASSRT_POPUP;
static CRITICAL_SECTION s_csMessageBuf;
static char g_szMessageBuf[500]; // this is the message buffer
#include <dprintf.h> // w4printf, w4dprintf prototypes
static int _cdecl w4dprintf(const char *format, ...)
{
int ret;
va_list va;
va_start(va, format);
ret = w4vdprintf(format, va);
va_end(va);
return ret;
}
static int _cdecl w4vdprintf(const char *format, va_list arglist)
{
int ret;
EnterCriticalSection(&s_csMessageBuf);
ret = vsprintf(g_szMessageBuf, format, arglist);
OutputDebugStringA(g_szMessageBuf);
LeaveCriticalSection(&s_csMessageBuf);
return ret;
}
void APINOT vdprintf(unsigned long ulCompMask,
char const *pszComp,
char const *ppszfmt,
va_list pargs)
{
if ((ulCompMask & DEB_FORCE) == DEB_FORCE ||
((ulCompMask | Win4InfoLevel) & Win4InfoMask))
{
{
if (! (ulCompMask & DEB_NOCOMPNAME))
{
w4dprintf("%s: ", pszComp);
}
w4vdprintf(ppszfmt, pargs);
// Chicago and Win32s debugging is usually through wdeb386
// which needs carriage returns
#if WIN32 == 50 || WIN32 == 200
w4dprintf("\r");
#endif
}
}
}
// Private version of RtlAssert so debug versions really assert on free builds.
VOID PropAssertFailed(
IN PVOID FailedAssertion,
IN PVOID FileName,
IN ULONG LineNumber,
IN PCHAR Message OPTIONAL
)
{
CHAR szMessage[ 512 ];
int nResponse;
sprintf( szMessage, "File:\t%s\nLine:\t%d\nMessage:\t%s\n"
"\nPress Abort to kill the process, Retry to debug",
FileName, LineNumber, NULL == Message ? "" : Message );
nResponse = MessageBoxA( NULL, szMessage, "Assertion failed in NT5Props.dll", MB_ABORTRETRYIGNORE );
if( IDRETRY == nResponse )
DebugBreak();
else if( IDABORT == nResponse )
NtTerminateProcess( NtCurrentProcess(), STATUS_UNSUCCESSFUL );
return;
/*
char Response[ 2 ] = { "B" }; // In MSDEV there is no input, so default to break
for ( ; ; ) {
DbgPrint( "\n*** Assertion failed: %s%s\n*** Source File: %s, line %ld\n\n",
Message ? Message : "",
FailedAssertion,
FileName,
LineNumber
);
DbgPrompt( "Break, Ignore, terminate Process, Sleep 30 seconds, or terminate Thread (bipst)? ",
Response, sizeof( Response));
switch ( toupper(Response[0])) {
case 'B':
DbgBreakPoint();
break;
case 'I':
return;
break;
case 'P':
NtTerminateProcess( NtCurrentProcess(), STATUS_UNSUCCESSFUL );
break;
case 'S':
Sleep( 30000L);
break;
case 'T':
NtTerminateThread( NtCurrentThread(), STATUS_UNSUCCESSFUL );
break;
default:
DbgBreakPoint();
break;
}
}
DbgBreakPoint();
NtTerminateProcess( NtCurrentProcess(), STATUS_UNSUCCESSFUL );
*/
}
void
InitializeDebugging()
{
CHAR szValue[ 30 ];
InitializeCriticalSection( &s_csMessageBuf );
if (GetProfileStringA("CairOLE InfoLevels", // section
"prop", // key
"3", // default value
szValue, // return buffer
sizeof(szValue)))
{
propInfoLevel = DEB_ERROR | DEB_WARN | strtoul (szValue, NULL, 16);
}
}
void
UnInitializeDebugging()
{
DeleteCriticalSection( &s_csMessageBuf );
}
#endif // #if DBG == 1