Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

291 lines
7.7 KiB

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