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