1 #define MEMTRACK_NO_POOL
6 #define TRACK_TAG TAG('T','r','C','K')
8 static LIST_ENTRY AllocatedObjectsList
;
9 static KSPIN_LOCK AllocatedObjectsLock
;
10 static NPAGED_LOOKASIDE_LIST AllocatedObjectsLookasideList
;
13 TcpipInitializeSpinLock( &AllocatedObjectsLock
);
14 InitializeListHead( &AllocatedObjectsList
);
15 ExInitializeNPagedLookasideList(&AllocatedObjectsLookasideList
,
19 sizeof(ALLOCATION_TRACKER
),
24 VOID
ShowTrackedThing( PCHAR What
, PALLOCATION_TRACKER Thing
, BOOLEAN ForceShow
) {
28 DbgPrint("[%s] Thing %08x %c%c%c%c (%s:%d)\n",
31 ((PCHAR
)&Thing
->Tag
)[3],
32 ((PCHAR
)&Thing
->Tag
)[2],
33 ((PCHAR
)&Thing
->Tag
)[1],
34 ((PCHAR
)&Thing
->Tag
)[0],
40 TI_DbgPrint(MAX_TRACE
,
41 ("[%s] Thing %08x %c%c%c%c (%s:%d)\n",
44 ((PCHAR
)&Thing
->Tag
)[3],
45 ((PCHAR
)&Thing
->Tag
)[2],
46 ((PCHAR
)&Thing
->Tag
)[1],
47 ((PCHAR
)&Thing
->Tag
)[0],
53 VOID
TrackWithTag( ULONG Tag
, PVOID Thing
, PCHAR FileName
, ULONG LineNo
) {
54 PALLOCATION_TRACKER TrackedThing
=
55 ExAllocateFromNPagedLookasideList( &AllocatedObjectsLookasideList
);
59 PALLOCATION_TRACKER ThingInList
;
61 if (!TrackedThing
) return;
63 TrackedThing
->Tag
= Tag
;
64 TrackedThing
->Thing
= Thing
;
65 TrackedThing
->FileName
= FileName
;
66 TrackedThing
->LineNo
= LineNo
;
68 ShowTrackedThing( "Alloc", TrackedThing
, FALSE
);
70 TcpipAcquireSpinLock( &AllocatedObjectsLock
, &OldIrql
);
71 Entry
= AllocatedObjectsList
.Flink
;
72 while( Entry
!= &AllocatedObjectsList
) {
73 ThingInList
= CONTAINING_RECORD(Entry
, ALLOCATION_TRACKER
, Entry
);
74 if( ThingInList
->Thing
== Thing
) {
75 RemoveEntryList(Entry
);
77 ShowTrackedThing( "Double Alloc (Item in list)", ThingInList
, TRUE
);
78 ShowTrackedThing( "Double Alloc (Item not in list)", TrackedThing
, TRUE
);
80 ExFreeToNPagedLookasideList( &AllocatedObjectsLookasideList
,
88 InsertHeadList( &AllocatedObjectsList
, &TrackedThing
->Entry
);
90 TcpipReleaseSpinLock( &AllocatedObjectsLock
, OldIrql
);
93 VOID
UntrackFL( PCHAR File
, ULONG Line
, PVOID Thing
, ULONG Tag
) {
96 PALLOCATION_TRACKER ThingInList
;
98 TcpipAcquireSpinLock( &AllocatedObjectsLock
, &OldIrql
);
99 Entry
= AllocatedObjectsList
.Flink
;
100 while( Entry
!= &AllocatedObjectsList
) {
101 ThingInList
= CONTAINING_RECORD(Entry
, ALLOCATION_TRACKER
, Entry
);
102 if( ThingInList
->Thing
== Thing
) {
103 RemoveEntryList(Entry
);
105 ShowTrackedThing( "Free ", ThingInList
, FALSE
);
107 if ( ThingInList
->Tag
!= Tag
) {
108 DbgPrint("UNTRACK: TAG DOES NOT MATCH (%x)\n", Thing
);
109 ShowTrackedThing("Tag Mismatch (Item in list)", ThingInList
, TRUE
);
113 ExFreeToNPagedLookasideList( &AllocatedObjectsLookasideList
,
116 TcpipReleaseSpinLock( &AllocatedObjectsLock
, OldIrql
);
120 Entry
= Entry
->Flink
;
122 TcpipReleaseSpinLock( &AllocatedObjectsLock
, OldIrql
);
124 DbgPrint("[Double Free] Thing %08x %c%c%c%c (%s:%d)\n",
136 VOID
TrackDumpFL( PCHAR File
, ULONG Line
) {
139 PALLOCATION_TRACKER Thing
;
141 TI_DbgPrint(MAX_TRACE
,("Dump: %s:%d\n", File
, Line
));
143 TcpipAcquireSpinLock( &AllocatedObjectsLock
, &OldIrql
);
144 Entry
= AllocatedObjectsList
.Flink
;
145 while( Entry
!= &AllocatedObjectsList
) {
146 Thing
= CONTAINING_RECORD(Entry
, ALLOCATION_TRACKER
, Entry
);
147 ShowTrackedThing( "Dump ", Thing
, FALSE
);
148 Entry
= Entry
->Flink
;
150 TcpipReleaseSpinLock( &AllocatedObjectsLock
, OldIrql
);