1 #define MEMTRACK_NO_POOL
6 LIST_ENTRY AllocatedObjectsList
;
7 KSPIN_LOCK AllocatedObjectsLock
;
8 DWORD TagsToShow
[MEMTRACK_MAX_TAGS_TO_TRACK
] = { 0 };
10 VOID
TrackTag( DWORD Tag
) {
13 for( i
= 0; TagsToShow
[i
]; i
++ );
18 KeInitializeSpinLock( &AllocatedObjectsLock
);
19 InitializeListHead( &AllocatedObjectsList
);
22 VOID
ShowTrackedThing( PCHAR What
, PALLOCATION_TRACKER Thing
,
23 PCHAR File
, UINT Line
) {
24 /* if( ShowTag( Thing->Tag ) ) */
26 DbgPrint( "[%s] Thing %08x %c%c%c%c (%s:%d) (Called from %s:%d)\n",
29 ((PCHAR
)&Thing
->Tag
)[3],
30 ((PCHAR
)&Thing
->Tag
)[2],
31 ((PCHAR
)&Thing
->Tag
)[1],
32 ((PCHAR
)&Thing
->Tag
)[0],
37 DbgPrint( "[%s] Thing %08x %c%c%c%c (%s:%d)\n",
40 ((PCHAR
)&Thing
->Tag
)[3],
41 ((PCHAR
)&Thing
->Tag
)[2],
42 ((PCHAR
)&Thing
->Tag
)[1],
43 ((PCHAR
)&Thing
->Tag
)[0],
49 VOID
TrackWithTag( DWORD Tag
, PVOID Thing
, PCHAR FileName
, DWORD LineNo
) {
50 PALLOCATION_TRACKER TrackedThing
=
51 ExAllocatePool( NonPagedPool
, sizeof(*TrackedThing
) );
55 PALLOCATION_TRACKER ThingInList
;
57 KeAcquireSpinLock( &AllocatedObjectsLock
, &OldIrql
);
58 Entry
= AllocatedObjectsList
.Flink
;
59 while( Entry
!= &AllocatedObjectsList
) {
60 ThingInList
= CONTAINING_RECORD(Entry
, ALLOCATION_TRACKER
, Entry
);
61 if( ThingInList
->Thing
== Thing
) {
62 RemoveEntryList(Entry
);
64 KeReleaseSpinLock( &AllocatedObjectsLock
, OldIrql
);
65 ShowTrackedThing( "Alloc", ThingInList
, FileName
, LineNo
);
66 ExFreePool( ThingInList
);
67 TrackDumpFL( FileName
, LineNo
);
68 DbgPrint("TRACK: SPECIFIED ALREADY ALLOCATED ITEM %x\n", Thing
);
74 KeReleaseSpinLock( &AllocatedObjectsLock
, OldIrql
);
77 TrackedThing
->Tag
= Tag
;
78 TrackedThing
->Thing
= Thing
;
79 TrackedThing
->FileName
= FileName
;
80 TrackedThing
->LineNo
= LineNo
;
82 ExInterlockedInsertTailList( &AllocatedObjectsList
,
84 &AllocatedObjectsLock
);
85 ShowTrackedThing( "Alloc", TrackedThing
, FileName
, LineNo
);
88 /*TrackDumpFL( FileName, LineNo );*/
91 BOOL
ShowTag( DWORD Tag
) {
94 for( i
= 0; TagsToShow
[i
] && TagsToShow
[i
] != Tag
; i
++ );
96 return TagsToShow
[i
] ? TRUE
: FALSE
;
99 VOID
UntrackFL( PCHAR File
, DWORD Line
, PVOID Thing
) {
102 PALLOCATION_TRACKER ThingInList
;
104 KeAcquireSpinLock( &AllocatedObjectsLock
, &OldIrql
);
105 Entry
= AllocatedObjectsList
.Flink
;
106 while( Entry
!= &AllocatedObjectsList
) {
107 ThingInList
= CONTAINING_RECORD(Entry
, ALLOCATION_TRACKER
, Entry
);
108 if( ThingInList
->Thing
== Thing
) {
109 RemoveEntryList(Entry
);
111 ShowTrackedThing( "Free ", ThingInList
, File
, Line
);
113 ExFreePool( ThingInList
);
114 KeReleaseSpinLock( &AllocatedObjectsLock
, OldIrql
);
115 /* TrackDumpFL( File, Line ); */
118 Entry
= Entry
->Flink
;
120 KeReleaseSpinLock( &AllocatedObjectsLock
, OldIrql
);
121 TrackDumpFL( File
, Line
);
122 DbgPrint("UNTRACK: SPECIFIED ALREADY FREE ITEM %x\n", Thing
);
126 VOID
TrackDumpFL( PCHAR File
, DWORD Line
) {
129 PALLOCATION_TRACKER Thing
;
131 DbgPrint("Dump: %s:%d\n", File
, Line
);
133 KeAcquireSpinLock( &AllocatedObjectsLock
, &OldIrql
);
134 Entry
= AllocatedObjectsList
.Flink
;
135 while( Entry
!= &AllocatedObjectsList
) {
136 Thing
= CONTAINING_RECORD(Entry
, ALLOCATION_TRACKER
, Entry
);
137 ShowTrackedThing( "Dump ", Thing
, 0, 0 );
138 Entry
= Entry
->Flink
;
140 KeReleaseSpinLock( &AllocatedObjectsLock
, OldIrql
);