1 ////////////////////////////////////////////////////////////////////
2 // Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
4 // This file was released under the GPLv2 on June 2015.
5 ////////////////////////////////////////////////////////////////////
7 #ifndef __MY_MEM_TOOLS_H__
8 #define __MY_MEM_TOOLS_H__
10 #define MY_HEAP_FLAG_USED 0x00000001
11 #define MY_HEAP_FLAG_LEN_MASK 0xfffffffe
13 #define MyFreeMemoryAndPointer(ptr) \
20 //#define MY_MEM_BOUNDS_CHECK
22 typedef struct _MEM_ALLOC_DESC
{
25 #ifdef MY_HEAP_TRACK_OWNERS
29 #ifdef MY_HEAP_TRACK_REF
33 } MEM_ALLOC_DESC
, *PMEM_ALLOC_DESC
;
35 typedef struct _MEM_FRAME_ALLOC_DESC
{
36 PMEM_ALLOC_DESC Frame
;
40 } MEM_FRAME_ALLOC_DESC
, *PMEM_FRAME_ALLOC_DESC
;
42 extern PCHAR BreakAddr
;
43 extern ULONG MemTotalAllocated
;
45 #define MY_HEAP_FRAME_SIZE (256*1024)
46 #define MY_HEAP_MAX_FRAMES 512
47 #define MY_HEAP_MAX_BLOCKS 4*1024 // blocks per frame
49 #ifdef USE_THREAD_HEAPS
50 //extern HANDLE MemLock;
51 extern "C" VOID
ExInitThreadPools();
52 extern "C" VOID
ExDeInitThreadPools();
53 extern "C" VOID
ExFreeThreadPool();
54 #endif //USE_THREAD_HEAPS
57 BOOLEAN
MyAllocInit(VOID
);
58 VOID
MyAllocRelease(VOID
);
59 #ifdef MY_HEAP_TRACK_OWNERS
60 PCHAR
MyAllocatePool(ULONG Type
, ULONG size
, USHORT Src
, USHORT Line
61 #ifdef MY_HEAP_TRACK_REF
63 #endif //MY_HEAP_TRACK_REF
65 ULONG
MyReallocPool( PCHAR addr
, ULONG OldLength
, PCHAR
* NewBuff
, ULONG NewLength
, USHORT Src
, USHORT Line
);
67 PCHAR __fastcall
MyAllocatePool(ULONG Type
, ULONG size
68 #ifdef MY_HEAP_TRACK_REF
70 #endif //MY_HEAP_TRACK_REF
72 ULONG __fastcall
MyReallocPool( PCHAR addr
, ULONG OldLength
, PCHAR
* NewBuff
, ULONG NewLength
);
74 VOID __fastcall
MyFreePool(PCHAR addr
);
76 #ifdef MY_HEAP_CHECK_BOUNDS
77 #define MY_HEAP_ALIGN 63
79 #define MY_HEAP_ALIGN 63
81 #define PAGE_SIZE_ALIGN (PAGE_SIZE - 1)
83 #define AlignToPageSize(size) (((size)+PAGE_SIZE_ALIGN)&(~PAGE_SIZE_ALIGN))
84 #define MyAlignSize__(size) (((size)+MY_HEAP_ALIGN)&(~MY_HEAP_ALIGN))
85 #ifdef MY_HEAP_FORCE_NONPAGED
86 #define MyFixMemType(type) NonPagedPool
87 #else //MY_HEAP_FORCE_NONPAGED
88 #define MyFixMemType(type) (type)
89 #endif //MY_HEAP_FORCE_NONPAGED
91 #ifdef MY_USE_INTERNAL_MEMMANAGER
93 #ifdef MY_HEAP_TRACK_OWNERS
94 #ifdef MY_HEAP_TRACK_REF
95 #define MyAllocatePool__(type,size) MyAllocatePool(MyFixMemType(type), MyAlignSize__(size), UDF_BUG_CHECK_ID, __LINE__, NULL)
96 #define MyAllocatePoolTag__(type,size,tag) MyAllocatePool(MyFixMemType(type), MyAlignSize__(size), UDF_BUG_CHECK_ID, __LINE__, (PCHAR)(tag))
98 #define MyAllocatePool__(type,size) MyAllocatePool(MyFixMemType(type), MyAlignSize__(size), UDF_BUG_CHECK_ID, __LINE__)
99 #define MyAllocatePoolTag__(type,size,tag) MyAllocatePool(MyFixMemType(type), MyAlignSize__(size), UDF_BUG_CHECK_ID, __LINE__)
100 #endif //MY_HEAP_TRACK_REF
101 #else //MY_HEAP_TRACK_OWNERS
102 #ifdef MY_HEAP_TRACK_REF
103 #define MyAllocatePool__(type,size) MyAllocatePool(MyFixMemType(type), MyAlignSize__(size), NULL)
104 #define MyAllocatePoolTag__(type,size,tag) MyAllocatePool(MyFixMemType(type), MyAlignSize__(size), (PCHAR)(tag))
106 #define MyAllocatePool__(type,size) MyAllocatePool(MyFixMemType(type), MyAlignSize__(size))
107 #define MyAllocatePoolTag__(type,size,tag) MyAllocatePool(MyFixMemType(type), MyAlignSize__(size))
108 #endif //MY_HEAP_TRACK_REF
109 #endif //MY_HEAP_TRACK_OWNERS
111 #define MyFreePool__(addr) MyFreePool((PCHAR)(addr))
113 #ifdef MY_HEAP_TRACK_OWNERS
114 #define MyReallocPool__(addr, len, pnewaddr, newlen) MyReallocPool((PCHAR)(addr), MyAlignSize__(len), pnewaddr, MyAlignSize__(newlen), UDF_BUG_CHECK_ID, __LINE__)
116 #define MyReallocPool__(addr, len, pnewaddr, newlen) MyReallocPool((PCHAR)(addr), MyAlignSize__(len), pnewaddr, MyAlignSize__(newlen))
125 #define MyCheckArray(base, index) \
126 ASSERT(MyFindMemBaseByAddr((PCHAR)(base)) == MyFindMemBaseByAddr((PCHAR)(base+(index))))
129 #define MyCheckArray(base, index)
133 #else //MY_USE_INTERNAL_MEMMANAGER
137 #define MyAlignSize__(size) (size)
140 BOOLEAN
inline MyAllocInit(VOID
) {return TRUE
;}
141 #define MyAllocRelease()
143 #ifndef MY_MEM_BOUNDS_CHECK
145 #ifdef TRACK_SYS_ALLOC_CALLERS
146 #define MyAllocatePool__(type,size) DebugAllocatePool(NonPagedPool,MyAlignSize__(size), UDF_BUG_CHECK_ID, __LINE__)
147 #define MyAllocatePoolTag__(type,size,tag) DebugAllocatePool(NonPagedPool,MyAlignSize__(size), UDF_BUG_CHECK_ID, __LINE__)
148 #else //TRACK_SYS_ALLOC_CALLERS
149 #define MyAllocatePool__(type,size) DbgAllocatePoolWithTag(NonPagedPool,MyAlignSize__(size), 'fNWD')
150 #define MyAllocatePoolTag__(type,size,tag) DbgAllocatePoolWithTag(NonPagedPool,MyAlignSize__(size), tag)
151 #endif //TRACK_SYS_ALLOC_CALLERS
152 #define MyFreePool__(addr) DbgFreePool((PCHAR)(addr))
154 #else //MY_MEM_BOUNDS_CHECK
156 #ifdef TRACK_SYS_ALLOC_CALLERS
157 #define MyAllocatePool_(type,size) DebugAllocatePool(NonPagedPool,MyAlignSize__(size), UDF_BUG_CHECK_ID, __LINE__)
158 #define MyAllocatePoolTag_(type,size,tag) DebugAllocatePool(NonPagedPool,MyAlignSize__(size), UDF_BUG_CHECK_ID, __LINE__)
159 #else //TRACK_SYS_ALLOC_CALLERS
160 #define MyAllocatePool_(type,size) DbgAllocatePoolWithTag(NonPagedPool,MyAlignSize__(size), 'mNWD')
161 #define MyAllocatePoolTag_(type,size,tag) DbgAllocatePoolWithTag(NonPagedPool,MyAlignSize__(size), tag)
162 #endif //TRACK_SYS_ALLOC_CALLERS
163 #define MyFreePool_(addr) DbgFreePool((PCHAR)(addr))
165 #define MyAllocatePool__(type,size) MyAllocatePoolTag__(type,size,'mNWD')
168 PVOID inline MyAllocatePool__(ULONG type, ULONG len) {
171 // newaddr = (PCHAR)MyAllocatePool_(type, len+MY_HEAP_ALIGN+1);
172 #ifdef TRACK_SYS_ALLOC_CALLERS
173 newaddr = (PCHAR)DebugAllocatePool(type,len+MY_HEAP_ALIGN+1, 0x202, __LINE__);
174 #else //TRACK_SYS_ALLOC_CALLERS
175 newaddr = (PCHAR)MyAllocatePool_(type,len+MY_HEAP_ALIGN+1);
176 #endif //TRACK_SYS_ALLOC_CALLERS
179 for(i=0; i<MY_HEAP_ALIGN+1; i++) {
180 newaddr[len+i] = (UCHAR)('A'+i);
186 PVOID
inline MyAllocatePoolTag__(ULONG type
, ULONG len
, /*PCHAR*/ULONG tag
) {
189 // newaddr = (PCHAR)MyAllocatePoolTag_(type, len+MY_HEAP_ALIGN+1, tag);
190 #ifdef TRACK_SYS_ALLOC_CALLERS
191 newaddr
= (PCHAR
)DebugAllocatePool(type
,len
+MY_HEAP_ALIGN
+1, 0x202, __LINE__
);
192 #else //TRACK_SYS_ALLOC_CALLERS
193 newaddr
= (PCHAR
)MyAllocatePoolTag_(type
,len
+MY_HEAP_ALIGN
+1, tag
);
194 #endif //TRACK_SYS_ALLOC_CALLERS
197 for(i
=0; i
<MY_HEAP_ALIGN
+1; i
++) {
198 newaddr
[len
+i
] = (UCHAR
)('A'+i
);
203 VOID
inline MyFreePool__(PVOID addr
) {
206 newaddr
= (PCHAR
)addr
;
212 for(i=0; i<MY_HEAP_ALIGN+1; i++) {
213 if(newaddr[len+i] != (UCHAR)('A'+i)) {
219 MyFreePool_(newaddr
);
222 #endif //MY_MEM_BOUNDS_CHECK
224 ULONG
inline MyReallocPool__(PCHAR addr
, ULONG len
, PCHAR
*pnewaddr
, ULONG newlen
) {
226 _newlen
= MyAlignSize__(newlen
);
227 _len
= MyAlignSize__(len
);
230 ASSERT(len
&& newlen
);
232 #ifdef MY_MEM_BOUNDS_CHECK
235 for(i
=0; i
<MY_HEAP_ALIGN
+1; i
++) {
236 if((UCHAR
)(addr
[len
+i
]) != (UCHAR
)('A'+i
)) {
241 #endif //MY_MEM_BOUNDS_CHECK
243 if ((_newlen
!= _len
)
244 #ifdef MY_MEM_BOUNDS_CHECK
246 #endif //MY_MEM_BOUNDS_CHECK
248 #ifdef TRACK_SYS_ALLOC_CALLERS
249 newaddr
= (PCHAR
)DebugAllocatePool(NonPagedPool
,_newlen
, 0x202, __LINE__
);
250 #else //TRACK_SYS_ALLOC_CALLERS
251 newaddr
= (PCHAR
)MyAllocatePool__(NonPagedPool
,_newlen
);
252 #endif //TRACK_SYS_ALLOC_CALLERS
258 #ifdef MY_MEM_BOUNDS_CHECK
259 for(i
=0; i
<MY_HEAP_ALIGN
+1; i
++) {
260 newaddr
[newlen
+i
] = (UCHAR
)('A'+i
);
262 #endif //MY_MEM_BOUNDS_CHECK
264 if(_newlen
<= _len
) {
265 RtlCopyMemory(newaddr
, addr
, newlen
);
267 RtlCopyMemory(newaddr
, addr
, len
);
268 RtlZeroMemory(newaddr
+len
, newlen
- len
);
270 #ifdef MY_MEM_BOUNDS_CHECK
271 for(i
=0; i
<MY_HEAP_ALIGN
+1; i
++) {
272 if((UCHAR
)(newaddr
[newlen
+i
]) != (UCHAR
)('A'+i
)) {
277 #endif //MY_MEM_BOUNDS_CHECK
284 //RtlZeroMemory(newaddr+len, newlen - len);
287 #ifdef MY_MEM_BOUNDS_CHECK
288 for(i=0; i<MY_HEAP_ALIGN+1; i++) {
289 newaddr[newlen+i] = (UCHAR)('A'+i);
291 #endif //MY_MEM_BOUNDS_CHECK
298 #define MyAlignSize__(size) (((size)+MY_HEAP_ALIGN)&(~MY_HEAP_ALIGN))
301 #define MyCheckArray(base, index)
303 #endif // MY_USE_INTERNAL_MEMMANAGER
305 #endif // __MY_MEM_TOOLS_H__