summaryrefslogtreecommitdiffstats
path: root/private/ntos/mup/pool.c
blob: d16a4b457512eeeb636ff4d11c2ad8cb0884d472 (plain) (blame)
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