/*** *winheap.h - Private include file for winheap directory. * * Copyright (c) 1988-1997, Microsoft Corporation. All rights reserved. * *Purpose: * Contains information needed by the C library heap code. * * [Internal] * ****/ #if _MSC_VER > 1000 #pragma once #endif /* _MSC_VER > 1000 */ #ifndef _INC_WINHEAP #define _INC_WINHEAP #ifndef _CRTBLD /* * This is an internal C runtime header file. It is used when building * the C runtimes only. It is not to be used as a public header file. */ #error ERROR: Use of C runtime library internal header file. #endif /* _CRTBLD */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #include #define BYTES_PER_PARA 16 #define DWORDS_PER_PARA 4 #define PARAS_PER_PAGE 256 // tunable value #define PAGES_PER_GROUP 8 // tunable value #define GROUPS_PER_REGION 32 // tunable value (max 32) #define BYTES_PER_PAGE (BYTES_PER_PARA * PARAS_PER_PAGE) #define BYTES_PER_GROUP (BYTES_PER_PAGE * PAGES_PER_GROUP) #define BYTES_PER_REGION (BYTES_PER_GROUP * GROUPS_PER_REGION) #define ENTRY_OFFSET 0x0000000cL // offset of entry in para #define OVERHEAD_PER_PAGE 0x00000010L // sixteen bytes of overhead #define MAX_FREE_ENTRY_SIZE (BYTES_PER_PAGE - OVERHEAD_PER_PAGE) #define BITV_COMMIT_INIT (((1 << GROUPS_PER_REGION) - 1) << \ (32 - GROUPS_PER_REGION)) #define MAX_ALLOC_DATA_SIZE 0x3f8 #define MAX_ALLOC_ENTRY_SIZE (MAX_ALLOC_DATA_SIZE + 0x8) typedef unsigned int BITVEC; typedef struct tagListHead { struct tagEntry * pEntryNext; struct tagEntry * pEntryPrev; } LISTHEAD, *PLISTHEAD; typedef struct tagEntry { int sizeFront; struct tagEntry * pEntryNext; struct tagEntry * pEntryPrev; } ENTRY, *PENTRY; typedef struct tagEntryEnd { int sizeBack; } ENTRYEND, *PENTRYEND; typedef struct tagGroup { int cntEntries; struct tagListHead listHead[64]; } GROUP, *PGROUP; typedef struct tagRegion { int indGroupUse; char cntRegionSize[64]; BITVEC bitvGroupHi[GROUPS_PER_REGION]; BITVEC bitvGroupLo[GROUPS_PER_REGION]; struct tagGroup grpHeadList[GROUPS_PER_REGION]; } REGION, *PREGION; typedef struct tagHeader { BITVEC bitvEntryHi; BITVEC bitvEntryLo; BITVEC bitvCommit; void * pHeapData; struct tagRegion * pRegion; } HEADER, *PHEADER; extern HANDLE _crtheap; /* * Global variable declarations for the small-block heap. */ extern size_t __sbh_threshold; void * __cdecl _nh_malloc(size_t, int); void * __cdecl _heap_alloc(size_t); extern PHEADER __sbh_pHeaderList; // pointer to list start extern PHEADER __sbh_pHeaderScan; // pointer to list rover extern int __sbh_sizeHeaderList; // allocated size of list extern int __sbh_cntHeaderList; // count of entries defined extern PHEADER __sbh_pHeaderDefer; extern int __sbh_indGroupDefer; extern size_t __cdecl _get_sb_threshold(void); extern int __cdecl _set_sb_threshold(size_t); extern int __cdecl _heap_init(int); extern void __cdecl _heap_term(void); extern void * __cdecl _malloc_base(size_t); extern void * __cdecl _nh_malloc_base(size_t, int); extern void * __cdecl _heap_alloc_base(size_t); extern void __cdecl _free_base(void *); extern void * __cdecl _realloc_base(void *, size_t); extern void * __cdecl _expand_base(void *, size_t); extern void * __cdecl _calloc_base(size_t, size_t); extern size_t __cdecl _msize_base(void *); extern int __cdecl __sbh_heap_init(void); extern void * __cdecl __sbh_alloc_block(int); extern PHEADER __cdecl __sbh_alloc_new_region(void); extern int __cdecl __sbh_alloc_new_group(PHEADER); extern PHEADER __cdecl __sbh_find_block(void *); #ifdef _DEBUG extern int __cdecl __sbh_verify_block(PHEADER, void *); #endif /* _DEBUG */ extern void __cdecl __sbh_free_block(PHEADER, void *); extern int __cdecl __sbh_resize_block(PHEADER, void *, int); extern void __cdecl __sbh_heapmin(void); extern int __cdecl __sbh_heap_check(void); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* _INC_WINHEAP */