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 DWORD TagsToShow
[MEMTRACK_MAX_TAGS_TO_TRACK
] = { 0 };
13 VOID
TrackTag( DWORD 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
,
33 PCHAR File
, UINT Line
) {
34 /* if( ShowTag( Thing->Tag ) ) */
36 TI_DbgPrint(MAX_TRACE
,
37 ("[%s] Thing %08x %c%c%c%c (%s:%d) (Called from %s:%d)\n",
40 ((PCHAR
)&Thing
->Tag
)[3],
41 ((PCHAR
)&Thing
->Tag
)[2],
42 ((PCHAR
)&Thing
->Tag
)[1],
43 ((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( DWORD Tag
, PVOID Thing
, PCHAR FileName
, DWORD LineNo
) {
62 PALLOCATION_TRACKER TrackedThing
=
63 ExAllocateFromNPagedLookasideList( &AllocatedObjectsLookasideList
);
67 PALLOCATION_TRACKER ThingInList
;
69 TcpipAcquireSpinLock( &AllocatedObjectsLock
, &OldIrql
);
70 Entry
= AllocatedObjectsList
.Flink
;
71 while( Entry
!= &AllocatedObjectsList
) {
72 ThingInList
= CONTAINING_RECORD(Entry
, ALLOCATION_TRACKER
, Entry
);
73 if( ThingInList
->Thing
== Thing
) {
74 RemoveEntryList(Entry
);
76 TcpipReleaseSpinLock( &AllocatedObjectsLock
, OldIrql
);
77 ShowTrackedThing( "Alloc", ThingInList
, FileName
, LineNo
);
78 PoolFreeBuffer( ThingInList
);
79 TrackDumpFL( FileName
, LineNo
);
80 DbgPrint("TRACK: SPECIFIED ALREADY ALLOCATED ITEM %x\n", Thing
);
87 TrackedThing
->Tag
= Tag
;
88 TrackedThing
->Thing
= Thing
;
89 TrackedThing
->FileName
= FileName
;
90 TrackedThing
->LineNo
= LineNo
;
93 InsertHeadList( &AllocatedObjectsList
, &TrackedThing
->Entry
);
94 ShowTrackedThing( "Alloc", TrackedThing
, FileName
, LineNo
);
97 TcpipReleaseSpinLock( &AllocatedObjectsLock
, OldIrql
);
99 /*TrackDumpFL( FileName, LineNo );*/
102 BOOL
ShowTag( DWORD Tag
) {
105 for( i
= 0; TagsToShow
[i
] && TagsToShow
[i
] != Tag
; i
++ );
107 return TagsToShow
[i
] ? TRUE
: FALSE
;
110 VOID
UntrackFL( PCHAR File
, DWORD Line
, PVOID Thing
) {
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
, File
, Line
);
124 ExFreeToNPagedLookasideList( &AllocatedObjectsLookasideList
,
127 TcpipReleaseSpinLock( &AllocatedObjectsLock
, OldIrql
);
128 /* TrackDumpFL( File, Line ); */
131 Entry
= Entry
->Flink
;
133 TcpipReleaseSpinLock( &AllocatedObjectsLock
, OldIrql
);
134 TrackDumpFL( File
, Line
);
135 DbgPrint("UNTRACK: SPECIFIED ALREADY FREE ITEM %x\n", Thing
);
139 VOID
TrackDumpFL( PCHAR File
, DWORD Line
) {
142 PALLOCATION_TRACKER Thing
;
144 TI_DbgPrint(MAX_TRACE
,("Dump: %s:%d\n", File
, Line
));
146 TcpipAcquireSpinLock( &AllocatedObjectsLock
, &OldIrql
);
147 Entry
= AllocatedObjectsList
.Flink
;
148 while( Entry
!= &AllocatedObjectsList
) {
149 Thing
= CONTAINING_RECORD(Entry
, ALLOCATION_TRACKER
, Entry
);
150 ShowTrackedThing( "Dump ", Thing
, 0, 0 );
151 Entry
= Entry
->Flink
;
153 TcpipReleaseSpinLock( &AllocatedObjectsLock
, OldIrql
);