//////////////////////////////////////////////////////////////////// // Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine // All rights reserved // This file was released under the GPLv2 on June 2015. //////////////////////////////////////////////////////////////////// #ifndef __MY_MEM_TOOLS_H__ #define __MY_MEM_TOOLS_H__ #define MY_HEAP_FLAG_USED 0x00000001 #define MY_HEAP_FLAG_LEN_MASK 0xfffffffe #define MyFreeMemoryAndPointer(ptr) \ if(ptr) { \ MyFreePool__(ptr); \ ptr = NULL; \ } #define MY_USE_ALIGN //#define MY_MEM_BOUNDS_CHECK typedef struct _MEM_ALLOC_DESC { ULONG Addr; ULONG Len; #ifdef MY_HEAP_TRACK_OWNERS USHORT Src; USHORT Line; #endif #ifdef MY_HEAP_TRACK_REF // PCHAR Ref; PCHAR Tag; #endif } MEM_ALLOC_DESC, *PMEM_ALLOC_DESC; typedef struct _MEM_FRAME_ALLOC_DESC { PMEM_ALLOC_DESC Frame; ULONG LastUsed; ULONG FirstFree; ULONG Type; } MEM_FRAME_ALLOC_DESC, *PMEM_FRAME_ALLOC_DESC; extern PCHAR BreakAddr; extern ULONG MemTotalAllocated; #define MY_HEAP_FRAME_SIZE (256*1024) #define MY_HEAP_MAX_FRAMES 512 #define MY_HEAP_MAX_BLOCKS 4*1024 // blocks per frame #ifdef USE_THREAD_HEAPS //extern HANDLE MemLock; extern "C" VOID ExInitThreadPools(); extern "C" VOID ExDeInitThreadPools(); extern "C" VOID ExFreeThreadPool(); #endif //USE_THREAD_HEAPS // Mem BOOLEAN MyAllocInit(VOID); VOID MyAllocRelease(VOID); #ifdef MY_HEAP_TRACK_OWNERS PCHAR MyAllocatePool(ULONG Type, ULONG size, USHORT Src, USHORT Line #ifdef MY_HEAP_TRACK_REF ,PCHAR Tag #endif //MY_HEAP_TRACK_REF ); ULONG MyReallocPool( PCHAR addr, ULONG OldLength, PCHAR* NewBuff, ULONG NewLength, USHORT Src, USHORT Line); #else PCHAR __fastcall MyAllocatePool(ULONG Type, ULONG size #ifdef MY_HEAP_TRACK_REF ,PCHAR Tag #endif //MY_HEAP_TRACK_REF ); ULONG __fastcall MyReallocPool( PCHAR addr, ULONG OldLength, PCHAR* NewBuff, ULONG NewLength); #endif VOID __fastcall MyFreePool(PCHAR addr); #ifdef MY_HEAP_CHECK_BOUNDS #define MY_HEAP_ALIGN 63 #else #define MY_HEAP_ALIGN 63 #endif #define PAGE_SIZE_ALIGN (PAGE_SIZE - 1) #define AlignToPageSize(size) (((size)+PAGE_SIZE_ALIGN)&(~PAGE_SIZE_ALIGN)) #define MyAlignSize__(size) (((size)+MY_HEAP_ALIGN)&(~MY_HEAP_ALIGN)) #ifdef MY_HEAP_FORCE_NONPAGED #define MyFixMemType(type) NonPagedPool #else //MY_HEAP_FORCE_NONPAGED #define MyFixMemType(type) (type) #endif //MY_HEAP_FORCE_NONPAGED #ifdef MY_USE_INTERNAL_MEMMANAGER #ifdef MY_HEAP_TRACK_OWNERS #ifdef MY_HEAP_TRACK_REF #define MyAllocatePool__(type,size) MyAllocatePool(MyFixMemType(type), MyAlignSize__(size), UDF_BUG_CHECK_ID, __LINE__, NULL) #define MyAllocatePoolTag__(type,size,tag) MyAllocatePool(MyFixMemType(type), MyAlignSize__(size), UDF_BUG_CHECK_ID, __LINE__, (PCHAR)(tag)) #else #define MyAllocatePool__(type,size) MyAllocatePool(MyFixMemType(type), MyAlignSize__(size), UDF_BUG_CHECK_ID, __LINE__) #define MyAllocatePoolTag__(type,size,tag) MyAllocatePool(MyFixMemType(type), MyAlignSize__(size), UDF_BUG_CHECK_ID, __LINE__) #endif //MY_HEAP_TRACK_REF #else //MY_HEAP_TRACK_OWNERS #ifdef MY_HEAP_TRACK_REF #define MyAllocatePool__(type,size) MyAllocatePool(MyFixMemType(type), MyAlignSize__(size), NULL) #define MyAllocatePoolTag__(type,size,tag) MyAllocatePool(MyFixMemType(type), MyAlignSize__(size), (PCHAR)(tag)) #else #define MyAllocatePool__(type,size) MyAllocatePool(MyFixMemType(type), MyAlignSize__(size)) #define MyAllocatePoolTag__(type,size,tag) MyAllocatePool(MyFixMemType(type), MyAlignSize__(size)) #endif //MY_HEAP_TRACK_REF #endif //MY_HEAP_TRACK_OWNERS #define MyFreePool__(addr) MyFreePool((PCHAR)(addr)) #ifdef MY_HEAP_TRACK_OWNERS #define MyReallocPool__(addr, len, pnewaddr, newlen) MyReallocPool((PCHAR)(addr), MyAlignSize__(len), pnewaddr, MyAlignSize__(newlen), UDF_BUG_CHECK_ID, __LINE__) #else #define MyReallocPool__(addr, len, pnewaddr, newlen) MyReallocPool((PCHAR)(addr), MyAlignSize__(len), pnewaddr, MyAlignSize__(newlen)) #endif #ifdef UDF_DBG LONG MyFindMemBaseByAddr( PCHAR addr ); #define MyCheckArray(base, index) \ ASSERT(MyFindMemBaseByAddr((PCHAR)(base)) == MyFindMemBaseByAddr((PCHAR)(base+(index)))) #else #define MyCheckArray(base, index) #endif //UDF_DBG #else //MY_USE_INTERNAL_MEMMANAGER #ifndef MY_USE_ALIGN #undef MyAlignSize__ #define MyAlignSize__(size) (size) #endif BOOLEAN inline MyAllocInit(VOID) {return TRUE;} #define MyAllocRelease() #ifndef MY_MEM_BOUNDS_CHECK #ifdef TRACK_SYS_ALLOC_CALLERS #define MyAllocatePool__(type,size) DebugAllocatePool(NonPagedPool,MyAlignSize__(size), UDF_BUG_CHECK_ID, __LINE__) #define MyAllocatePoolTag__(type,size,tag) DebugAllocatePool(NonPagedPool,MyAlignSize__(size), UDF_BUG_CHECK_ID, __LINE__) #else //TRACK_SYS_ALLOC_CALLERS #define MyAllocatePool__(type,size) DbgAllocatePoolWithTag(NonPagedPool,MyAlignSize__(size), 'fNWD') #define MyAllocatePoolTag__(type,size,tag) DbgAllocatePoolWithTag(NonPagedPool,MyAlignSize__(size), tag) #endif //TRACK_SYS_ALLOC_CALLERS #define MyFreePool__(addr) DbgFreePool((PCHAR)(addr)) #else //MY_MEM_BOUNDS_CHECK #ifdef TRACK_SYS_ALLOC_CALLERS #define MyAllocatePool_(type,size) DebugAllocatePool(NonPagedPool,MyAlignSize__(size), UDF_BUG_CHECK_ID, __LINE__) #define MyAllocatePoolTag_(type,size,tag) DebugAllocatePool(NonPagedPool,MyAlignSize__(size), UDF_BUG_CHECK_ID, __LINE__) #else //TRACK_SYS_ALLOC_CALLERS #define MyAllocatePool_(type,size) DbgAllocatePoolWithTag(NonPagedPool,MyAlignSize__(size), 'mNWD') #define MyAllocatePoolTag_(type,size,tag) DbgAllocatePoolWithTag(NonPagedPool,MyAlignSize__(size), tag) #endif //TRACK_SYS_ALLOC_CALLERS #define MyFreePool_(addr) DbgFreePool((PCHAR)(addr)) #define MyAllocatePool__(type,size) MyAllocatePoolTag__(type,size,'mNWD') /* PVOID inline MyAllocatePool__(ULONG type, ULONG len) { PCHAR newaddr; ULONG i; // newaddr = (PCHAR)MyAllocatePool_(type, len+MY_HEAP_ALIGN+1); #ifdef TRACK_SYS_ALLOC_CALLERS newaddr = (PCHAR)DebugAllocatePool(type,len+MY_HEAP_ALIGN+1, 0x202, __LINE__); #else //TRACK_SYS_ALLOC_CALLERS newaddr = (PCHAR)MyAllocatePool_(type,len+MY_HEAP_ALIGN+1); #endif //TRACK_SYS_ALLOC_CALLERS if(!newaddr) return NULL; for(i=0; i len) { //RtlZeroMemory(newaddr+len, newlen - len); } /* #ifdef MY_MEM_BOUNDS_CHECK for(i=0; i