// 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 #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 // 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