|
|
/*++
Copyright (c) 1994-2000 Microsoft Corporation
Module Name:
heappage.h
Abstract:
External interface for page heap manager. Author:
Tom McGuire (TomMcg) 06-Jan-1995 Silviu Calinoiu (SilviuC) 22-Feb-2000
Revision History:
--*/
#ifndef _HEAP_PAGE_H_
#define _HEAP_PAGE_H_
//
// #defining DEBUG_PAGE_HEAP will cause the page heap manager
// to be compiled. Only #define this flag if NOT kernel mode.
// Probably want to define this just for checked-build (DBG).
//
#ifndef NTOS_KERNEL_RUNTIME
#define DEBUG_PAGE_HEAP 1
#endif
//silviuc: #include "heappagi.h"
#ifndef DEBUG_PAGE_HEAP
//
// These macro-based hooks should be defined to nothing so they
// simply "go away" during compile if the debug heap manager is
// not desired (retail builds).
//
#define IS_DEBUG_PAGE_HEAP_HANDLE( HeapHandle ) FALSE
#define IF_DEBUG_PAGE_HEAP_THEN_RETURN( Handle, ReturnThis )
#define IF_DEBUG_PAGE_HEAP_THEN_CALL( Handle, CallThis )
#define IF_DEBUG_PAGE_HEAP_THEN_BREAK( Handle, Text, ReturnThis )
#define HEAP_FLAG_PAGE_ALLOCS 0
#define RtlpDebugPageHeapValidate( HeapHandle, Flags, Address ) TRUE
#else // DEBUG_PAGE_HEAP
//
// The following definitions and prototypes are the external interface
// for hooking the debug heap manager in the retail heap manager.
//
#define HEAP_FLAG_PAGE_ALLOCS 0x01000000
#define HEAP_PROTECTION_ENABLED 0x02000000
#define HEAP_BREAK_WHEN_OUT_OF_VM 0x04000000
#define HEAP_NO_ALIGNMENT 0x08000000
#define IS_DEBUG_PAGE_HEAP_HANDLE( HeapHandle ) \
(((PHEAP)(HeapHandle))->ForceFlags & HEAP_FLAG_PAGE_ALLOCS )
#define IF_DEBUG_PAGE_HEAP_THEN_RETURN( Handle, ReturnThis ) \
{ \ if ( IS_DEBUG_PAGE_HEAP_HANDLE( Handle )) \ { \ return ReturnThis; \ } \ }
#define IF_DEBUG_PAGE_HEAP_THEN_CALL( Handle, CallThis ) \
{ \ if ( IS_DEBUG_PAGE_HEAP_HANDLE( Handle )) \ { \ CallThis; \ return; \ } \ }
#define IF_DEBUG_PAGE_HEAP_THEN_BREAK( Handle, Text, ReturnThis ) \
{ \ if ( IS_DEBUG_PAGE_HEAP_HANDLE( Handle )) \ { \ RtlpDebugPageHeapBreak( Text ); \ return ReturnThis; \ } \ }
PVOID RtlpDebugPageHeapCreate( IN ULONG Flags, IN PVOID HeapBase, IN SIZE_T ReserveSize, IN SIZE_T CommitSize, IN PVOID Lock, IN PRTL_HEAP_PARAMETERS Parameters );
PVOID RtlpDebugPageHeapAllocate( IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size );
BOOLEAN RtlpDebugPageHeapFree( IN PVOID HeapHandle, IN ULONG Flags, IN PVOID Address );
PVOID RtlpDebugPageHeapReAllocate( IN PVOID HeapHandle, IN ULONG Flags, IN PVOID Address, IN SIZE_T Size );
PVOID RtlpDebugPageHeapDestroy( IN PVOID HeapHandle );
SIZE_T RtlpDebugPageHeapSize( IN PVOID HeapHandle, IN ULONG Flags, IN PVOID Address );
ULONG RtlpDebugPageHeapGetProcessHeaps( ULONG NumberOfHeaps, PVOID *ProcessHeaps );
ULONG RtlpDebugPageHeapCompact( IN PVOID HeapHandle, IN ULONG Flags );
BOOLEAN RtlpDebugPageHeapValidate( IN PVOID HeapHandle, IN ULONG Flags, IN PVOID Address );
NTSTATUS RtlpDebugPageHeapWalk( IN PVOID HeapHandle, IN OUT PRTL_HEAP_WALK_ENTRY Entry );
BOOLEAN RtlpDebugPageHeapLock( IN PVOID HeapHandle );
BOOLEAN RtlpDebugPageHeapUnlock( IN PVOID HeapHandle );
BOOLEAN RtlpDebugPageHeapSetUserValue( IN PVOID HeapHandle, IN ULONG Flags, IN PVOID Address, IN PVOID UserValue );
BOOLEAN RtlpDebugPageHeapGetUserInfo( IN PVOID HeapHandle, IN ULONG Flags, IN PVOID Address, OUT PVOID* UserValue, OUT PULONG UserFlags );
BOOLEAN RtlpDebugPageHeapSetUserFlags( IN PVOID HeapHandle, IN ULONG Flags, IN PVOID Address, IN ULONG UserFlagsReset, IN ULONG UserFlagsSet );
BOOLEAN RtlpDebugPageHeapSerialize( IN PVOID HeapHandle );
NTSTATUS RtlpDebugPageHeapExtend( IN PVOID HeapHandle, IN ULONG Flags, IN PVOID Base, IN SIZE_T Size );
NTSTATUS RtlpDebugPageHeapZero( IN PVOID HeapHandle, IN ULONG Flags );
NTSTATUS RtlpDebugPageHeapReset( IN PVOID HeapHandle, IN ULONG Flags );
NTSTATUS RtlpDebugPageHeapUsage( IN PVOID HeapHandle, IN ULONG Flags, IN OUT PRTL_HEAP_USAGE Usage );
BOOLEAN RtlpDebugPageHeapIsLocked( IN PVOID HeapHandle );
VOID RtlpDebugPageHeapBreak( PCH Text );
//
// Page Heap Global Flags
//
// These flags are kept in a global variable that can be set from
// debugger. During heap creation these flags are stored in a per heap
// structure and control the behavior of that particular heap.
//
// PAGE_HEAP_ENABLE_PAGE_HEAP
//
// This flag is set by default. It means that page heap allocations
// should be used always. The flag is useful if we want to use page
// heap only for certain heaps and stick with normal heaps for the
// others. It can be changed on the fly (after heap creation) to direct
// allocations in one heap or another.
//
// PAGE_HEAP_CATCH_BACKWARD_OVERRUNS
//
// Places the N/A page at the beginning of the block.
//
// PAGE_HEAP_UNALIGNED_ALLOCATIONS
//
// For historical reasons (related to RPC) by default page heap
// aligns allocations at 8 byte boundaries. With this flag set
// this does not happen and we can catch instantly off by one
// errors for unaligned allocations.
//
// PAGE_HEAP_SMART_MEMORY_USAGE
//
// This flag reduces the committed memory consumption in half
// by using decommitted ranges (reserved virtual space) instead
// of N/A committed pages. This flag is disabled by catch backward
// overruns.
//
// PAGE_HEAP_USE_SIZE_RANGE
//
// Use page heap for allocations in the size range specified by:
// RtlpDphSizeRangeStart..RtlpDphSizeRangeEnd.
//
// PAGE_HEAP_USE_DLL_RANGE
//
// Use page heap for allocations in the address range specified by:
// RtlpDphDllRangeStart..RtlpDphDllRangeEnd. If the stack trace
// of the allocation contains one address in this range then
// allocation will be made from page heap.
//
// PAGE_HEAP_USE_RANDOM_DECISION
//
// Use page heap if we randomly decide so.
//
// PAGE_HEAP_USE_DLL_NAMES
//
// Use page heap if allocation call was generated from on of the
// target dlls.
//
// PAGE_HEAP_USE_FAULT_INJECTION
//
// Fault inject heap allocation calls based on a simple
// probabilistic model (see FaultProbability and FaultTimeOut).
//
// PAGE_HEAP_PROTECT_META_DATA
//
// Keep page heap metadata read only if we are not executing inside
// the page heap code.
//
// PAGE_CHECK_NO_SERIALIZE_ACCESS
//
// Additional checks for multi-threaded access for no_serialize
// heaps. This flag can trigger false positives in MPheap. It needs
// to be used only on processes that do not use MPheap-like heaps.
//
// PAGE_HEAP_USE_READONLY
//
// The page following (or preceding) the user allocation is marked
// RO instead of NA. This is useful when testing RPC servers which
// by design during unmarshalling might go off by a few bytes when
// probing parameters. This is so for performance reasons.
//
#define PAGE_HEAP_ENABLE_PAGE_HEAP 0x0001
#define PAGE_HEAP_COLLECT_STACK_TRACES 0x0002
#define PAGE_HEAP_NO_UMDH_SUPPORT 0x0004
#define PAGE_HEAP_RESERVED_08 0x0008
#define PAGE_HEAP_CATCH_BACKWARD_OVERRUNS 0x0010
#define PAGE_HEAP_UNALIGNED_ALLOCATIONS 0x0020
#define PAGE_HEAP_SMART_MEMORY_USAGE 0x0040 // obsolete
#define PAGE_HEAP_USE_SIZE_RANGE 0x0080
#define PAGE_HEAP_USE_DLL_RANGE 0x0100
#define PAGE_HEAP_USE_RANDOM_DECISION 0x0200
#define PAGE_HEAP_USE_DLL_NAMES 0x0400
#define PAGE_HEAP_USE_FAULT_INJECTION 0x0800
#define PAGE_HEAP_PROTECT_META_DATA 0x1000
#define PAGE_HEAP_CHECK_NO_SERIALIZE_ACCESS 0x2000
#define PAGE_HEAP_NO_LOCK_CHECKS 0x4000
#define PAGE_HEAP_USE_READONLY 0x8000
//
// Is page heap enabled for this process?
//
extern BOOLEAN RtlpDebugPageHeap;
//
// `RtlpDphGlobalFlags' stores the global page heap flags.
// The value of this variable is copied into the per heap
// flags (ExtraFlags field) during heap creation. This variable
// might get its value from the `PageHeap' ImageFileOptions
// registry key.
//
extern ULONG RtlpDphGlobalFlags;
//
// Page heap global flags. They might be read from the
// `ImageFileOptions' registry key.
//
extern ULONG RtlpDphSizeRangeStart; extern ULONG RtlpDphSizeRangeEnd; extern ULONG RtlpDphDllRangeStart; extern ULONG RtlpDphDllRangeEnd; extern ULONG RtlpDphRandomProbability; extern WCHAR RtlpDphTargetDlls[];
//
// If not zero controls the probability with which
// allocations will be failed on purpose by page heap
// manager. Timeout represents the initial period during
// process initialization when faults are not allowed.
//
extern ULONG RtlpDphFaultProbability; extern ULONG RtlpDphFaultTimeOut;
//
// Stuff needed for per dll logic implemented in the loader
//
const WCHAR * RtlpDphIsDllTargeted ( const WCHAR * Name );
VOID RtlpDphTargetDllsLoadCallBack ( PUNICODE_STRING Name, PVOID Address, ULONG Size );
//
// Functions needed to turn on/off fault injection.
// They are needed in the loader so that allocations
// succeed while in LdrLoadDll code path.
//
VOID RtlpDphDisableFaultInjection ( );
VOID RtlpDphEnableFaultInjection ( );
#endif // DEBUG_PAGE_HEAP
#endif // _HEAP_PAGE_H_
|