313 lines
6.3 KiB
C
313 lines
6.3 KiB
C
/*++
|
||
|
||
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 <wincon.h>
|
||
#include <winuser.h>
|
||
|
||
|
||
#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
|
||
|