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
;
11 ULONG TagsToShow
[MEMTRACK_MAX_TAGS_TO_TRACK
] = { 0 };
13 VOID
TrackTag( ULONG Tag
) {
16 for( i
= 0; TagsToShow
[i
]; i
++ );
21 TcpipInitializeSpinLock( &AllocatedObjectsLock
);
22 InitializeListHead( &AllocatedObjectsList
);
23 ExInitializeNPagedLookasideList(&AllocatedObjectsLookasideList
,
27 sizeof(ALLOCATION_TRACKER
),
32 VOID
ShowTrackedThing( PCHAR What
, PALLOCATION_TRACKER Thing
, BOOLEAN ForceShow
) {
36 DbgPrint("[%s] Thing %08x %c%c%c%c (%s:%d)\n",
39 ((PCHAR
)&Thing
->Tag
)[3],
40 ((PCHAR
)&Thing
->Tag
)[2],
41 ((PCHAR
)&Thing
->Tag
)[1],
42 ((PCHAR
)&Thing
->Tag
)[0],
48 TI_DbgPrint(MAX_TRACE
,
49 ("[%s] Thing %08x %c%c%c%c (%s:%d)\n",
52 ((PCHAR
)&Thing
->Tag
)[3],
53 ((PCHAR
)&Thing
->Tag
)[2],
54 ((PCHAR
)&Thing
->Tag
)[1],
55 ((PCHAR
)&Thing
->Tag
)[0],
61 VOID
TrackWithTag( ULONG Tag
, PVOID Thing
, PCHAR FileName
, ULONG LineNo
) {
62 PALLOCATION_TRACKER TrackedThing
=
63 ExAllocateFromNPagedLookasideList( &AllocatedObjectsLookasideList
);
67 PALLOCATION_TRACKER ThingInList
;
69 if (!TrackedThing
) return;
71 TrackedThing
->Tag
= Tag
;
72 TrackedThing
->Thing
= Thing
;
73 TrackedThing
->FileName
= FileName
;
74 TrackedThing
->LineNo
= LineNo
;
76 ShowTrackedThing( "Alloc", TrackedThing
, FALSE
);
78 TcpipAcquireSpinLock( &AllocatedObjectsLock
, &OldIrql
);
79 Entry
= AllocatedObjectsList
.Flink
;
80 while( Entry
!= &AllocatedObjectsList
) {
81 ThingInList
= CONTAINING_RECORD(Entry
, ALLOCATION_TRACKER
, Entry
);
82 if( ThingInList
->Thing
== Thing
) {
83 RemoveEntryList(Entry
);
85 TI_DbgPrint(MAX_TRACE
,("TRACK: SPECIFIED ALREADY ALLOCATED ITEM %x\n", Thing
));
86 ShowTrackedThing( "Double Alloc (Item in list)", ThingInList
, FALSE
);
87 ShowTrackedThing( "Double Alloc (Item not in list)", TrackedThing
, FALSE
);
89 ExFreeToNPagedLookasideList( &AllocatedObjectsLookasideList
,
97 InsertHeadList( &AllocatedObjectsList
, &TrackedThing
->Entry
);
99 TcpipReleaseSpinLock( &AllocatedObjectsLock
, OldIrql
);
102 BOOLEAN
ShowTag( ULONG Tag
) {
105 for( i
= 0; TagsToShow
[i
] && TagsToShow
[i
] != Tag
; i
++ );
107 return TagsToShow
[i
] ? TRUE
: FALSE
;
110 VOID
UntrackFL( PCHAR File
, ULONG Line
, PVOID Thing
, ULONG Tag
) {
113 PALLOCATION_TRACKER ThingInList
;
115 TcpipAcquireSpinLock( &AllocatedObjectsLock
, &OldIrql
);
116 Entry
= AllocatedObjectsList
.Flink
;
117 while( Entry
!= &AllocatedObjectsList
) {
118 ThingInList
= CONTAINING_RECORD(Entry
, ALLOCATION_TRACKER
, Entry
);
119 if( ThingInList
->Thing
== Thing
) {
120 RemoveEntryList(Entry
);
122 ShowTrackedThing( "Free ", ThingInList
, FALSE
);
124 if ( ThingInList
->Tag
!= Tag
) {
125 DbgPrint("UNTRACK: TAG DOES NOT MATCH (%x)\n", Thing
);
126 ShowTrackedThing("Tag Mismatch (Item in list)", ThingInList
, TRUE
);
130 ExFreeToNPagedLookasideList( &AllocatedObjectsLookasideList
,
133 TcpipReleaseSpinLock( &AllocatedObjectsLock
, OldIrql
);
135 /* TrackDumpFL( File, Line ); */
138 Entry
= Entry
->Flink
;
140 TcpipReleaseSpinLock( &AllocatedObjectsLock
, OldIrql
);
141 DbgPrint("UNTRACK: SPECIFIED ALREADY FREE ITEM %x\n", Thing
);
145 VOID
TrackDumpFL( PCHAR File
, ULONG Line
) {
148 PALLOCATION_TRACKER Thing
;
150 TI_DbgPrint(MAX_TRACE
,("Dump: %s:%d\n", File
, Line
));
152 TcpipAcquireSpinLock( &AllocatedObjectsLock
, &OldIrql
);
153 Entry
= AllocatedObjectsList
.Flink
;
154 while( Entry
!= &AllocatedObjectsList
) {
155 Thing
= CONTAINING_RECORD(Entry
, ALLOCATION_TRACKER
, Entry
);
156 ShowTrackedThing( "Dump ", Thing
, FALSE
);
157 Entry
= Entry
->Flink
;
159 TcpipReleaseSpinLock( &AllocatedObjectsLock
, OldIrql
);