You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
313 lines
6.6 KiB
313 lines
6.6 KiB
/*++
|
|
|
|
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
|
|
|