1 /*
2  *	HT Editor
3  *	analy_x86.h
4  *
5  *	Copyright (C) 1999-2002 Sebastian Biallas (sb@biallas.net)
6  *
7  *	This program is free software; you can redistribute it and/or modify
8  *	it under the terms of the GNU General Public License version 2 as
9  *	published by the Free Software Foundation.
10  *
11  *	This program is distributed in the hope that it will be useful,
12  *	but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *	GNU General Public License for more details.
15  *
16  *	You should have received a copy of the GNU General Public License
17  *	along with this program; if not, write to the Free Software
18  *	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19  */
20 
21 #ifndef ANALY_X86_H
22 #define ANALY_X86_H
23 
24 #include "analy.h"
25 
26 class AddressX86Flat32: public Address {
27 public:
28 	uint32 addr;
AddressX86Flat32(BuildCtorArg & a)29 	AddressX86Flat32(BuildCtorArg&a): Address(a) {};
addr(a)30 	AddressX86Flat32(uint32 a=0): addr(a) {};
31 	virtual bool add(int offset);
32 	virtual int byteSize();
33 	virtual int compareTo(const Object *obj) const;
34 	virtual int compareDelinear(Address *to);
35 	virtual bool difference(int &result, Address *to);
36 	virtual AddressX86Flat32 *clone() const;
37 	virtual void getFromArray(const byte *array);
38 	virtual void getFromCPUAddress(CPU_ADDR *ca);
39 	virtual	bool getFromUInt64(uint64 u);
40 	virtual void load(ObjectStream &s);
41 	virtual ObjectID getObjectID() const;
42 	virtual int parseString(const char *s, int length, Analyser *a);
43 	virtual void putIntoArray(byte *array) const;
44 	virtual void putIntoCPUAddress(CPU_ADDR *ca) const;
45 	virtual	bool putIntoUInt64(uint64 &u) const;
46 	virtual void store(ObjectStream &s) const;
47 	virtual int stringify(char *s, int max_length, int format) const;
48 	virtual int stringSize() const;
49 };
50 
51 class AddressX86_1616: public Address {
52 public:
53 	uint16 seg;
54 	uint16 addr;
55 public:
AddressX86_1616(BuildCtorArg & a)56 	AddressX86_1616(BuildCtorArg&a): Address(a) {};
57 	AddressX86_1616(uint16 seg=0, uint16 addr=0);
58 	virtual bool add(int offset);
59 	virtual int byteSize();
60 	virtual int compareTo(const Object *obj) const;
61 	virtual int compareDelinear(Address *to);
62 	virtual bool difference(int &result, Address *to);
63 	virtual AddressX86_1616 *clone() const;
64 	virtual void getFromArray(const byte *array);
65 	virtual void getFromCPUAddress(CPU_ADDR *ca);
66 	virtual	bool getFromUInt64(uint64 u);
67 	virtual void load(ObjectStream &s);
68 	virtual ObjectID getObjectID() const;
69 	virtual int parseString(const char *s, int length, Analyser *a);
70 	virtual void putIntoArray(byte *array) const;
71 	virtual void putIntoCPUAddress(CPU_ADDR *ca) const;
72 	virtual	bool putIntoUInt64(uint64 &u) const;
73 	virtual void store(ObjectStream &s) const;
74 	virtual int stringify(char *s, int max_length, int format) const;
75 	virtual int stringSize() const;
76 };
77 
78 class AddressX86_1632: public Address {
79 public:
80 	uint16 seg;
81 	uint32 addr;
82 public:
AddressX86_1632(BuildCtorArg & a)83 	AddressX86_1632(BuildCtorArg&a): Address(a) {};
84 	AddressX86_1632(uint16 seg=0, uint32 addr=0);
85 	virtual bool add(int offset);
86 	virtual int byteSize();
87 	virtual int compareTo(const Object *obj) const;
88 	virtual int compareDelinear(Address *obj);
89 	virtual bool difference(int &result, Address *to);
90 	virtual AddressX86_1632 *clone() const;
91 	virtual void getFromArray(const byte *array);
92 	virtual void getFromCPUAddress(CPU_ADDR *ca);
93 	virtual	bool getFromUInt64(uint64 u);
94 	virtual void load(ObjectStream &s);
95 	virtual ObjectID getObjectID() const;
96 	virtual int parseString(const char *s, int length, Analyser *a);
97 	virtual void putIntoArray(byte *array) const;
98 	virtual void putIntoCPUAddress(CPU_ADDR *ca) const;
99 	virtual	bool putIntoUInt64(uint64 &u) const;
100 	virtual void store(ObjectStream &s) const;
101 	virtual int stringify(char *s, int max_length, int format) const;
102 	virtual int stringSize() const;
103 };
104 
105 #define ANALYX86DISASSEMBLER_FLAGS_16BIT		1
106 #define ANALYX86DISASSEMBLER_FLAGS_SEGMENTED		2
107 #define ANALYX86DISASSEMBLER_FLAGS_FLAT64		4
108 #define ANALYX86DISASSEMBLER_FLAGS_VXD_X86DIS		8
109 #define ANALYX86DISASSEMBLER_FLAGS_AMD64		16
110 
111 class AnalyX86Disassembler: public AnalyDisassembler {
112 protected:
113 		void		createUnasm();
114 public:
115 	int flags;
116 
AnalyX86Disassembler()117 				AnalyX86Disassembler() {};
AnalyX86Disassembler(BuildCtorArg & a)118 				AnalyX86Disassembler(BuildCtorArg&a): AnalyDisassembler(a) {};
119 		void		init(Analyser *A, int flags);
120 		void 		load(ObjectStream &f);
121 	virtual	ObjectID	getObjectID() const;
122 
123 	virtual	Address		*branchAddr(OPCODE *opcode, branch_enum_t branchtype, bool examine);
124 		Address		*createAddress(uint16 segment, uint64 offset);
125 		uint16		getSegment(Address *addr);
126 	virtual	void		examineOpcode(OPCODE *opcode);
127 	virtual	branch_enum_t 	isBranch(OPCODE *opcode);
128 	virtual	void		store(ObjectStream &f) const;
129 };
130 
131 #endif
132