NT4/private/ntos/mup/pool.c
2020-09-30 17:12:29 +02:00

117 lines
2.5 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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