Leaked source code of windows server 2003
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.
 
 
 
 
 
 

241 lines
8.9 KiB

/****************************************************************************/
// ntrcdisp.c
//
// RDP Trace helper functions.
//
// Copyright (C) 1997-2000 Microsoft Corporation
/****************************************************************************/
#include <precmpdd.h>
#pragma hdrstop
#ifdef DC_DEBUG
#include <adcg.h>
#include <atrcapi.h>
#define DC_INCLUDE_DATA
#include <ndddata.c>
#undef DC_INCLUDE_DATA
/****************************************************************************/
/* TRCTraceLocal - internal function used by TRC_TraceLine */
/****************************************************************************/
void TRCTraceLocal(char *traceFormat, ...)
{
va_list ap;
va_start(ap, traceFormat);
EngDebugPrint("RDPDD:", traceFormat, ap);
va_end(ap);
}
/****************************************************************************/
/* TRC_TraceLine - trace a line */
/****************************************************************************/
void TRC_TraceLine(
PVOID pWD,
UINT32 traceClass,
UINT32 traceType,
char *traceString,
char separator,
unsigned lineNumber,
char *funcName,
char *fileName)
{
/************************************************************************/
/* Check whether trace to WD is required and initialized */
/************************************************************************/
if (ddTrcToWD && pddShm)
{
ICA_TRACE_BUFFER trc;
unsigned bytesReturned;
trc.DataLength = sprintf(trc.Data,
"RDPDD%c%p%c"TRC_FUNC_FMT"%c"TRC_LINE_FMT"%c%s\n",
separator,
pddTSWd,
separator,
TRC_FUNCNAME_LEN,
TRC_FUNCNAME_LEN,
funcName,
separator,
lineNumber,
separator,
traceString);
trc.TraceClass = TC_DISPLAY;
trc.TraceEnable = traceType;
EngFileIoControl(ddWdHandle,
IOCTL_ICA_CHANNEL_TRACE,
&trc,
sizeof(trc),
NULL,
0,
&bytesReturned);
}
else
{
/********************************************************************/
/* Local-only tracing */
/********************************************************************/
TRCTraceLocal("%c"TRC_FUNC_FMT"%c"TRC_LINE_FMT"%c%s\n",
separator,
TRC_FUNCNAME_LEN,
TRC_FUNCNAME_LEN,
funcName,
separator,
lineNumber,
separator,
traceString);
}
}
/****************************************************************************/
/* TRCPrefixMatch */
/* */
/* Internal function to compare a component name to a prefix. */
/* - assumes both are the same case */
/* - returns */
/* - TRUE if characters up to end of prefix match */
/* - FALSE otherwise */
/****************************************************************************/
BOOL TRCPrefixMatch(char *cpnt, char *prefix)
{
while ((*cpnt == *prefix) && (*prefix != 0))
{
cpnt++;
prefix++;
}
if (*prefix == 0)
{
return TRUE;
}
return FALSE;
}
/****************************************************************************/
/* TRC_WillTrace */
/****************************************************************************/
BOOL TRC_WillTrace(
UINT32 traceType,
UINT32 traceClass,
char *fileName,
UINT32 line)
{
BOOL rc;
int i;
/************************************************************************/
/* If tracing is not going to WD, OR SHM is not set up, check the local */
/* trace level. No prefix checking is done in this case. */
/************************************************************************/
if (!ddTrcToWD || !pddShm)
{
rc = (ddTrcType & traceType);
DC_QUIT;
}
/************************************************************************/
/* Tracing is going to WD, AND SHM is set up. */
/************************************************************************/
/************************************************************************/
/* Check whether this type and class are enabled. */
/************************************************************************/
if (!(traceType & pddShm->trc.TraceEnable) ||
!(traceClass & pddShm->trc.TraceClass))
{
rc = FALSE;
DC_QUIT;
}
/************************************************************************/
/* If we get here, this line will be traced by WD. Now decide whether */
/* we want to pass it to WD. */
/************************************************************************/
/************************************************************************/
/* Always trace errors, irrespective of prefix. */
/************************************************************************/
if (traceType & TT_API4)
{
rc = TRUE;
DC_QUIT;
}
/************************************************************************/
/* Trace all lines if no prefixes are defined. */
/************************************************************************/
if (pddShm->trc.prefix[0].name[0] == 0)
{
rc = TRUE;
DC_QUIT;
}
/************************************************************************/
/* Some prefixes are defined - check whether this line matches any of */
/* them. */
/************************************************************************/
for (i = 0; i < TRC_MAX_PREFIX; i++)
{
if (pddShm->trc.prefix[i].name[0] == 0)
{
/****************************************************************/
/* End of list - break */
/****************************************************************/
break;
}
if (TRCPrefixMatch(&(fileName[1]), pddShm->trc.prefix[i].name))
{
/****************************************************************/
/* Found matching filename - is there a line number range */
/* specified? */
/****************************************************************/
if ((pddShm->trc.prefix[i].start == 0) &&
(pddShm->trc.prefix[i].end == 0))
{
/************************************************************/
/* No line number range - trace this line */
/************************************************************/
rc = TRUE;
DC_QUIT;
}
/****************************************************************/
/* There's a line number range - see if this line falls within */
/* it. */
/****************************************************************/
if ((line >= pddShm->trc.prefix[i].start) &&
(line <= pddShm->trc.prefix[i].end))
{
/************************************************************/
/* Line within prefix range - trace it. */
/************************************************************/
rc = TRUE;
DC_QUIT;
}
}
} /* for */
/************************************************************************/
/* If we get here, we've searched the list of prefixes and failed to */
/* find a match - don't trace the line */
/************************************************************************/
rc = FALSE;
DC_EXIT_POINT:
return rc;
}
#endif /* DC_DEBUG */