1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
heapmgr.c
Abstract:
This module contains debugging routines for the MUP use of
non-paged pool.
Author:
Manny Weiser (mannyw) 27-Jan-1992
--*/
#include "mup.h"
#if MUPDBG
LIST_ENTRY PagedPoolList = { &PagedPoolList, &PagedPoolList };
typedef struct _POOL_HEADER {
LIST_ENTRY ListEntry;
ULONG RequestedSize;
BLOCK_TYPE BlockType;
PVOID Caller;
PVOID CallersCaller;
} POOL_HEADER, *PPOOL_HEADER;
struct _MEMORY_STATISTICS {
ULONG BytesInUse;
ULONG TotalBytesAllocated;
ULONG MaxBytesInUse;
ULONG TotalBytesFreed;
ULONG BlocksInUse;
ULONG TotalBlocksAllocated;
ULONG MaxBlocksInUse;
ULONG TotalBlocksFreed;
} MupMemoryUsage = { 0, 0, 0, 0, 0, 0, 0, 0 };
#ifdef ALLOC_PRAGMA
#pragma alloc_text( PAGE, MupAllocatePoolDebug )
#pragma alloc_text( PAGE, MupFreePoolDebug )
#endif
PVOID
MupAllocatePoolDebug (
IN POOL_TYPE PoolType,
IN CLONG BlockSize,
IN BLOCK_TYPE BlockType
)
{
PPOOL_HEADER header;
KIRQL oldIrql;
PAGED_CODE();
header = FsRtlAllocatePool( PoolType, sizeof(POOL_HEADER) + BlockSize );
header->RequestedSize = BlockSize;
header->BlockType = BlockType;
RtlGetCallersAddress( &header->Caller, &header->CallersCaller );
ACQUIRE_LOCK( &MupDebugLock );
InsertTailList( &PagedPoolList, &header->ListEntry );
MupMemoryUsage.TotalBlocksAllocated += 1;
MupMemoryUsage.BlocksInUse += 1;
MupMemoryUsage.TotalBytesAllocated += BlockSize;
MupMemoryUsage.BytesInUse += BlockSize;
if ( MupMemoryUsage.BlocksInUse > MupMemoryUsage.MaxBlocksInUse ) {
MupMemoryUsage.MaxBlocksInUse = MupMemoryUsage.BlocksInUse;
}
if ( MupMemoryUsage.BytesInUse > MupMemoryUsage.MaxBytesInUse ) {
MupMemoryUsage.MaxBytesInUse = MupMemoryUsage.BytesInUse;
}
RELEASE_LOCK( &MupDebugLock );
return (PVOID)(header + 1);
} // MupAllocatePagedPoolDebug
VOID
MupFreePoolDebug (
IN PVOID P
)
{
PPOOL_HEADER header;
KIRQL oldIrql;
PAGED_CODE();
header = (PPOOL_HEADER)P - 1;
ACQUIRE_LOCK( &MupDebugLock );
RemoveEntryList( &header->ListEntry );
MupMemoryUsage.TotalBlocksFreed += 1;
MupMemoryUsage.BlocksInUse -= 1;
MupMemoryUsage.TotalBytesFreed += header->RequestedSize;
MupMemoryUsage.BytesInUse -= header->RequestedSize;
RELEASE_LOCK( &MupDebugLock );
ExFreePool( header );
} // MupFreePagedPoolDebug
#endif // MUPDBG
|