1 ////////////////////////////////////////////////////////////////////
2 // Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
4 ////////////////////////////////////////////////////////////////////
6 #ifdef MY_USE_INTERNAL_MEMMANAGER
10 __inline VOID
DbgTouch(IN PVOID addr
)
18 #else // NO X86 optimization , use generic C/C++
20 __inline VOID
DbgTouch(IN PVOID addr
)
22 UCHAR a
= ((PUCHAR
)addr
)[0];
27 //MEM_ALLOC_DESC Allocs[MY_HEAP_MAX_BLOCKS];
29 MEM_FRAME_ALLOC_DESC FrameList
[MY_HEAP_MAX_FRAMES
];
30 #ifdef MEM_LOCK_BY_SPINLOCK
33 #define LockMemoryManager() KeAcquireSpinLock(&FrameLock, &oldIrql)
34 #define UnlockMemoryManager() KeReleaseSpinLock(&FrameLock, oldIrql)
37 InitLockMemoryManager() {
38 KeInitializeSpinLock(&FrameLock
);
39 return STATUS_SUCCESS
;
41 #define DeinitLockMemoryManager() {NOTHING;}
42 #else //MEM_LOCK_BY_SPINLOCK
44 #define LockMemoryManager() ExAcquireResourceExclusiveLite(&FrameLock, TRUE)
45 #define UnlockMemoryManager() ExReleaseResourceForThreadLite(&FrameLock, ExGetCurrentResourceThread())
46 #define InitLockMemoryManager() ExInitializeResourceLite(&FrameLock)
47 #define DeinitLockMemoryManager() ExDeleteResourceLite(&FrameLock)
48 #endif //MEM_LOCK_BY_SPINLOCK
51 BOOLEAN MyMemInitialized
= FALSE
;
53 #define MyAllocIsFrameFree(FrameList, i) \
54 (!(FrameList[i].LastUsed || FrameList[i].FirstFree))
57 ULONG MemTotalAllocated
;
62 PMEM_ALLOC_DESC Allocs
,
68 Used
= (Allocs
[i
].Len
& MY_HEAP_FLAG_USED
) ? TRUE
: FALSE
;
69 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
));
70 #ifdef MY_HEAP_TRACK_OWNERS
71 KdPrint(("src %x \t line %d \t", Allocs
[i
].Src
, Allocs
[i
].Line
));
73 #ifdef MY_HEAP_TRACK_REF
74 KdPrint(("%s%s", Used
? " " : "-", Allocs
[i
].Tag
? Allocs
[i
].Tag
: ""));
79 //#define CHECK_ALLOC_FRAMES
81 #define DUMP_MEM_FRAMES
83 #ifdef DUMP_MEM_FRAMES
84 ULONG MyDumpMem
= FALSE
;
85 #endif //DUMP_MEM_FRAMES
87 #define DUMP_MEM_FRAMES2
89 //#ifdef CHECK_ALLOC_FRAMES
96 PMEM_ALLOC_DESC Allocs
;
97 Allocs
= FrameList
[Frame
].Frame
;
100 #ifdef DUMP_MEM_FRAMES
102 #endif //DUMP_MEM_FRAMES
105 KdPrint(("Dumping frame %x\n",Frame
));
106 KdPrint(("FirstFree %x LastUsed %x ", FrameList
[Frame
].FirstFree
, FrameList
[Frame
].LastUsed
));
107 KdPrint(("Type %x\n", FrameList
[Frame
].Type
));
109 for(i
=0;i
< (MY_HEAP_MAX_BLOCKS
/*-1*/);i
++) {
110 Used
= (Allocs
[i
].Len
& MY_HEAP_FLAG_USED
) ? TRUE
: FALSE
;
111 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
));
112 #ifdef MY_HEAP_TRACK_OWNERS
113 KdPrint(("src %x \t line %d \t", Allocs
[i
].Src
, Allocs
[i
].Line
));
115 #ifdef MY_HEAP_TRACK_REF
116 KdPrint(("%s%s", Used
? " " : "-", Allocs
[i
].Tag
? Allocs
[i
].Tag
: ""));
119 if(!(Allocs
[i
].Len
) && !(Allocs
[i
].Addr
)) {
122 if(Allocs
[i
].Len
& MY_HEAP_FLAG_USED
)
123 k
+= ((Allocs
[i
].Len
) & MY_HEAP_FLAG_LEN_MASK
);
126 KdPrint((" Wasted %x bytes from %x\n", MY_HEAP_FRAME_SIZE
- k
, MY_HEAP_FRAME_SIZE
));
127 } // end MyAllocDumpFrame()
136 for(i
=0;i
<MY_HEAP_MAX_FRAMES
; i
++) {
137 if(FrameList
[i
].Frame
) {
144 for(i
=0;i
<MY_HEAP_MAX_FRAMES
; i
++) {
145 if(FrameList
[i
].Frame
) {
146 KdPrint(("Addr %x ", FrameList
[i
].Frame
));
147 KdPrint(("Type %x\n" , FrameList
[i
].Type
));
151 } // end MyAllocDumpFrame()
159 PMEM_ALLOC_DESC Allocs
;
160 Allocs
= FrameList
[Frame
].Frame
;
163 for(i
=0;i
< (MY_HEAP_MAX_BLOCKS
-1);i
++) {
164 len
= (Allocs
[i
].Len
& MY_HEAP_FLAG_LEN_MASK
);
165 addr
= Allocs
[i
].Addr
;
166 if( len
!= (Allocs
[i
+1].Addr
- addr
) ) {
167 if(Allocs
[i
+1].Addr
) {
168 KdPrint(("ERROR! Memory block aliasing\n"));
169 KdPrint(("block %x, frame %x\n", i
, Frame
));
170 KdPrint(("block descriptor %x\n", &(Allocs
[i
]) ));
172 MyAllocDumpFrame(Frame
);
175 #ifdef MY_HEAP_CHECK_BOUNDS
176 if(*((PULONG
)(addr
+len
+(j
*sizeof(ULONG
))-MY_HEAP_CHECK_BOUNDS_BSZ
)) != 0xBAADF00D) {
177 MyAllocDumpDescr(Allocs
, i
);
179 #endif //MY_HEAP_CHECK_BOUNDS
181 } // end MyAllocCheck()
183 //#endif //CHECK_ALLOC_FRAMES
186 #define MyAllocDumpFrame(a) {}
187 #define MyAllocCheck(a) {}
188 #define MyAllocDumpFrames() {}
193 #ifndef MY_HEAP_TRACK_OWNERS
196 MyAllocatePoolInFrame(
199 #ifdef MY_HEAP_TRACK_OWNERS
203 #ifdef MY_HEAP_TRACK_REF
205 #endif //MY_HEAP_TRACK_REF
212 PMEM_ALLOC_DESC Allocs
;
213 PMEM_ALLOC_DESC Allocs0
;
214 ULONG LastUsed
, FirstFree
;
217 #ifdef CHECK_ALLOC_FRAMES
221 if(!size
) return NULL
;
222 #ifdef MY_HEAP_CHECK_BOUNDS
223 size
+=MY_HEAP_CHECK_BOUNDS_BSZ
;
226 /* if(size == 0x70) {
230 Allocs0
= FrameList
[Frame
].Frame
;
231 if(!Allocs0
) return NULL
;
232 best_i
= MY_HEAP_MAX_BLOCKS
;
234 LastUsed
= FrameList
[Frame
].LastUsed
;
235 FirstFree
= FrameList
[Frame
].FirstFree
;
237 if(LastUsed
>= (MY_HEAP_MAX_BLOCKS
-1))
240 for(i
=FirstFree
, Allocs
= &(Allocs0
[i
]);i
<=LastUsed
;i
++, Allocs
++) {
241 if( !((l
= Allocs
->Len
) & MY_HEAP_FLAG_USED
) &&
242 ((l
&= MY_HEAP_FLAG_LEN_MASK
) >= size
) ) {
244 // check for first occurence
245 if(l
< min_len
|| !min_len
) {
253 // not enough resources
254 if(best_i
>= MY_HEAP_MAX_BLOCKS
) return NULL
;
256 Allocs
= Allocs0
+best_i
;
258 // create entry for unallocated tail
259 if(Allocs
->Len
!= size
) { // this element is always FREE
261 if(Allocs0
[MY_HEAP_MAX_BLOCKS
-1].Len
) return NULL
;
262 /* for(i=MY_HEAP_MAX_BLOCKS-1;i>best_i;i--) {
263 Allocs[i] = Allocs[i-1];
265 RtlMoveMemory(&(Allocs
[1]), &(Allocs
[0]), (LastUsed
-best_i
+1)*sizeof(MEM_ALLOC_DESC
));
267 Allocs
[1].Addr
= Allocs
->Addr
+ size
;
269 Allocs
[1].Len
-= size
;
271 Allocs
[1].Len
= MY_HEAP_FRAME_SIZE
- (addr
- Allocs0
[0].Addr
) - size
;
273 // Allocs[best_i+1].Used = FALSE; // this had been done by prev. ops.
274 FrameList
[Frame
].LastUsed
++;
276 // update FirstFree pointer
277 if(FirstFree
== best_i
) {
278 for(i
=best_i
+1, Allocs
++; (i
<=LastUsed
) && (Allocs
->Len
& MY_HEAP_FLAG_USED
);i
++, Allocs
++) {
279 // do nothing but scan
281 FrameList
[Frame
].FirstFree
= i
;
282 Allocs
= Allocs0
+best_i
;
284 Allocs
->Len
= size
| MY_HEAP_FLAG_USED
;
285 #ifdef MY_HEAP_TRACK_OWNERS
289 #ifdef MY_HEAP_TRACK_REF
291 #endif //MY_HEAP_TRACK_REF
293 // KdPrint(( "Mem: Allocated %x at addr %x\n", size, (ULONG)addr ));
294 // this will set IntegrityTag to zero
295 *((PULONG
)addr
) = 0x00000000;
296 #ifdef MY_HEAP_CHECK_BOUNDS
297 for(i
=0; i
<MY_HEAP_CHECK_BOUNDS_SZ
; i
++) {
298 *((PULONG
)(addr
+size
+(i
*sizeof(ULONG
))-MY_HEAP_CHECK_BOUNDS_BSZ
)) = 0xBAADF00D;
300 #endif //MY_HEAP_CHECK_BOUNDS
303 MemTotalAllocated
+= size
;
306 } // end MyAllocatePoolInFrame()
318 PMEM_ALLOC_DESC Allocs
;
320 Allocs
= FrameList
[Frame
].Frame
;
321 // i = FrameList[Frame].LastUsed >> 1;
322 // KdPrint(("Mem: Freeing %x\n", (ULONG)addr)); DEADDA7A
323 // for(i=0;i<MY_HEAP_MAX_BLOCKS;i++) {
325 right
= FrameList
[Frame
].LastUsed
;
326 if(!right
&& FrameList
[Frame
].FirstFree
)
328 while(left
!= right
) {
329 i
= (right
+ left
) >> 1;
330 if( (Allocs
[i
].Len
& MY_HEAP_FLAG_USED
) && (Allocs
[i
].Addr
== (ULONG
)addr
) ) {
334 if(right
- left
== 1) {
335 if( (Allocs
[i
+1].Len
& MY_HEAP_FLAG_USED
) && (Allocs
[i
+1].Addr
== (ULONG
)addr
) ) {
341 if(Allocs
[i
].Addr
&& (Allocs
[i
].Addr
< (ULONG
)addr
)) {
348 } // end MyFindMemDescByAddr()
360 PMEM_ALLOC_DESC Allocs
;
362 Allocs
= FrameList
[Frame
].Frame
;
364 i
= MyFindMemDescByAddr(Frame
, addr
);
366 KdPrint(("Mem: <<<*** WARNING ***>>> Double deallocation at %x !!! ;( \n", addr
));
367 MyAllocDumpFrame(Frame
);
371 Allocs
[i
].Len
&= ~MY_HEAP_FLAG_USED
;
372 len
= Allocs
[i
].Len
; // USED bit is already cleared
374 #ifdef MY_HEAP_CHECK_BOUNDS
375 for(j
=0; j
<MY_HEAP_CHECK_BOUNDS_SZ
; j
++) {
376 ASSERT(*((PULONG
)(addr
+len
+(j
*sizeof(ULONG
))-MY_HEAP_CHECK_BOUNDS_BSZ
)) == 0xBAADF00D);
377 if(*((PULONG
)(addr
+len
+(j
*sizeof(ULONG
))-MY_HEAP_CHECK_BOUNDS_BSZ
)) != 0xBAADF00D) {
378 MyAllocDumpDescr(Allocs
, i
);
381 #endif //MY_HEAP_CHECK_BOUNDS
384 // this is a marker of deallocated blocks
385 // some structures have DWORD IntegrityTag as a first member
386 // so, if IntegrityTag is equal to 0xDEADDA7A we shall return
387 // a <<<*** BIG ERROR MESSAGE ***>>> when somebody try to use it
388 *((PULONG
)addr
) = 0xDEADDA7A;
389 MemTotalAllocated
-= len
;
391 if((i
<MY_HEAP_MAX_BLOCKS
-1) && !((len2
= Allocs
[i
+1].Len
) & MY_HEAP_FLAG_USED
)) {
393 if((len2
&= MY_HEAP_FLAG_LEN_MASK
)) {
396 len
= MY_HEAP_FRAME_SIZE
- (Allocs
[i
].Addr
- Allocs
[0].Addr
);
400 if((i
>0) && !((len2
= Allocs
[i
-1].Len
) & MY_HEAP_FLAG_USED
)) {
402 len
+= (len2
& MY_HEAP_FLAG_LEN_MASK
);
409 Allocs
[i
+pc
].Addr
= Allocs
[i
].Addr
;
410 Allocs
[i
+pc
].Len
= len
;
411 /* for(;i<MY_HEAP_MAX_BLOCKS-pc;i++) {
412 Allocs[i] = Allocs[i+pc];
414 RtlMoveMemory(&(Allocs
[i
]), &(Allocs
[i
+pc
]), (MY_HEAP_MAX_BLOCKS
-pc
-i
)*sizeof(MEM_ALLOC_DESC
) );
415 /* for(i=MY_HEAP_MAX_BLOCKS-pc;i<MY_HEAP_MAX_BLOCKS;i++) {
420 RtlZeroMemory(&(Allocs
[MY_HEAP_MAX_BLOCKS
-pc
]), pc
*sizeof(MEM_ALLOC_DESC
));
422 if(FrameList
[Frame
].FirstFree
> (ULONG
)i
)
423 FrameList
[Frame
].FirstFree
= (ULONG
)i
;
424 //ASSERT(FrameList[Frame].LastUsed >= pc);
425 if(FrameList
[Frame
].LastUsed
< pc
) {
426 FrameList
[Frame
].LastUsed
= 0;
428 FrameList
[Frame
].LastUsed
-= pc
;
431 } // end MyFreePoolInFrame()
439 #ifdef MY_HEAP_TRACK_REF
441 #endif //MY_HEAP_TRACK_REF
446 PMEM_ALLOC_DESC Allocs
;
448 if(FrameList
[Frame
].LastUsed
>= (MY_HEAP_MAX_BLOCKS
-1))
450 Allocs
= FrameList
[Frame
].Frame
;
451 i
= MyFindMemDescByAddr(Frame
, addr
);
453 KdPrint(("Mem: <<<*** WARNING ***>>> Double deallocation at %x !!! ;( \n", addr
));
454 MyAllocDumpFrame(Frame
);
458 if(i
>=(MY_HEAP_MAX_BLOCKS
-2))
461 #ifdef MY_HEAP_TRACK_REF
462 *Tag
= Allocs
[i
].Tag
;
463 #endif //MY_HEAP_TRACK_REF
465 len
= (Allocs
[i
].Len
& MY_HEAP_FLAG_LEN_MASK
);
467 #ifdef MY_HEAP_CHECK_BOUNDS
468 new_len
+= MY_HEAP_CHECK_BOUNDS_BSZ
;
469 for(j
=0; j
<MY_HEAP_CHECK_BOUNDS_SZ
; j
++) {
470 ASSERT(*((PULONG
)(addr
+len
+(j
*sizeof(ULONG
))-MY_HEAP_CHECK_BOUNDS_BSZ
)) == 0xBAADF00D);
471 if(*((PULONG
)(addr
+len
+(j
*sizeof(ULONG
))-MY_HEAP_CHECK_BOUNDS_BSZ
)) != 0xBAADF00D) {
472 MyAllocDumpDescr(Allocs
, i
);
475 #endif //MY_HEAP_CHECK_BOUNDS
478 if(Allocs
[i
+1].Len
& MY_HEAP_FLAG_USED
)
480 if(len
+ (Allocs
[i
+1].Len
& MY_HEAP_FLAG_LEN_MASK
) < new_len
)
482 Allocs
[i
].Len
+= (len2
= (new_len
- len
));
483 Allocs
[i
+1].Len
-= len2
;
484 Allocs
[i
+1].Addr
+= len2
;
486 #ifdef MY_HEAP_CHECK_BOUNDS
487 for(j
=0; j
<MY_HEAP_CHECK_BOUNDS_SZ
; j
++) {
488 *((PULONG
)(addr
+new_len
+(j
*sizeof(ULONG
))-MY_HEAP_CHECK_BOUNDS_BSZ
)) = 0xBAADF00D;
490 #endif //MY_HEAP_CHECK_BOUNDS
492 if(!Allocs
[i
+1].Len
) {
494 RtlMoveMemory(&(Allocs
[i
]), &(Allocs
[i
+1]), (MY_HEAP_MAX_BLOCKS
-1-i
)*sizeof(MEM_ALLOC_DESC
) );
495 RtlZeroMemory(&(Allocs
[MY_HEAP_MAX_BLOCKS
-1]), sizeof(MEM_ALLOC_DESC
));
496 if((ULONG
)i
<FrameList
[Frame
].LastUsed
)
497 FrameList
[Frame
].LastUsed
--;
498 if(FrameList
[Frame
].FirstFree
== (ULONG
)i
) {
499 for(;i
<MY_HEAP_MAX_BLOCKS
;i
++) {
500 if(!(Allocs
[i
].Len
& MY_HEAP_FLAG_USED
))
503 FrameList
[Frame
].FirstFree
= i
;
507 MemTotalAllocated
+= len
;
511 len2
= len
- new_len
;
512 if(!len2
) return TRUE
;
514 #ifdef MY_HEAP_CHECK_BOUNDS
515 for(j
=0; j
<MY_HEAP_CHECK_BOUNDS_SZ
; j
++) {
516 *((PULONG
)(addr
+new_len
+(j
*sizeof(ULONG
))-MY_HEAP_CHECK_BOUNDS_BSZ
)) = 0xBAADF00D;
518 #endif //MY_HEAP_CHECK_BOUNDS
520 Allocs
[i
].Len
-= len2
;
521 if(Allocs
[i
+1].Len
& MY_HEAP_FLAG_USED
) {
523 RtlMoveMemory(&(Allocs
[i
+1]), &(Allocs
[i
]), (MY_HEAP_MAX_BLOCKS
-i
-1)*sizeof(MEM_ALLOC_DESC
) );
525 Allocs
[i
].Len
= len2
;
526 Allocs
[i
].Addr
= Allocs
[i
-1].Addr
+ new_len
;
528 if(FrameList
[Frame
].FirstFree
> (ULONG
)i
)
529 FrameList
[Frame
].FirstFree
= i
;
530 FrameList
[Frame
].LastUsed
++;
533 Allocs
[i
+1].Len
+= len2
;
534 Allocs
[i
+1].Addr
-= len2
;
537 MemTotalAllocated
-= len2
;
542 } // end MyResizePoolInFrame()
551 PMEM_ALLOC_DESC Allocs
;
553 Allocs
= (PMEM_ALLOC_DESC
)DbgAllocatePool(NonPagedPool
, sizeof(MEM_ALLOC_DESC
)*(MY_HEAP_MAX_BLOCKS
+1));
555 KdPrint(("Insufficient resources to allocate frame descriptor\n"));
556 FrameList
[Frame
].Frame
= NULL
;
561 RtlZeroMemory(Allocs
, sizeof(MEM_ALLOC_DESC
)*(MY_HEAP_MAX_BLOCKS
+1));
563 Allocs
[0].Addr
= (ULONG
)DbgAllocatePool((POOL_TYPE
)Type
, MY_HEAP_FRAME_SIZE
);
564 if(!Allocs
[0].Addr
) {
565 KdPrint(("Insufficient resources to allocate frame\n"));
567 FrameList
[Frame
].Frame
= NULL
;
572 Allocs
[0].Len
= MY_HEAP_FRAME_SIZE
;
573 // Allocs[0].Used = FALSE;
574 FrameList
[Frame
].Frame
= Allocs
;
575 FrameList
[Frame
].LastUsed
=
576 FrameList
[Frame
].FirstFree
= 0;
577 FrameList
[Frame
].Type
= Type
;
579 if(LastFrame
< Frame
)
581 } // end MyAllocInitFrame()
589 // check if already deinitialized
590 if(!FrameList
[Frame
].Frame
) {
594 DbgFreePool((PVOID
)(FrameList
[Frame
].Frame
)[0].Addr
);
595 DbgFreePool((PVOID
)(FrameList
[Frame
].Frame
));
596 FrameList
[Frame
].Frame
= NULL
;
598 if(LastFrame
== Frame
) {
600 for(i
=LastFrame
; i
>0; i
--) {
601 if(FrameList
[i
].Frame
)
606 } // end MyAllocFreeFrame()
609 #ifndef MY_HEAP_TRACK_OWNERS
615 #ifdef MY_HEAP_TRACK_OWNERS
619 #ifdef MY_HEAP_TRACK_REF
621 #endif //MY_HEAP_TRACK_REF
627 // KdPrint(("MemFrames: %x\n",FrameCount));
629 if(!size
|| (size
> MY_HEAP_FRAME_SIZE
)) return NULL
;
631 #ifdef DUMP_MEM_FRAMES2
637 for(i
=0;i
<MY_HEAP_MAX_FRAMES
; i
++) {
638 if( FrameList
[i
].Frame
&&
639 (FrameList
[i
].Type
== type
) &&
640 (addr
= (ULONG
)MyAllocatePoolInFrame(i
,size
641 #ifdef MY_HEAP_TRACK_OWNERS
644 #ifdef MY_HEAP_TRACK_REF
646 #endif //MY_HEAP_TRACK_REF
650 // if(addr >= (ULONG)BreakAddr && addr < sizeof(UDF_FILE_INFO) + (ULONG)BreakAddr) {
651 // if(addr<=(ULONG)BreakAddr && addr+sizeof(UDF_FILE_INFO) > (ULONG)BreakAddr) {
652 // KdPrint(("ERROR !!! Allocating in examined block\n"));
653 // KdPrint(("addr %x\n", addr));
654 // MyAllocDumpFrame(i);
659 UnlockMemoryManager();
660 DbgTouch((PVOID
)addr
);
664 #ifdef DUMP_MEM_FRAMES2
668 for(i
=0;i
<MY_HEAP_MAX_FRAMES
; i
++) {
669 // MyAllocDumpFrame(i);
670 if(!(FrameList
[i
].Frame
)) {
671 MyAllocInitFrame(type
, i
);
672 if(FrameList
[i
].Frame
&&
673 (addr
= (ULONG
)MyAllocatePoolInFrame(i
,size
674 #ifdef MY_HEAP_TRACK_OWNERS
677 #ifdef MY_HEAP_TRACK_REF
679 #endif //MY_HEAP_TRACK_REF
683 // if(addr >= (ULONG)BreakAddr && addr < sizeof(UDF_FILE_INFO) + (ULONG)BreakAddr) {
684 // if(addr<=(ULONG)BreakAddr && addr+sizeof(UDF_FILE_INFO) > (ULONG)BreakAddr) {
685 // KdPrint(("ERROR !!! Allocating in examined block\n"));
686 // KdPrint(("addr %x\n", addr));
687 // MyAllocDumpFrame(i);
694 #ifdef DUMP_MEM_FRAMES2
700 UnlockMemoryManager();
702 } // end MyAllocatePool()
712 PMEM_ALLOC_DESC Allocs
;
714 for(i
=0;i
<=LastFrame
; i
++) {
715 if( (Allocs
= FrameList
[i
].Frame
) &&
716 (Allocs
[0].Addr
<= (ULONG
)addr
) &&
717 (Allocs
[0].Addr
+ MY_HEAP_FRAME_SIZE
> (ULONG
)addr
) ) {
732 // KdPrint(("MemFrames: %x\n",FrameCount));
735 i
= MyFindFrameByAddr(addr
);
737 UnlockMemoryManager();
738 KdPrint(("Mem: <<<*** WARNING ***>>> Double deallocation at %x !!! ;( \n", addr
));
744 // BreakAddr <= addr < BreakAddr + sizeof(UDF_FILE_INFO)
745 // if((ULONG)addr >= (ULONG)BreakAddr && (ULONG)addr < sizeof(UDF_FILE_INFO) + (ULONG)BreakAddr) {
746 // KdPrint(("Deallocating in examined block\n"));
747 // KdPrint(("addr %x\n", addr));
748 // MyAllocDumpFrame(i);
754 MyFreePoolInFrame(i
,addr
);
755 /* for(j=0;j<MY_HEAP_MAX_BLOCKS; j++) {
756 if((Allocs[j].Len & MY_HEAP_FLAG_USED) || (FrameCount<=1)) {
760 if(MyAllocIsFrameFree(FrameList
, i
)) {
763 UnlockMemoryManager();
765 } // end MyFreePool()
768 #ifndef MY_HEAP_TRACK_OWNERS
776 #ifdef MY_HEAP_TRACK_OWNERS
784 #ifdef MY_HEAP_TRACK_REF
788 // KdPrint(("MemFrames: %x\n",FrameCount));
790 if(OldLength
== NewLength
) return OldLength
;
798 i
= MyFindFrameByAddr(addr
);
800 UnlockMemoryManager();
801 KdPrint(("Mem: <<<*** WARNING ***>>> Double deallocation at %x !!! ;( \n", addr
));
806 if(MyResizePoolInFrame(i
,addr
,NewLength
807 #ifdef MY_HEAP_TRACK_REF
811 #ifdef CHECK_ALLOC_FRAMES
816 DbgTouch((PVOID
)addr
);
817 UnlockMemoryManager();
821 new_buff
= MyAllocatePool(FrameList
[i
].Type
, MyAlignSize__(NewLength
)
822 #ifdef MY_HEAP_TRACK_OWNERS
825 #ifdef MY_HEAP_TRACK_REF
827 #endif //MY_HEAP_TRACK_REF
830 UnlockMemoryManager();
834 if(OldLength
> NewLength
) OldLength
= NewLength
;
835 RtlCopyMemory(new_buff
, addr
, OldLength
);
837 MyFreePoolInFrame(i
,addr
);
839 if(MyAllocIsFrameFree(FrameList
, i
)) {
842 UnlockMemoryManager();
844 DbgTouch((PVOID
)new_buff
);
845 (*NewBuff
) = new_buff
;
848 } // end MyReallocPool()
852 MyFindMemDescByRangeInFrame(
860 PMEM_ALLOC_DESC Allocs
;
864 Allocs
= FrameList
[Frame
].Frame
;
865 // i = FrameList[Frame].LastUsed >> 1;
866 // KdPrint(("Mem: Freeing %x\n", (ULONG)addr)); DEADDA7A
867 // for(i=0;i<MY_HEAP_MAX_BLOCKS;i++) {
869 right
= FrameList
[Frame
].LastUsed
;
870 if(!right
&& FrameList
[Frame
].FirstFree
)
872 while(left
!= right
) {
873 i
= (right
+ left
) >> 1;
874 curaddr
= Allocs
[i
].Addr
;
875 curlen
= Allocs
[i
].Len
;
876 if( (curlen
& MY_HEAP_FLAG_USED
) &&
877 (curaddr
<= (ULONG
)addr
) &&
878 ((curaddr
+(curlen
& MY_HEAP_FLAG_LEN_MASK
)) > (ULONG
)addr
) ) {
882 if(right
- left
== 1) {
883 if( (Allocs
[i
+1].Len
& MY_HEAP_FLAG_USED
) && (Allocs
[i
+1].Addr
== (ULONG
)addr
) ) {
889 if(Allocs
[i
].Addr
&& (Allocs
[i
].Addr
< (ULONG
)addr
)) {
896 } // end MyFindMemDescByRangeInFrame()
903 ULONG Frame
, Base
, i
;
906 Frame
= MyFindFrameByAddr(addr
);
908 UnlockMemoryManager();
909 KdPrint(("Mem: <<<*** WARNING ***>>> Unknown base for %x !!! ;( \n", addr
));
913 i
= MyFindMemDescByRangeInFrame(Frame
, addr
);
914 Base
= FrameList
[Frame
].Frame
[i
].Addr
;
915 UnlockMemoryManager();
917 } // end MyFindMemBaseByAddr()
923 RtlZeroMemory(&FrameList
, sizeof(FrameList
));
924 if(!OS_SUCCESS(InitLockMemoryManager())) {
927 MyAllocInitFrame(NonPagedPool
, 0);
929 return (MyMemInitialized
= TRUE
);
930 } // end MyAllocInit()
936 PMEM_ALLOC_DESC Allocs
;
938 if(!MyMemInitialized
)
941 for(i
=0;i
<MY_HEAP_MAX_FRAMES
; i
++) {
942 if(Allocs
= FrameList
[i
].Frame
) {
946 RtlZeroMemory(&FrameList
, sizeof(FrameList
));
947 UnlockMemoryManager();
948 DeinitLockMemoryManager();
949 MyMemInitialized
= FALSE
;
950 } // end MyAllocRelease()
952 #endif //MY_USE_INTERNAL_MEMMANAGER