-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy pathemuheap.h
151 lines (119 loc) · 4.76 KB
/
emuheap.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/*
Source for x86 emulator IdaPro plugin
File: emuheap.h
Copyright (c) 2004-2022, Chris Eagle
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2 of the License, or (at your option)
any later version.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef __EMUHEAP_H
#define __EMUHEAP_H
#include "buffer.h"
#define HEAP_ERROR 0xFFFFFFFF
#define HEAP_MAGIC 0xDEADBEEF
class MallocNode {
friend class HeapBase;
friend class EmuHeap;
public:
MallocNode(unsigned int size, unsigned int base);
MallocNode(Buffer &b);
void save(Buffer &b);
const MallocNode *nextNode() const {return next;};
int getBase() const {return base;};
int getSize() const {return size;};
private:
unsigned int base;
unsigned int size;
MallocNode *next;
};
struct LargeBlock {
unsigned int base;
unsigned int size;
};
class HeapBase {
public:
// HeapBase();
// HeapBase(unsigned int baseAddr, unsigned int currSize, unsigned int maxSize, HeapBase *next = 0);
// HeapBase(char *seg, unsigned int sz);
virtual ~HeapBase();
virtual unsigned int malloc(unsigned int size) = 0;
virtual unsigned int calloc(unsigned int nmemb, unsigned int size) = 0;
virtual unsigned int free(unsigned int addr) = 0;
virtual unsigned int realloc(unsigned int ptr, unsigned int size) = 0;
virtual unsigned int getHeapBase() {return base;};
virtual unsigned int getHeapSize() {return max - base;};
HeapBase *getNextHeap() {return nextHeap;};
virtual unsigned int sizeOf(unsigned int addr) = 0;
//careful to avoid memory leaks when calling this!
void setNextHeap(HeapBase *heap) {nextHeap = heap;};
const MallocNode *heapHead() {return head;};
virtual void save(Buffer &b) = 0;
static void saveHeapLayout(Buffer &b);
// virtual void loadHeapLayout(Buffer &b) = 0;
static unsigned int addHeap(unsigned int sz, unsigned int base = 0); //returns hHeap
virtual unsigned int destroyHeap(unsigned int hHeap) = 0;
virtual unsigned int getPrimaryHeap() = 0;
static HeapBase *getHeap() {return primaryHeap;};
virtual HeapBase *findHeap(unsigned int hHeap) = 0;
// static void initHeap(char *name, unsigned int maxSize = 0x100000);
protected:
virtual bool checkHeapSize(unsigned int newsize) = 0;
virtual MallocNode *findMallocNode(unsigned int addr) = 0;
virtual unsigned int findBlock(unsigned int size) = 0;
virtual void insert(MallocNode *node) = 0;
virtual void readHeap(Buffer &b, unsigned int num_blocks) = 0;
virtual void writeHeap(Buffer &b) = 0;
segment_t *h;
unsigned int base;
unsigned int max;
unsigned int size;
MallocNode *head;
LargeBlock *large;
unsigned int numLarge;
HeapBase *nextHeap;
static HeapBase *primaryHeap;
};
void createLegacyHeap(Buffer &b);
class EmuHeap : public HeapBase {
public:
EmuHeap(unsigned int baseAddr, unsigned int currSize, unsigned int maxSize, EmuHeap *next = 0);
EmuHeap(const char *seg, unsigned int sz);
EmuHeap(Buffer &b);
~EmuHeap();
unsigned int malloc(unsigned int size);
unsigned int calloc(unsigned int nmemb, unsigned int size);
unsigned int free(unsigned int addr);
unsigned int realloc(unsigned int ptr, unsigned int size);
unsigned int getHeapBase() {return base;};
unsigned int getHeapSize() {return max - base;};
HeapBase *getNextHeap() {return nextHeap;};
unsigned int sizeOf(unsigned int addr);
//careful to avoid memory leaks when calling this!
void setNextHeap(HeapBase *heap) {nextHeap = heap;};
const MallocNode *heapHead() {return head;};
void save(Buffer &b);
static void loadHeapLayout(Buffer &b);
// unsigned int addHeap(unsigned int sz); //returns hHeap
unsigned int destroyHeap(unsigned int hHeap);
unsigned int getPrimaryHeap();
// static HeapBase *getHeap() {return primaryHeap;};
HeapBase *findHeap(unsigned int hHeap);
static void initHeap(const char *name, unsigned int maxSize = 0x100000);
protected:
EmuHeap(Buffer &b, unsigned int num_blocks);
bool checkHeapSize(unsigned int newsize);
MallocNode *findMallocNode(unsigned int addr);
unsigned int findBlock(unsigned int size);
void insert(MallocNode *node);
void readHeap(Buffer &b, unsigned int num_blocks);
void writeHeap(Buffer &b);
};
#endif