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 #ifdef MY_USE_INTERNAL_MEMMANAGER
11 __inline VOID
DbgTouch(IN PVOID addr
)
19 #else // NO X86 optimization , use generic C/C++
21 __inline VOID
DbgTouch(IN PVOID addr
)
23 UCHAR a
= ((PUCHAR
)addr
)[0];
28 //MEM_ALLOC_DESC Allocs[MY_HEAP_MAX_BLOCKS];
30 MEM_FRAME_ALLOC_DESC FrameList
[MY_HEAP_MAX_FRAMES
];
31 #ifdef MEM_LOCK_BY_SPINLOCK
34 #define LockMemoryManager() KeAcquireSpinLock(&FrameLock, &oldIrql)
35 #define UnlockMemoryManager() KeReleaseSpinLock(&FrameLock, oldIrql)
38 InitLockMemoryManager() {
39 KeInitializeSpinLock(&FrameLock
);
40 return STATUS_SUCCESS
;
42 #define DeinitLockMemoryManager() {NOTHING;}
43 #else //MEM_LOCK_BY_SPINLOCK
45 #define LockMemoryManager() ExAcquireResourceExclusiveLite(&FrameLock, TRUE)
46 #define UnlockMemoryManager() ExReleaseResourceForThreadLite(&FrameLock, ExGetCurrentResourceThread())
47 #define InitLockMemoryManager() ExInitializeResourceLite(&FrameLock)
48 #define DeinitLockMemoryManager() ExDeleteResourceLite(&FrameLock)
49 #endif //MEM_LOCK_BY_SPINLOCK
52 BOOLEAN MyMemInitialized
= FALSE
;
54 #define MyAllocIsFrameFree(FrameList, i) \
55 (!(FrameList[i].LastUsed || FrameList[i].FirstFree))
58 ULONG MemTotalAllocated
;
63 PMEM_ALLOC_DESC Allocs
,
69 Used
= (Allocs
[i
].Len
& MY_HEAP_FLAG_USED
) ? TRUE
: FALSE
;
70 KdPrint(("block %x \t%s addr %x len %x \t", i
, Used
? "used" : "free", Allocs
[i
].Addr
, (Allocs
[i
].Len
) & MY_HEAP_FLAG_LEN_MASK
));
71 #ifdef MY_HEAP_TRACK_OWNERS
72 KdPrint(("src %x \t line %d \t", Allocs
[i
].Src
, Allocs
[i
].Line
));
74 #ifdef MY_HEAP_TRACK_REF
75 KdPrint(("%s%s", Used
? " " : "-", Allocs
[i
].Tag
? Allocs
[i
].Tag
: ""));
80 //#define CHECK_ALLOC_FRAMES
82 #define DUMP_MEM_FRAMES
84 #ifdef DUMP_MEM_FRAMES
85 ULONG MyDumpMem
= FALSE
;
86 #endif //DUMP_MEM_FRAMES
88 #define DUMP_MEM_FRAMES2
90 //#ifdef CHECK_ALLOC_FRAMES
97 PMEM_ALLOC_DESC Allocs
;
98 Allocs
= FrameList
[Frame
].Frame
;
101 #ifdef DUMP_MEM_FRAMES
103 #endif //DUMP_MEM_FRAMES
106 KdPrint(("Dumping frame %x\n",Frame
));
107 KdPrint(("FirstFree %x LastUsed %x ", FrameList
[Frame
].FirstFree
, FrameList
[Frame
].LastUsed
));
108 KdPrint(("Type %x\n", FrameList
[Frame
].Type
));
110 for(i
=0;i
< (MY_HEAP_MAX_BLOCKS
/*-1*/);i
++) {
111 Used
= (Allocs
[i
].Len
& MY_HEAP_FLAG_USED
) ? TRUE
: FALSE
;
112 KdPrint(("block %x \t%s addr %x len %x \t", i
, Used
? "used" : "free", Allocs
[i
].Addr
, (Allocs
[i
].Len
) & MY_HEAP_FLAG_LEN_MASK
));
113 #ifdef MY_HEAP_TRACK_OWNERS
114 KdPrint(("src %x \t line %d \t", Allocs
[i
].Src
, Allocs
[i
].Line
));
116 #ifdef MY_HEAP_TRACK_REF
117 KdPrint(("%s%s", Used
? " " : "-", Allocs
[i
].Tag
? Allocs
[i
].Tag
: ""));
120 if(!(Allocs
[i
].Len
) && !(Allocs
[i
].Addr
)) {
123 if(Allocs
[i
].Len
& MY_HEAP_FLAG_USED
)
124 k
+= ((Allocs
[i
].Len
) & MY_HEAP_FLAG_LEN_MASK
);
127 KdPrint((" Wasted %x bytes from %x\n", MY_HEAP_FRAME_SIZE
- k
, MY_HEAP_FRAME_SIZE
));
128 } // end MyAllocDumpFrame()
137 for(i
=0;i
<MY_HEAP_MAX_FRAMES
; i
++) {
138 if(FrameList
[i
].Frame
) {
145 for(i
=0;i
<MY_HEAP_MAX_FRAMES
; i
++) {
146 if(FrameList
[i
].Frame
) {
147 KdPrint(("Addr %x ", FrameList
[i
].Frame
));
148 KdPrint(("Type %x\n" , FrameList
[i
].Type
));
152 } // end MyAllocDumpFrame()
160 PMEM_ALLOC_DESC Allocs
;
161 Allocs
= FrameList
[Frame
].Frame
;
164 for(i
=0;i
< (MY_HEAP_MAX_BLOCKS
-1);i
++) {
165 len
= (Allocs
[i
].Len
& MY_HEAP_FLAG_LEN_MASK
);
166 addr
= Allocs
[i
].Addr
;
167 if( len
!= (Allocs
[i
+1].Addr
- addr
) ) {
168 if(Allocs
[i
+1].Addr
) {
169 KdPrint(("ERROR! Memory block aliasing\n"));
170 KdPrint(("block %x, frame %x\n", i
, Frame
));
171 KdPrint(("block descriptor %x\n", &(Allocs
[i
]) ));
173 MyAllocDumpFrame(Frame
);
176 #ifdef MY_HEAP_CHECK_BOUNDS
177 if(*((PULONG
)(addr
+len
+(j
*sizeof(ULONG
))-MY_HEAP_CHECK_BOUNDS_BSZ
)) != 0xBAADF00D) {
178 MyAllocDumpDescr(Allocs
, i
);
180 #endif //MY_HEAP_CHECK_BOUNDS
182 } // end MyAllocCheck()
184 //#endif //CHECK_ALLOC_FRAMES
187 #define MyAllocDumpFrame(a) {}
188 #define MyAllocCheck(a) {}
189 #define MyAllocDumpFrames() {}
194 #ifndef MY_HEAP_TRACK_OWNERS
197 MyAllocatePoolInFrame(
200 #ifdef MY_HEAP_TRACK_OWNERS
204 #ifdef MY_HEAP_TRACK_REF
206 #endif //MY_HEAP_TRACK_REF
213 PMEM_ALLOC_DESC Allocs
;
214 PMEM_ALLOC_DESC Allocs0
;
215 ULONG LastUsed
, FirstFree
;
218 #ifdef CHECK_ALLOC_FRAMES
222 if(!size
) return NULL
;
223 #ifdef MY_HEAP_CHECK_BOUNDS
224 size
+=MY_HEAP_CHECK_BOUNDS_BSZ
;
227 /* if(size == 0x70) {
231 Allocs0
= FrameList
[Frame
].Frame
;
232 if(!Allocs0
) return NULL
;
233 best_i
= MY_HEAP_MAX_BLOCKS
;
235 LastUsed
= FrameList
[Frame
].LastUsed
;
236 FirstFree
= FrameList
[Frame
].FirstFree
;
238 if(LastUsed
>= (MY_HEAP_MAX_BLOCKS
-1))
241 for(i
=FirstFree
, Allocs
= &(Allocs0
[i
]);i
<=LastUsed
;i
++, Allocs
++) {
242 if( !((l
= Allocs
->Len
) & MY_HEAP_FLAG_USED
) &&
243 ((l
&= MY_HEAP_FLAG_LEN_MASK
) >= size
) ) {
245 // check for first occurence
246 if(l
< min_len
|| !min_len
) {
254 // not enough resources
255 if(best_i
>= MY_HEAP_MAX_BLOCKS
) return NULL
;
257 Allocs
= Allocs0
+best_i
;
259 // create entry for unallocated tail
260 if(Allocs
->Len
!= size
) { // this element is always FREE
262 if(Allocs0
[MY_HEAP_MAX_BLOCKS
-1].Len
) return NULL
;
263 /* for(i=MY_HEAP_MAX_BLOCKS-1;i>best_i;i--) {
264 Allocs[i] = Allocs[i-1];
266 RtlMoveMemory(&(Allocs
[1]), &(Allocs
[0]), (LastUsed
-best_i
+1)*sizeof(MEM_ALLOC_DESC
));
268 Allocs
[1].Addr
= Allocs
->Addr
+ size
;
270 Allocs
[1].Len
-= size
;
272 Allocs
[1].Len
= MY_HEAP_FRAME_SIZE
- (addr
- Allocs0
[0].Addr
) - size
;
274 // Allocs[best_i+1].Used = FALSE; // this had been done by prev. ops.
275 FrameList
[Frame
].LastUsed
++;
277 // update FirstFree pointer
278 if(FirstFree
== best_i
) {
279 for(i
=best_i
+1, Allocs
++; (i
<=LastUsed
) && (Allocs
->Len
& MY_HEAP_FLAG_USED
);i
++, Allocs
++) {
280 // do nothing but scan
282 FrameList
[Frame
].FirstFree
= i
;
283 Allocs
= Allocs0
+best_i
;
285 Allocs
->Len
= size
| MY_HEAP_FLAG_USED
;
286 #ifdef MY_HEAP_TRACK_OWNERS
290 #ifdef MY_HEAP_TRACK_REF
292 #endif //MY_HEAP_TRACK_REF
294 // KdPrint(( "Mem: Allocated %x at addr %x\n", size, (ULONG)addr ));
295 // this will set IntegrityTag to zero
296 *((PULONG
)addr
) = 0x00000000;
297 #ifdef MY_HEAP_CHECK_BOUNDS
298 for(i
=0; i
<MY_HEAP_CHECK_BOUNDS_SZ
; i
++) {
299 *((PULONG
)(addr
+size
+(i
*sizeof(ULONG
))-MY_HEAP_CHECK_BOUNDS_BSZ
)) = 0xBAADF00D;
301 #endif //MY_HEAP_CHECK_BOUNDS
304 MemTotalAllocated
+= size
;
307 } // end MyAllocatePoolInFrame()
319 PMEM_ALLOC_DESC Allocs
;
321 Allocs
= FrameList
[Frame
].Frame
;
322 // i = FrameList[Frame].LastUsed >> 1;
323 // KdPrint(("Mem: Freeing %x\n", (ULONG)addr)); DEADDA7A
324 // for(i=0;i<MY_HEAP_MAX_BLOCKS;i++) {
326 right
= FrameList
[Frame
].LastUsed
;
327 if(!right
&& FrameList
[Frame
].FirstFree
)
329 while(left
!= right
) {
330 i
= (right
+ left
) >> 1;
331 if( (Allocs
[i
].Len
& MY_HEAP_FLAG_USED
) && (Allocs
[i
].Addr
== (ULONG
)addr
) ) {
335 if(right
- left
== 1) {
336 if( (Allocs
[i
+1].Len
& MY_HEAP_FLAG_USED
) && (Allocs
[i
+1].Addr
== (ULONG
)addr
) ) {
342 if(Allocs
[i
].Addr
&& (Allocs
[i
].Addr
< (ULONG
)addr
)) {
349 } // end MyFindMemDescByAddr()
361 PMEM_ALLOC_DESC Allocs
;
363 Allocs
= FrameList
[Frame
].Frame
;
365 i
= MyFindMemDescByAddr(Frame
, addr
);
367 KdPrint(("Mem: <<<*** WARNING ***>>> Double deallocation at %x !!! ;( \n", addr
));
368 MyAllocDumpFrame(Frame
);
372 Allocs
[i
].Len
&= ~MY_HEAP_FLAG_USED
;
373 len
= Allocs
[i
].Len
; // USED bit is already cleared
375 #ifdef MY_HEAP_CHECK_BOUNDS
376 for(j
=0; j
<MY_HEAP_CHECK_BOUNDS_SZ
; j
++) {
377 ASSERT(*((PULONG
)(addr
+len
+(j
*sizeof(ULONG
))-MY_HEAP_CHECK_BOUNDS_BSZ
)) == 0xBAADF00D);
378 if(*((PULONG
)(addr
+len
+(j
*sizeof(ULONG
))-MY_HEAP_CHECK_BOUNDS_BSZ
)) != 0xBAADF00D) {
379 MyAllocDumpDescr(Allocs
, i
);
382 #endif //MY_HEAP_CHECK_BOUNDS
385 // this is a marker of deallocated blocks
386 // some structures have DWORD IntegrityTag as a first member
387 // so, if IntegrityTag is equal to 0xDEADDA7A we shall return
388 // a <<<*** BIG ERROR MESSAGE ***>>> when somebody try to use it
389 *((PULONG
)addr
) = 0xDEADDA7A;
390 MemTotalAllocated
-= len
;
392 if((i
<MY_HEAP_MAX_BLOCKS
-1) && !((len2
= Allocs
[i
+1].Len
) & MY_HEAP_FLAG_USED
)) {
394 if((len2
&= MY_HEAP_FLAG_LEN_MASK
)) {
397 len
= MY_HEAP_FRAME_SIZE
- (Allocs
[i
].Addr
- Allocs
[0].Addr
);
401 if((i
>0) && !((len2
= Allocs
[i
-1].Len
) & MY_HEAP_FLAG_USED
)) {
403 len
+= (len2
& MY_HEAP_FLAG_LEN_MASK
);
410 Allocs
[i
+pc
].Addr
= Allocs
[i
].Addr
;
411 Allocs
[i
+pc
].Len
= len
;
412 /* for(;i<MY_HEAP_MAX_BLOCKS-pc;i++) {
413 Allocs[i] = Allocs[i+pc];
415 RtlMoveMemory(&(Allocs
[i
]), &(Allocs
[i
+pc
]), (MY_HEAP_MAX_BLOCKS
-pc
-i
)*sizeof(MEM_ALLOC_DESC
) );
416 /* for(i=MY_HEAP_MAX_BLOCKS-pc;i<MY_HEAP_MAX_BLOCKS;i++) {
421 RtlZeroMemory(&(Allocs
[MY_HEAP_MAX_BLOCKS
-pc
]), pc
*sizeof(MEM_ALLOC_DESC
));
423 if(FrameList
[Frame
].FirstFree
> (ULONG
)i
)
424 FrameList
[Frame
].FirstFree
= (ULONG
)i
;
425 //ASSERT(FrameList[Frame].LastUsed >= pc);
426 if(FrameList
[Frame
].LastUsed
< pc
) {
427 FrameList
[Frame
].LastUsed
= 0;
429 FrameList
[Frame
].LastUsed
-= pc
;
432 } // end MyFreePoolInFrame()
440 #ifdef MY_HEAP_TRACK_REF
442 #endif //MY_HEAP_TRACK_REF
447 PMEM_ALLOC_DESC Allocs
;
449 if(FrameList
[Frame
].LastUsed
>= (MY_HEAP_MAX_BLOCKS
-1))
451 Allocs
= FrameList
[Frame
].Frame
;
452 i
= MyFindMemDescByAddr(Frame
, addr
);
454 KdPrint(("Mem: <<<*** WARNING ***>>> Double deallocation at %x !!! ;( \n", addr
));
455 MyAllocDumpFrame(Frame
);
459 if(i
>=(MY_HEAP_MAX_BLOCKS
-2))
462 #ifdef MY_HEAP_TRACK_REF
463 *Tag
= Allocs
[i
].Tag
;
464 #endif //MY_HEAP_TRACK_REF
466 len
= (Allocs
[i
].Len
& MY_HEAP_FLAG_LEN_MASK
);
468 #ifdef MY_HEAP_CHECK_BOUNDS
469 new_len
+= MY_HEAP_CHECK_BOUNDS_BSZ
;
470 for(j
=0; j
<MY_HEAP_CHECK_BOUNDS_SZ
; j
++) {
471 ASSERT(*((PULONG
)(addr
+len
+(j
*sizeof(ULONG
))-MY_HEAP_CHECK_BOUNDS_BSZ
)) == 0xBAADF00D);
472 if(*((PULONG
)(addr
+len
+(j
*sizeof(ULONG
))-MY_HEAP_CHECK_BOUNDS_BSZ
)) != 0xBAADF00D) {
473 MyAllocDumpDescr(Allocs
, i
);
476 #endif //MY_HEAP_CHECK_BOUNDS
479 if(Allocs
[i
+1].Len
& MY_HEAP_FLAG_USED
)
481 if(len
+ (Allocs
[i
+1].Len
& MY_HEAP_FLAG_LEN_MASK
) < new_len
)
483 Allocs
[i
].Len
+= (len2
= (new_len
- len
));
484 Allocs
[i
+1].Len
-= len2
;
485 Allocs
[i
+1].Addr
+= len2
;
487 #ifdef MY_HEAP_CHECK_BOUNDS
488 for(j
=0; j
<MY_HEAP_CHECK_BOUNDS_SZ
; j
++) {
489 *((PULONG
)(addr
+new_len
+(j
*sizeof(ULONG
))-MY_HEAP_CHECK_BOUNDS_BSZ
)) = 0xBAADF00D;
491 #endif //MY_HEAP_CHECK_BOUNDS
493 if(!Allocs
[i
+1].Len
) {
495 RtlMoveMemory(&(Allocs
[i
]), &(Allocs
[i
+1]), (MY_HEAP_MAX_BLOCKS
-1-i
)*sizeof(MEM_ALLOC_DESC
) );
496 RtlZeroMemory(&(Allocs
[MY_HEAP_MAX_BLOCKS
-1]), sizeof(MEM_ALLOC_DESC
));
497 if((ULONG
)i
<FrameList
[Frame
].LastUsed
)
498 FrameList
[Frame
].LastUsed
--;
499 if(FrameList
[Frame
].FirstFree
== (ULONG
)i
) {
500 for(;i
<MY_HEAP_MAX_BLOCKS
;i
++) {
501 if(!(Allocs
[i
].Len
& MY_HEAP_FLAG_USED
))
504 FrameList
[Frame
].FirstFree
= i
;
508 MemTotalAllocated
+= len
;
512 len2
= len
- new_len
;
513 if(!len2
) return TRUE
;
515 #ifdef MY_HEAP_CHECK_BOUNDS
516 for(j
=0; j
<MY_HEAP_CHECK_BOUNDS_SZ
; j
++) {
517 *((PULONG
)(addr
+new_len
+(j
*sizeof(ULONG
))-MY_HEAP_CHECK_BOUNDS_BSZ
)) = 0xBAADF00D;
519 #endif //MY_HEAP_CHECK_BOUNDS
521 Allocs
[i
].Len
-= len2
;
522 if(Allocs
[i
+1].Len
& MY_HEAP_FLAG_USED
) {
524 RtlMoveMemory(&(Allocs
[i
+1]), &(Allocs
[i
]), (MY_HEAP_MAX_BLOCKS
-i
-1)*sizeof(MEM_ALLOC_DESC
) );
526 Allocs
[i
].Len
= len2
;
527 Allocs
[i
].Addr
= Allocs
[i
-1].Addr
+ new_len
;
529 if(FrameList
[Frame
].FirstFree
> (ULONG
)i
)
530 FrameList
[Frame
].FirstFree
= i
;
531 FrameList
[Frame
].LastUsed
++;
534 Allocs
[i
+1].Len
+= len2
;
535 Allocs
[i
+1].Addr
-= len2
;
538 MemTotalAllocated
-= len2
;
543 } // end MyResizePoolInFrame()
552 PMEM_ALLOC_DESC Allocs
;
554 Allocs
= (PMEM_ALLOC_DESC
)DbgAllocatePool(NonPagedPool
, sizeof(MEM_ALLOC_DESC
)*(MY_HEAP_MAX_BLOCKS
+1));
556 KdPrint(("Insufficient resources to allocate frame descriptor\n"));
557 FrameList
[Frame
].Frame
= NULL
;
562 RtlZeroMemory(Allocs
, sizeof(MEM_ALLOC_DESC
)*(MY_HEAP_MAX_BLOCKS
+1));
564 Allocs
[0].Addr
= (ULONG
)DbgAllocatePool((POOL_TYPE
)Type
, MY_HEAP_FRAME_SIZE
);
565 if(!Allocs
[0].Addr
) {
566 KdPrint(("Insufficient resources to allocate frame\n"));
568 FrameList
[Frame
].Frame
= NULL
;
573 Allocs
[0].Len
= MY_HEAP_FRAME_SIZE
;
574 // Allocs[0].Used = FALSE;
575 FrameList
[Frame
].Frame
= Allocs
;
576 FrameList
[Frame
].LastUsed
=
577 FrameList
[Frame
].FirstFree
= 0;
578 FrameList
[Frame
].Type
= Type
;
580 if(LastFrame
< Frame
)
582 } // end MyAllocInitFrame()
590 // check if already deinitialized
591 if(!FrameList
[Frame
].Frame
) {
595 DbgFreePool((PVOID
)(FrameList
[Frame
].Frame
)[0].Addr
);
596 DbgFreePool((PVOID
)(FrameList
[Frame
].Frame
));
597 FrameList
[Frame
].Frame
= NULL
;
599 if(LastFrame
== Frame
) {
601 for(i
=LastFrame
; i
>0; i
--) {
602 if(FrameList
[i
].Frame
)
607 } // end MyAllocFreeFrame()
610 #ifndef MY_HEAP_TRACK_OWNERS
616 #ifdef MY_HEAP_TRACK_OWNERS
620 #ifdef MY_HEAP_TRACK_REF
622 #endif //MY_HEAP_TRACK_REF
628 // KdPrint(("MemFrames: %x\n",FrameCount));
630 if(!size
|| (size
> MY_HEAP_FRAME_SIZE
)) return NULL
;
632 #ifdef DUMP_MEM_FRAMES2
638 for(i
=0;i
<MY_HEAP_MAX_FRAMES
; i
++) {
639 if( FrameList
[i
].Frame
&&
640 (FrameList
[i
].Type
== type
) &&
641 (addr
= (ULONG
)MyAllocatePoolInFrame(i
,size
642 #ifdef MY_HEAP_TRACK_OWNERS
645 #ifdef MY_HEAP_TRACK_REF
647 #endif //MY_HEAP_TRACK_REF
651 // if(addr >= (ULONG)BreakAddr && addr < sizeof(UDF_FILE_INFO) + (ULONG)BreakAddr) {
652 // if(addr<=(ULONG)BreakAddr && addr+sizeof(UDF_FILE_INFO) > (ULONG)BreakAddr) {
653 // KdPrint(("ERROR !!! Allocating in examined block\n"));
654 // KdPrint(("addr %x\n", addr));
655 // MyAllocDumpFrame(i);
660 UnlockMemoryManager();
661 DbgTouch((PVOID
)addr
);
665 #ifdef DUMP_MEM_FRAMES2
669 for(i
=0;i
<MY_HEAP_MAX_FRAMES
; i
++) {
670 // MyAllocDumpFrame(i);
671 if(!(FrameList
[i
].Frame
)) {
672 MyAllocInitFrame(type
, i
);
673 if(FrameList
[i
].Frame
&&
674 (addr
= (ULONG
)MyAllocatePoolInFrame(i
,size
675 #ifdef MY_HEAP_TRACK_OWNERS
678 #ifdef MY_HEAP_TRACK_REF
680 #endif //MY_HEAP_TRACK_REF
684 // if(addr >= (ULONG)BreakAddr && addr < sizeof(UDF_FILE_INFO) + (ULONG)BreakAddr) {
685 // if(addr<=(ULONG)BreakAddr && addr+sizeof(UDF_FILE_INFO) > (ULONG)BreakAddr) {
686 // KdPrint(("ERROR !!! Allocating in examined block\n"));
687 // KdPrint(("addr %x\n", addr));
688 // MyAllocDumpFrame(i);
695 #ifdef DUMP_MEM_FRAMES2
701 UnlockMemoryManager();
703 } // end MyAllocatePool()
713 PMEM_ALLOC_DESC Allocs
;
715 for(i
=0;i
<=LastFrame
; i
++) {
716 if( (Allocs
= FrameList
[i
].Frame
) &&
717 (Allocs
[0].Addr
<= (ULONG
)addr
) &&
718 (Allocs
[0].Addr
+ MY_HEAP_FRAME_SIZE
> (ULONG
)addr
) ) {
733 // KdPrint(("MemFrames: %x\n",FrameCount));
736 i
= MyFindFrameByAddr(addr
);
738 UnlockMemoryManager();
739 KdPrint(("Mem: <<<*** WARNING ***>>> Double deallocation at %x !!! ;( \n", addr
));
745 // BreakAddr <= addr < BreakAddr + sizeof(UDF_FILE_INFO)
746 // if((ULONG)addr >= (ULONG)BreakAddr && (ULONG)addr < sizeof(UDF_FILE_INFO) + (ULONG)BreakAddr) {
747 // KdPrint(("Deallocating in examined block\n"));
748 // KdPrint(("addr %x\n", addr));
749 // MyAllocDumpFrame(i);
755 MyFreePoolInFrame(i
,addr
);
756 /* for(j=0;j<MY_HEAP_MAX_BLOCKS; j++) {
757 if((Allocs[j].Len & MY_HEAP_FLAG_USED) || (FrameCount<=1)) {
761 if(MyAllocIsFrameFree(FrameList
, i
)) {
764 UnlockMemoryManager();
766 } // end MyFreePool()
769 #ifndef MY_HEAP_TRACK_OWNERS
777 #ifdef MY_HEAP_TRACK_OWNERS
785 #ifdef MY_HEAP_TRACK_REF
789 // KdPrint(("MemFrames: %x\n",FrameCount));
791 if(OldLength
== NewLength
) return OldLength
;
799 i
= MyFindFrameByAddr(addr
);
801 UnlockMemoryManager();
802 KdPrint(("Mem: <<<*** WARNING ***>>> Double deallocation at %x !!! ;( \n", addr
));
807 if(MyResizePoolInFrame(i
,addr
,NewLength
808 #ifdef MY_HEAP_TRACK_REF
812 #ifdef CHECK_ALLOC_FRAMES
817 DbgTouch((PVOID
)addr
);
818 UnlockMemoryManager();
822 new_buff
= MyAllocatePool(FrameList
[i
].Type
, MyAlignSize__(NewLength
)
823 #ifdef MY_HEAP_TRACK_OWNERS
826 #ifdef MY_HEAP_TRACK_REF
828 #endif //MY_HEAP_TRACK_REF
831 UnlockMemoryManager();
835 if(OldLength
> NewLength
) OldLength
= NewLength
;
836 RtlCopyMemory(new_buff
, addr
, OldLength
);
838 MyFreePoolInFrame(i
,addr
);
840 if(MyAllocIsFrameFree(FrameList
, i
)) {
843 UnlockMemoryManager();
845 DbgTouch((PVOID
)new_buff
);
846 (*NewBuff
) = new_buff
;
849 } // end MyReallocPool()
853 MyFindMemDescByRangeInFrame(
861 PMEM_ALLOC_DESC Allocs
;
865 Allocs
= FrameList
[Frame
].Frame
;
866 // i = FrameList[Frame].LastUsed >> 1;
867 // KdPrint(("Mem: Freeing %x\n", (ULONG)addr)); DEADDA7A
868 // for(i=0;i<MY_HEAP_MAX_BLOCKS;i++) {
870 right
= FrameList
[Frame
].LastUsed
;
871 if(!right
&& FrameList
[Frame
].FirstFree
)
873 while(left
!= right
) {
874 i
= (right
+ left
) >> 1;
875 curaddr
= Allocs
[i
].Addr
;
876 curlen
= Allocs
[i
].Len
;
877 if( (curlen
& MY_HEAP_FLAG_USED
) &&
878 (curaddr
<= (ULONG
)addr
) &&
879 ((curaddr
+(curlen
& MY_HEAP_FLAG_LEN_MASK
)) > (ULONG
)addr
) ) {
883 if(right
- left
== 1) {
884 if( (Allocs
[i
+1].Len
& MY_HEAP_FLAG_USED
) && (Allocs
[i
+1].Addr
== (ULONG
)addr
) ) {
890 if(Allocs
[i
].Addr
&& (Allocs
[i
].Addr
< (ULONG
)addr
)) {
897 } // end MyFindMemDescByRangeInFrame()
904 ULONG Frame
, Base
, i
;
907 Frame
= MyFindFrameByAddr(addr
);
909 UnlockMemoryManager();
910 KdPrint(("Mem: <<<*** WARNING ***>>> Unknown base for %x !!! ;( \n", addr
));
914 i
= MyFindMemDescByRangeInFrame(Frame
, addr
);
915 Base
= FrameList
[Frame
].Frame
[i
].Addr
;
916 UnlockMemoryManager();
918 } // end MyFindMemBaseByAddr()
924 RtlZeroMemory(&FrameList
, sizeof(FrameList
));
925 if(!OS_SUCCESS(InitLockMemoryManager())) {
928 MyAllocInitFrame(NonPagedPool
, 0);
930 return (MyMemInitialized
= TRUE
);
931 } // end MyAllocInit()
937 PMEM_ALLOC_DESC Allocs
;
939 if(!MyMemInitialized
)
942 for(i
=0;i
<MY_HEAP_MAX_FRAMES
; i
++) {
943 if(Allocs
= FrameList
[i
].Frame
) {
947 RtlZeroMemory(&FrameList
, sizeof(FrameList
));
948 UnlockMemoryManager();
949 DeinitLockMemoryManager();
950 MyMemInitialized
= FALSE
;
951 } // end MyAllocRelease()
953 #endif //MY_USE_INTERNAL_MEMMANAGER