windows-nt/Source/XPSP1/NT/net/qos/tc/dll/tcutils.c
2020-09-26 16:20:57 +08:00

313 lines
6.3 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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