/*++ Copyright (c) 1996 Microsoft Corporation Module Name: debug.h Abstract: Debug macros for the ARP module Revision History: Notes: --*/ #ifndef __RT_DEBUG_H__ #define __RT_DEBUG_H__ VOID RtInitializeDebug(); // // Tags for Pools // #define GROUP_TAG 'gmPI' #define SOURCE_TAG 'smPI' #define OIF_TAG 'omPI' #define MSG_TAG 'mmPI' #define FREE_TAG 'fmPI' // // File signatures for everyone // #define DEBUG_SIG 'gbed' #define INI_SIG 'tini' #define IOCT_SIG 'tcoi' #define MFE_SIG 'efmm' #define FWD_SIG 'dwfm' #define TMR_SIG 'rmit' // // We use the RT_XXX_DEBUG flags so that we can force to // different debug modes on free builds by changing sources. // On a checked build, all debugging is on // #if DBG #ifndef RT_TRACE_DEBUG #define RT_TRACE_DEBUG 1 #endif #ifndef RT_LOCK_DEBUG #define RT_LOCK_DEBUG 1 #endif #ifndef RT_ASSERT_ON #define RT_ASSERT_ON 1 #endif #ifndef RT_MEM_DEBUG #define RT_MEM_DEBUG 1 #endif #else // DBG #ifndef RT_TRACE_DEBUG #define RT_TRACE_DEBUG 0 #endif #ifndef RT_LOCK_DEBUG #define RT_LOCK_DEBUG 0 #endif #ifndef RT_ASSERT_ON #define RT_ASSERT_ON 0 #endif #ifndef RT_MEM_DEBUG #define RT_MEM_DEBUG 0 #endif #endif // DBG #if RT_ASSERT_ON #define RtAssert(X) \ { \ if(!(X)) \ { \ DbgPrint("[IPMCAST] Assertion failed in %s at line %d\n",\ __FILE__,__LINE__); \ DbgPrint("IPMCAST: Assertion " #X "\n"); \ DbgBreakPoint(); \ } \ } #else // RT_ASSERT_ON #define RtAssert(X) #endif #if RT_TRACE_DEBUG BYTE g_byDebugLevel; DWORD g_fDebugComp; #define MCAST_STREAM_GLOBAL 0x00000001 #define MCAST_STREAM_SEND 0x00000002 #define MCAST_STREAM_RCV 0x00000004 #define MCAST_STREAM_MFE 0x00000008 #define MCAST_STREAM_MEMORY 0x00000010 #define MCAST_STREAM_IF 0x00000020 #define MCAST_STREAM_FWD 0x00000040 #define MCAST_STREAM_TMR 0x00000080 #define RT_DBG_LEVEL_NONE 0xFF #define RT_DBG_LEVEL_FATAL 0xF0 #define RT_DBG_LEVEL_ERROR 0xE0 #define RT_DBG_LEVEL_WARN 0xD0 #define RT_DBG_LEVEL_INFO 0xC0 #define RT_DBG_LEVEL_TRACE 0xB0 #define Trace(Stream, Level, Str) \ { \ if ((RT_DBG_LEVEL_##Level >= RT_DBG_LEVEL_ERROR) || \ ((RT_DBG_LEVEL_##Level >= g_byDebugLevel) && \ ((g_fDebugComp & MCAST_STREAM_##Stream) == MCAST_STREAM_##Stream)))\ { \ DbgPrint("[IPMCAST] "); \ DbgPrint Str; \ } \ } #define TraceEnter(Stream, Str) Trace(Stream, TRACE, ("Entering "Str"\n")) #define TraceLeave(Stream, Str) Trace(Stream, TRACE, ("Leaving "Str"\n")) #else // RT_TRACE_DEBUG #define Trace(Stream, Level, Str) #define TraceEnter(Stream, Str) #define TraceLeave(Stream, Str) #endif // RT_TRACE_DEBUG #if RT_LOCK_DEBUG extern KSPIN_LOCK g_ksLockLock; #ifndef __FILE_SIG__ #error File signature not defined #endif typedef struct _RT_LOCK { ULONG ulLockSig; BOOLEAN bAcquired; PKTHREAD pktLastThread; ULONG ulFileSig; ULONG ulLineNumber; KSPIN_LOCK kslLock; }RT_LOCK, *PRT_LOCK; VOID RtpInitializeSpinLock( IN PRT_LOCK pLock, IN ULONG ulFileSig, IN ULONG ulLineNumber ); VOID RtpAcquireSpinLock( IN PRT_LOCK pLock, OUT PKIRQL pkiIrql, IN ULONG ulFileSig, IN ULONG ulLineNumber, IN BOOLEAN bAtDpc ); VOID RtpReleaseSpinLock( IN PRT_LOCK pLock, IN KIRQL kiIrql, IN ULONG ulFileSig, IN ULONG ulLineNumber, IN BOOLEAN bFromDpc ); #define RT_LOCK_SIG 'KCOL' #define RtInitializeSpinLock(X) RtpInitializeSpinLock((X), __FILE_SIG__, __LINE__) #define RtAcquireSpinLock(X, Y) RtpAcquireSpinLock((X), (Y), __FILE_SIG__, __LINE__, FALSE) #define RtAcquireSpinLockAtDpcLevel(X) RtpAcquireSpinLock((X), NULL, __FILE_SIG__, __LINE__, TRUE) #define RtReleaseSpinLock(X, Y) RtpReleaseSpinLock((X), (Y), __FILE_SIG__, __LINE__, FALSE) #define RtReleaseSpinLockFromDpcLevel(X) RtpReleaseSpinLock((X), 0, __FILE_SIG__, __LINE__, TRUE) #else // RT_LOCK_DEBUG typedef KSPIN_LOCK RT_LOCK, *PRT_LOCK; #define RtInitializeSpinLock KeInitializeSpinLock #define RtAcquireSpinLock KeAcquireSpinLock #define RtAcquireSpinLockAtDpcLevel KeAcquireSpinLockAtDpcLevel #define RtReleaseSpinLock KeReleaseSpinLock #define RtReleaseSpinLockFromDpcLevel KeReleaseSpinLockFromDpcLevel #endif // RT_LOCK_DEBUG #if RT_MEM_DEBUG #ifndef __FILE_SIG__ #error File signature not defined #endif // // Memory Allocation/Freeing Audit: // // // The RT_ALLOCATION structure stores all info about one allocation // typedef struct _RT_ALLOCATION { LIST_ENTRY leLink; ULONG ulMemSig; ULONG ulFileSig; ULONG ulLineNumber; ULONG ulSize; UCHAR pucData[1]; }RT_ALLOCATION, *PRT_ALLOCATION; // // The RT_FREE structure stores info about an allocation // that was freed. Later if the memory is touched, the // free list can be scanned to see where the allocation was // freed // typedef struct _RT_FREE { LIST_ENTRY leLink; ULONG_PTR ulStartAddr; ULONG ulSize; ULONG ulMemSig; ULONG ulAllocFileSig; ULONG ulAllocLineNumber; ULONG ulFreeFileSig; ULONG ulFreeLineNumber; }RT_FREE, *PRT_FREE; #define RT_MEMORY_SIG 'YRMM' #define RT_FREE_SIG 'EERF' PVOID RtpAllocate( IN POOL_TYPE ptPool, IN ULONG ulSize, IN ULONG ulTag, IN ULONG ulFileSig, IN ULONG ulLineNumber ); VOID RtpFree( PVOID pvPointer, IN ULONG ulFileSig, IN ULONG ulLineNumber ); VOID RtAuditMemory(); #define RtAllocate(X, Y, Z) RtpAllocate((X), (Y), (Z), __FILE_SIG__, __LINE__) #define RtFree(X) RtpFree((X), __FILE_SIG__, __LINE__) #else // RT_MEM_DEBUG #define RtAllocate ExAllocatePoolWithTag #define RtFree ExFreePool #define RtAuditMemory() #endif // RT_MEM_DEBUG #endif // __RT_DEBUG_H__