/********************************************************************/ /** Microsoft Generic Packet Scheduler **/ /** Copyright(c) Microsoft Corp., 1996-1997 **/ /********************************************************************/ #ifndef __GPCDBG #define __GPCDBG //*** gpcdbg.h - GPC definitions & prototypes for debug/memory handling // #define GPC_MEM_MARK 'KRAM' /* ///////////////////////////////////////////////////////////////// // // defines // ///////////////////////////////////////////////////////////////// */ #if DBG #undef ASSERT #define ASSERT( Value ) \ { \ if ((ULONG_PTR)(Value) == 0) { \ KdPrint(("** ASSERT Failed ** %s\n",#Value));\ KdPrint(("Assert Failed at line %d in file %s\n",__LINE__,__FILE__));\ DbgBreakPoint(); \ } \ } // // DBG=1 // #define GpcAllocMem( _pAddress,_Length,_Tag ) \ { \ PCHAR _Addr; \ ULONG _Size = (((_Length)+3)&0xfffffffc) + 3*sizeof(ULONG); \ _Addr=ExAllocatePoolWithTag(NonPagedPool,_Size,_Tag ); \ TRACE(MEMORY,_Addr+8,_Length,"GpcAllocMem"); \ if (_Addr) { \ NdisFillMemory(_Addr, _Size, 0x7f); \ *(PULONG)_Addr = _Size; \ *(PULONG)(_Addr+sizeof(ULONG)) = GPC_MEM_MARK; \ *(PULONG)(_Addr+_Size-sizeof(ULONG)) = GPC_MEM_MARK; \ (PVOID)(*_pAddress) = (PVOID)(_Addr + 2*sizeof(ULONG)); \ BytesAllocated += _Size; \ } else { \ *_pAddress = NULL; \ } \ } #define GpcFreeMem( _Address,_Tag ) \ { \ PCHAR _Addr = ((PUCHAR)_Address) - 2*sizeof(ULONG); \ ULONG _Size = *(PULONG)_Addr; \ TRACE(MEMORY,_Address,_Size-12,"GpcFreeMem"); \ ASSERT(*(PULONG)(_Addr+sizeof(ULONG)) == GPC_MEM_MARK); \ ASSERT(*(PULONG)(_Addr+_Size-sizeof(ULONG)) == GPC_MEM_MARK); \ NdisFillMemory(_Addr, _Size, 0xCC); \ ExFreePool( _Addr ); \ BytesAllocated -= _Size; \ } #define GpcAllocFromLL(_ptr, _list, _tag) \ { \ PCHAR _Addr; \ if (_Addr = (PCHAR)NdisAllocateFromNPagedLookasideList(_list)) { \ *(PULONG)(_Addr) = GPC_MEM_MARK; \ (PVOID)(*_ptr) = (PVOID)(_Addr + sizeof(ULONG_PTR)); \ TRACE(MEMORY,_tag,*_ptr,"GpcAllocFromLL"); \ } else { \ *_ptr = NULL; \ } \ } #define GpcFreeToLL(_ptr, _list, _tag) \ { \ PCHAR _Addr = ((PUCHAR)_ptr) - sizeof(ULONG_PTR); \ ASSERT(*(PULONG)_Addr == GPC_MEM_MARK); \ *(PULONG)_Addr = 0x77777777; \ NdisFreeToNPagedLookasideList(_list, _Addr); \ TRACE(MEMORY,_tag,_ptr,"GpcFreeToLL"); \ } #define GET_IRQL(_i) _i = KeGetCurrentIrql() #define VERIFY_IRQL(_i) ASSERT((_i)==KeGetCurrentIrql()) #define DEFINE_KIRQL(_i) KIRQL _i #else // DBG != 1 #define GpcAllocMem( Addr,Len,_Tag ) \ *Addr = ExAllocatePoolWithTag(NonPagedPool, Len, _Tag ) #define GpcFreeMem( Address,_Tag ) \ ExFreePool( (Address) ) #define GpcAllocFromLL(_ptr, _list, _tag) \ *_ptr = NdisAllocateFromNPagedLookasideList(_list) #define GpcFreeToLL(_ptr, _list, _tag) \ NdisFreeToNPagedLookasideList(_list, _ptr) #define GET_IRQL(_i) #define VERIFY_IRQL(_i) #define DEFINE_KIRQL(_i) #endif // if DBG #if DBG #define LockedIncrement( Count,_p ) LockedInc(Count,__FILE__,__LINE__,_p) #else #define LockedIncrement( Count,_p ) NdisInterlockedIncrement((PLONG)Count) #endif #if DBG #define LockedDecrement( Count,_p ) LockedDec(Count,__FILE__,__LINE__,_p) #else #define LockedDecrement( Count,_p ) NdisInterlockedDecrement((PLONG)Count) #endif #define KD_PRINT 0x00000001 #define INIT 0x00000002 #define BLOB 0x00000004 #define PATTERN 0x00000008 #define NOTIFY 0x00000010 #define REGISTER 0x00000020 #define MEMORY 0x00000040 #define LOOKUP 0x00000080 #define LOCKS 0x00000100 #define CLASSIFY 0x00000200 #define RHIZOME 0x00000400 #define PATHASH 0x00000800 #define IOCTL 0x00001000 #define CLIENT 0x00002000 #define MAPHAND 0x00004000 #define CLASSHAND 0x00008000 #define PAT_TIMER 0x00010000 #define REFCOUNT 0x00020000 #define PARAM_EX 0x80000000 // this is reserved for the trace routine #if DBG #define DBGPRINT(Mask, String) \ { \ if(Mask & DbgPrintFlags)\ DbgPrint String;\ } #define TRACE( Mask,P1,P2,_fname ) \ { \ if (Mask & DebugFlags)\ TraceRtn((PUCHAR)__FILE__,(ULONG)__LINE__,_fname,(ULONG_PTR)(P1),(ULONG_PTR)(P2),KeGetCurrentProcessorNumber(),KeGetCurrentIrql(),Mask|PARAM_EX);\ } #else #define DBGPRINT(Mask, String) #define TRACE( Mask,P1,P2,_fname ) #endif /* ///////////////////////////////////////////////////////////////// // // externs & prototypes // ///////////////////////////////////////////////////////////////// */ extern ULONG DebugFlags; extern ULONG DbgPrintFlags; extern ULONG BytesAllocated; 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 ); _inline LONGLONG GetTime( VOID ) /*++ Routine Description: Get the current system time Arguments: Return Value: System time (in base OS time units) --*/ { LARGE_INTEGER Now; LARGE_INTEGER Frequency; #if defined(PERF_COUNTER) || defined (TRACE_PERF_COUNTER) Now = KeQueryPerformanceCounter(&Frequency); Now.QuadPart = (Now.QuadPart * OS_TIME_SCALE) / Frequency.QuadPart; #else NdisGetCurrentSystemTime( &Now ); #endif return Now.QuadPart; } #define LOGSIZE 4000 // number of entries #define LOGWIDTH 64 // number of characters (one or two bytes) per entry // // typedef struct { UCHAR Row[ LOGWIDTH ]; LONGLONG Time; ULONG Line; ULONG_PTR P1; ULONG_PTR P2; ULONG P3; ULONG P4; } ROW, *PROW; typedef struct { ULONG Index; PROW Current; PROW Buffer; ULONG Wraps; } LOG, *PLOG; _inline VOID DbgVerifyList( PLIST_ENTRY h ) { PLIST_ENTRY p = h->Flink; PLIST_ENTRY q = h; int m = 1000; if (h->Flink == h) { ASSERT(h->Blink == h); } while (p != h && m > 0) { ASSERT(p->Blink == q); q = p; p = p->Flink; m--; } ASSERT(m > 0); } #endif //__GPCDBG