// Copyright (c) 1997, Microsoft Corporation, all rights reserved // // debug.c // RAS L2TP WAN mini-port/call-manager driver // Debug utilities and globals // // 01/07/97 Steve Cobb #include "l2tpp.h" //----------------------------------------------------------------------------- // Global data definitions //----------------------------------------------------------------------------- #ifdef TESTMODE #define DEFAULTTRACELEVEL TL_I #define DEFAULTTRACEMASK TM_XCMsg #else #define DEFAULTTRACELEVEL TL_None #define DEFAULTTRACEMASK TM_Base #endif // Active debug trace level and active trace set mask. Set these variables // with the debugger at startup to enable and filter the debug output. All // messages with (TL_*) level less than or equal to 'g_ulTraceLevel' are // displayed. All messages from any (TM_*) set(s) present in 'g_ulTraceMask' // are displayed. // ULONG g_ulTraceLevel = DEFAULTTRACELEVEL; ULONG g_ulTraceMask = DEFAULTTRACEMASK; //----------------------------------------------------------------------------- // Routines //----------------------------------------------------------------------------- #if DBG VOID CheckList( IN LIST_ENTRY* pList, IN BOOLEAN fShowLinks ) // Tries to detect corruption in list 'pList', printing verbose linkage // output if 'fShowLinks' is set. // { LIST_ENTRY* pLink; ULONG ul; ul = 0; for (pLink = pList->Flink; pLink != pList; pLink = pLink->Flink) { if (fShowLinks) { DbgPrint( "L2TP: CheckList($%p) Flink(%d)=$%p\n", pList, ul, pLink ); } ++ul; } for (pLink = pList->Blink; pLink != pList; pLink = pLink->Blink) { if (fShowLinks) { DbgPrint( "L2TP: CheckList($%p) Blink(%d)=$%p\n", pList, ul, pLink ); } --ul; } if (ul) { DbgBreakPoint(); } } #endif #if DBG VOID Dump( IN CHAR* p, IN ULONG cb, IN BOOLEAN fAddress, IN ULONG ulGroup ) // Hex dump 'cb' bytes starting at 'p' grouping 'ulGroup' bytes together. // For example, with 'ulGroup' of 1, 2, and 4: // // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| // 0000 0000 0000 0000 0000 0000 0000 0000 |................| // 00000000 00000000 00000000 00000000 |................| // // If 'fAddress' is true, the memory address dumped is prepended to each // line. // { while (cb) { INT cbLine; cbLine = (cb < DUMP_BytesPerLine) ? cb : DUMP_BytesPerLine; DumpLine( p, cbLine, fAddress, ulGroup ); cb -= cbLine; p += cbLine; } } #endif #if DBG VOID DumpLine( IN CHAR* p, IN ULONG cb, IN BOOLEAN fAddress, IN ULONG ulGroup ) { CHAR* pszDigits = "0123456789ABCDEF"; CHAR szHex[ ((2 + 1) * DUMP_BytesPerLine) + 1 ]; CHAR* pszHex = szHex; CHAR szAscii[ DUMP_BytesPerLine + 1 ]; CHAR* pszAscii = szAscii; ULONG ulGrouped = 0; if (fAddress) DbgPrint( "L2TP: %p: ", p ); else DbgPrint( "L2TP: " ); while (cb) { *pszHex++ = pszDigits[ ((UCHAR )*p) / 16 ]; *pszHex++ = pszDigits[ ((UCHAR )*p) % 16 ]; if (++ulGrouped >= ulGroup) { *pszHex++ = ' '; ulGrouped = 0; } *pszAscii++ = (*p >= 32 && *p < 128) ? *p : '.'; ++p; --cb; } *pszHex = '\0'; *pszAscii = '\0'; DbgPrint( "%-*s|%-*s|\n", (2 * DUMP_BytesPerLine) + (DUMP_BytesPerLine / ulGroup), szHex, DUMP_BytesPerLine, szAscii ); } #endif