Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

328 lines
7.4 KiB

/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
memory.h
Abstract:
Implements macros and declares functions for basic allocation functions.
Author:
Marc R. Whitten (marcw) 09-Sep-1999
Revision History:
jimschm 25-Jul-2001 Updated for consistent coding conventions
--*/
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
//
// Constants
//
#define INVALID_PTR ((PVOID)-1)
#undef INITIALIZE_MEMORY_CODE
#define INITIALIZE_MEMORY_CODE if (!MemInitialize()) { __leave; }
//
// Globals
//
extern HANDLE g_hHeap;
//
// Function Prototypes
//
BOOL
MemInitialize (
VOID
);
//
// Reusable memory alloc, kind of like a GROWBUFFER but more simple. Here is
// an example of how it might be used:
//
// buffer = NULL;
//
// while (pGetAnItemIndex (&i)) {
// size = pComputeBufferSizeForThisItem (i);
// buffer = (PTSTR) MemReuseAlloc (g_hHeap, ptr, size);
// pProcessSomething (i, buffer);
// }
//
// MemReuseFree (buffer);
//
// Allocations are always rounded up to the next 1K boundary, and allocations
// occur only when the buffer is too small or hasn't been allocated.
//
PVOID
MemReuseAlloc (
IN HANDLE Heap,
IN PVOID OldPtr, OPTIONAL
IN DWORD SizeNeeded
);
VOID
MemReuseFree (
IN HANDLE Heap,
IN PVOID Ptr
);
#ifdef DEBUG
//
// Fast allocation routines (tracked versions)
//
PVOID
DbgFastAlloc (
IN PCSTR SourceFile,
IN DWORD Line,
IN SIZE_T Size
);
PVOID
DbgFastReAlloc (
IN PCSTR SourceFile,
IN DWORD Line,
IN PCVOID OldBlock,
IN SIZE_T Size
);
BOOL
DbgFastFree (
IN PCSTR SourceFile,
IN DWORD Line,
IN PCVOID Block
);
PVOID
DbgFastAllocNeverFail (
IN PCSTR SourceFile,
IN DWORD Line,
IN SIZE_T Size
);
PVOID
DbgFastReAllocNeverFail (
IN PCSTR SourceFile,
IN DWORD Line,
IN PCVOID OldBlock,
IN SIZE_T Size
);
#define MemFastAlloc(size) DbgFastAlloc(__FILE__,__LINE__,size)
#define MemFastReAlloc(oldblock,size) DbgFastReAlloc(__FILE__,__LINE__,oldblock,size)
#define MemFastFree(block) DbgFastFree(__FILE__,__LINE__,block)
#define MemFastAllocNeverFail(size) DbgFastAllocNeverFail(__FILE__,__LINE__,size)
#define MemFastReAllocNeverFail(oldblock,size) DbgFastReAllocNeverFail(__FILE__,__LINE__,oldblock,size)
//
// Regular heap access (tracked versions)
//
PVOID
DbgHeapAlloc (
IN PCSTR SourceFile,
IN DWORD Line,
IN HANDLE Heap,
IN DWORD Flags,
IN SIZE_T Size
);
PVOID
DbgHeapReAlloc (
IN PCSTR SourceFile,
IN DWORD Line,
IN HANDLE Heap,
IN DWORD Flags,
IN PCVOID Mem,
IN SIZE_T Size
);
PVOID
DbgHeapAllocNeverFail (
IN PCSTR SourceFile,
IN DWORD Line,
IN HANDLE Heap,
IN DWORD Flags,
IN SIZE_T Size
);
PVOID
DbgHeapReAllocNeverFail (
IN PCSTR SourceFile,
IN DWORD Line,
IN HANDLE Heap,
IN DWORD Flags,
IN PCVOID Mem,
IN SIZE_T Size
);
BOOL
DbgHeapFree (
IN PCSTR SourceFile,
IN DWORD Line,
IN HANDLE Heap,
IN DWORD Flags,
IN PCVOID Mem
);
#define MemAllocNeverFail(heap,flags,size) DbgHeapAllocNeverFail(__FILE__,__LINE__,heap,flags,size)
#define MemReAllocNeverFail(heap,flags,oldblock,size) DbgHeapReAllocNeverFail(__FILE__,__LINE__,heap,flags,oldblock,size)
#define MemAlloc(heap,flags,size) DbgHeapAlloc(__FILE__,__LINE__,heap,flags,size)
#define MemReAlloc(heap,flags,oldblock,size) DbgHeapReAlloc(__FILE__,__LINE__,heap,flags,oldblock,size)
#define MemFree(heap,flags,block) DbgHeapFree(__FILE__,__LINE__,heap,flags,block)
//
// Aides for debugging memory corruption
//
VOID
DbgHeapCheck (
IN PCSTR SourceFile,
IN DWORD Line,
IN HANDLE Heap
);
#define MemHeapCheck(heap) DbgHeapCheck(__FILE__,__LINE__,heap)
VOID
DbgDumpHeapStats (
VOID
);
VOID
DbgDumpHeapLeaks (
VOID
);
SIZE_T
DbgHeapValidatePtr (
IN HANDLE Heap,
IN PCVOID CallerPtr,
IN PCSTR File,
IN DWORD Line
);
#define MemCheckPtr(heap,ptr) (DbgHeapValidatePtr(heap,ptr,__FILE__,__LINE__) != INVALID_PTR)
#else // !DEBUG
//
// Fast allocation routines
//
PVOID
MemFastAlloc (
IN SIZE_T Size
);
PVOID
MemFastReAlloc (
IN PCVOID OldBlock,
IN SIZE_T Size
);
BOOL
MemFastFree (
IN PCVOID Block
);
PVOID
MemFastAllocNeverFail (
IN SIZE_T Size
);
PVOID
MemFastReAllocNeverFail (
IN PVOID OldBlock,
IN SIZE_T Size
);
//
// Fail-proof memory allocators
//
PVOID
MemAllocNeverFail (
IN HANDLE Heap,
IN DWORD Flags,
IN SIZE_T Size
);
PVOID
MemReAllocNeverFail (
IN HANDLE Heap,
IN DWORD Flags,
IN PVOID OldBlock,
IN SIZE_T Size
);
#define MemAlloc(heap,flags,size) HeapAlloc(heap,flags,size)
#define MemReAlloc(heap,flags,oldblock,size) HeapReAlloc(heap,flags,oldblock,size)
#define MemFree(x,y,z) HeapFree(x,y,(PVOID)(z))
//
// Stub macros
//
#define DbgDumpHeapStats()
#define DbgDumpHeapLeaks()
#define MemHeapCheck(heap) (1)
#define MemCheckPtr(heap,ptr) (1)
#endif
PVOID
MemFastAllocAndZero (
IN SIZE_T Size
);
PVOID
MemFastReAllocAndZero (
IN PCVOID Ptr,
IN SIZE_T Size
);
//
// Wrapper macros
//
#define FAST_MALLOC_UNINIT(size) MemFastAlloc (size)
#define FAST_MALLOC_ZEROED(size) MemFastAllocAndZero (size)
#define FAST_MALLOC(size) FAST_MALLOC_UNINIT (size)
#define FAST_REALLOC_UNINIT(ptr,size) MemFastReAlloc (ptr, size)
#define FAST_REALLOC_ZEROED(ptr,size) MemFastReAllocAndZero (ptr, size)
#define FAST_REALLOC(ptr,size) REALLOC_UNINIT (ptr, size)
#define FAST_FREE(ptr) MemFastFree ((PVOID)(ptr))
#define MALLOC_UNINIT(size) MemAlloc (g_hHeap, 0, size)
#define MALLOC_ZEROED(size) MemAlloc (g_hHeap, HEAP_ZERO_MEMORY, size)
#define MALLOC(size) MALLOC_UNINIT (size)
#define REALLOC_UNINIT(ptr,size) MemReAlloc (g_hHeap, 0, ptr, size)
#define REALLOC_ZEROED(ptr,size) MemReAlloc (g_hHeap, HEAP_ZERO_MEMORY, ptr, size)
#define REALLOC(ptr,size) REALLOC_UNINIT (ptr, size)
#define FREE(ptr) MemFree (g_hHeap, 0, (PVOID)(ptr))
#ifdef __cplusplus
}
#endif