windows-nt/Source/XPSP1/NT/base/ntos/inc/heappage.h
2020-09-26 16:20:57 +08:00

406 lines
10 KiB
C

/*++
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.
//
#define PAGE_HEAP_ENABLE_PAGE_HEAP 0x0001
#define PAGE_HEAP_COLLECT_STACK_TRACES 0x0002
#define PAGE_HEAP_RESERVED_04 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
#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
//
// 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_