/*++ Copyright (c) 1996 Microsoft Corporation Module Name: tcutils.c Abstract: This module contains support routines for the traffic DLL. Author: Jim Stewart (jstew) August 14, 1996 Revision History: --*/ #include "precomp.h" #pragma hdrstop #include #include #if DBG BOOLEAN ConsoleInitialized = FALSE; HANDLE DebugFileHandle = INVALID_HANDLE_VALUE; PTCHAR DebugFileName = L"/temp/traffic.log"; PTCHAR TRAFFIC_DBG = L"Traffic.dbg"; VOID WsAssert( IN PVOID FailedAssertion, IN PVOID FileName, IN ULONG LineNumber ) { BOOL ok; CHAR choice[16]; DWORD bytes; DWORD error; IF_DEBUG(CONSOLE) { WSPRINT(( " failed: %s\n at line %ld of %s\n", FailedAssertion, LineNumber, FileName )); do { WSPRINT(( "[B]reak/[I]gnore? " )); bytes = sizeof(choice); ok = ReadFile( GetStdHandle(STD_INPUT_HANDLE), &choice, bytes, &bytes, NULL ); if ( ok ) { if ( toupper(choice[0]) == 'I' ) { break; } if ( toupper(choice[0]) == 'B' ) { DEBUGBREAK(); } } else { error = GetLastError( ); } } while ( TRUE ); return; } RtlAssert( FailedAssertion, FileName, LineNumber, NULL ); } // WsAssert VOID WsPrintf ( char *Format, ... ) { va_list arglist; char OutputBuffer[1024]; ULONG length; BOOL ret; length = (ULONG)wsprintfA( OutputBuffer, "TRAFFIC [%05d]: ", GetCurrentThreadId() ); va_start( arglist, Format ); wvsprintfA( OutputBuffer + length, Format, arglist ); va_end( arglist ); IF_DEBUG(DEBUGGER) { DbgPrint( "%s", OutputBuffer ); } IF_DEBUG(CONSOLE) { if ( !ConsoleInitialized ) { CONSOLE_SCREEN_BUFFER_INFO csbi; COORD coord; ConsoleInitialized = TRUE; (VOID)AllocConsole( ); (VOID)GetConsoleScreenBufferInfo( GetStdHandle(STD_OUTPUT_HANDLE), &csbi ); coord.X = (SHORT)(csbi.srWindow.Right - csbi.srWindow.Left + 1); coord.Y = (SHORT)((csbi.srWindow.Bottom - csbi.srWindow.Top + 1) * 20); (VOID)SetConsoleScreenBufferSize( GetStdHandle(STD_OUTPUT_HANDLE), coord ); } length = strlen( OutputBuffer ); ret = WriteFile( GetStdHandle(STD_OUTPUT_HANDLE), (LPVOID )OutputBuffer, length, &length, NULL ); if ( !ret ) { DbgPrint( "WsPrintf: console WriteFile failed: %ld\n", GetLastError( ) ); } } IF_DEBUG(FILE) { if ( DebugFileHandle == INVALID_HANDLE_VALUE ) { DebugFileHandle = CreateFile( DebugFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, 0, NULL ); } if ( DebugFileHandle == INVALID_HANDLE_VALUE ) { //DbgPrint( "WsPrintf: Failed to open traffic debug log file %s: %ld\n", // DebugFileName, GetLastError( ) ); } else { length = strlen( OutputBuffer ); ret = WriteFile( DebugFileHandle, (LPVOID )OutputBuffer, length, &length, NULL ); if ( !ret ) { DbgPrint( "WsPrintf: file WriteFile failed: %ld\n", GetLastError( ) ); } } } } // WsPrintf #endif ULONG LockedDec( IN PULONG Count ) /*++ Routine Description: This routine is a debug routine used for checking decrements on counts. It asserts if the count goes negative. The Macro LockedDecrement calls it. Arguments: pointer to the count. Return Value: none --*/ { ULONG Result; Result = InterlockedDecrement( (PLONG)Count ); ASSERT( Result < 0x80000000 ); return( Result ); } #if DBG VOID SetupDebugInfo() /*++ Description: This routine reads in a debug file that may contain debug instructions. Arguments: none Return Value: none --*/ { HANDLE handle; // // If there is a file in the current directory called "tcdebug" // open it and read the first line to set the debugging flags. // handle = CreateFile( TRAFFIC_DBG, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL ); if( handle == INVALID_HANDLE_VALUE ) { // // Set default value. changed - Oferbar // //DebugMask = DEBUG_DEBUGGER | DEBUG_CONSOLE; DebugMask |= DEBUG_ERRORS; // always dump errors DebugMask |= DEBUG_FILE; // always print a log. DebugMask |= DEBUG_WARNINGS; // until Beta3, we want the warnings too } else { CHAR buffer[11]; DWORD bytesRead; RtlZeroMemory( buffer, sizeof(buffer) ); if ( ReadFile( handle, buffer, 10, &bytesRead, NULL ) ) { buffer[bytesRead] = '\0'; DebugMask = strtoul( buffer, NULL, 16 ); } else { WSPRINT(( "read file failed: %ld\n", GetLastError( ) )); } CloseHandle( handle ); } } VOID CloseDbgFile( ) /*++ Routine Description: This closes the debug output file if its open. Arguments: none Return Value: none --*/ { if (DebugFileHandle != INVALID_HANDLE_VALUE) { CloseHandle( DebugFileHandle ); } } #endif