windows-nt/Source/XPSP1/NT/net/qos/pclass/gpc/gpcdbg.c
2020-09-26 16:20:57 +08:00

224 lines
3.5 KiB
C

/*
************************************************************************
Copyright (c) 1996-1997 Microsoft Corporation
Module Name:
gpcmain.c
Abstract:
This file contains initialization stuff for the GPC
Author:
Ofer Bar - April 15, 1997
Environment:
Kernel mode
Revision History:
************************************************************************
*/
#include "gpcpre.h"
#if DBG
ULONG DebugFlags = PATTERN | RHIZOME
| LOCKS | CLASSIFY
| BLOB | MEMORY | IOCTL
| CLIENT | MAPHAND | CLASSHAND | PAT_TIMER;
ULONG DbgPrintFlags = 0;
ULONG BytesAllocated = 0;
NDIS_SPIN_LOCK LogLock;
//extern LOG Log;
LOG Log = {0, NULL, NULL, 0};
//
// Forward definition
//
#if 0
ULONG
StrLen(
IN UCHAR *Ptr
);
#endif
NTSTATUS
InitializeLog(
VOID
)
{
NTSTATUS Status = STATUS_SUCCESS;
//
// allocate memory for it
//
Log.Buffer = (PROW)ExAllocatePoolWithTag(NonPagedPool,
(LOGSIZE+4) * sizeof(ROW),
DebugTag);
if (Log.Buffer) {
Log.Index = 0;
Log.Wraps = 0;
Log.Current = Log.Buffer;
NdisAllocateSpinLock(&LogLock);
} else {
Status = STATUS_NO_MEMORY;
}
return Status;
}
VOID
FreeDebugLog(VOID)
{
ExFreePool(Log.Buffer);
Log.Buffer = NULL;
}
#if 0
ULONG
StrLen(
IN UCHAR *Ptr
)
/*++
Routine Description:
This function does a strlen - so that we don't have to enable intrinsics.
Arguments:
Ptr - a ptr to the string
Return Value:
- the number of characters.
--*/
{
ULONG Count = 0;
while (*Ptr++) {
Count++;
}
return( Count );
}
#endif
VOID
TraceRtn(
IN UCHAR *File,
IN ULONG Line,
IN UCHAR *FuncName,
IN ULONG_PTR Param1,
IN ULONG_PTR Param2,
IN ULONG Param3,
IN ULONG Param4,
IN ULONG Mask
)
/*++
Routine Description:
This function logs the file and line number along with 3 other parameters
into a circular buffer and possibly to the debug terminal.
Arguments:
Return Value:
--*/
{
NTSTATUS status;
PROW pEntry;
PUCHAR pFile, p;
LONG l, m;
if (!Log.Buffer)
{
return;
}
NdisAcquireSpinLock(&LogLock);
pEntry = &Log.Buffer[Log.Index];
p = File;
pFile = p + strlen(File) - 1;
while (*pFile != '\\' && p != pFile) {
pFile--;
}
//pFile = (PUCHAR)strrchr((CONST CHAR * )File,'\\');
pFile++;
RtlZeroMemory(&pEntry->Row[0], LOGWIDTH);
l = strlen(pFile);
RtlCopyMemory(&pEntry->Row[0], pFile, min(l,LOGWIDTH));
if (l+3 < LOGWIDTH) {
pEntry->Row[l+0] = ' ';
pEntry->Row[l+1] = '%';
pEntry->Row[l+2] = 'd';
pEntry->Row[l+3] = ' ';
}
if (l+4 < LOGWIDTH) {
m = strlen(FuncName);
RtlCopyMemory(&pEntry->Row[l+4], FuncName, min(m,LOGWIDTH-(l+4)));
}
pEntry->Line = Line;
pEntry->Time = GetTime();
pEntry->P1 = Param1;
pEntry->P2 = Param2;
pEntry->P3 = Param3;
pEntry->P4 = Param4;
//++Log.Current;
if (++(Log.Index) >= LOGSIZE)
{
Log.Index = 0;
Log.Wraps++;
Log.Current = Log.Buffer;
}
if (DebugFlags & KD_PRINT) {
KdPrint(( pEntry->Row, Line ));
KdPrint(( " %p %p %d %d\n", Param1, Param2, Param3, Param4 ));
}
NdisReleaseSpinLock(&LogLock);
}
#endif // DBG