00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef FILE_BYTEINFO_H
00026 #define FILE_BYTEINFO_H
00027
00028 #include <map>
00029 #include "utils/fixvect.hpp"
00030 #include "utils/f77auto_ptr"
00031
00032
00033
00034
00035
00036 struct ByteInfo
00037 {
00038 public:
00039
00040
00041
00042 enum TPriority
00043 {
00044 priNone,
00045 priCheckOnly,
00046 priFiller,
00047 priConstant,
00048 priApi,
00049 priHeuristics,
00050 priExport,
00051 priSafeHeuristics,
00052 priSafeExport,
00053 priEntryPoint,
00054 priMax = priEntryPoint
00055 };
00056
00057
00058
00059 enum TType
00060 {
00061 typeNone,
00062 typeInstruction = typeNone,
00063 typeLoader,
00064 typeInteger,
00065 typePointer,
00066 typeASCIIZ,
00067 typeMax = typeASCIIZ
00068 };
00069 uchar len;
00070
00071
00072 ByteInfo():len(0),priority(priNone),flag(0),type(typeNone) {};
00073
00074
00075
00076 void Reset() { priority = priNone; len = 0; flag = 0; type = typeNone; };
00077
00078
00079 void SetPriority(enum TPriority pri)
00080 { _PRG_ASSERT(pri>=0 && pri<=priMax); priority = static_cast<uchar>(pri); };
00081 enum TPriority GetPriority() const
00082 { return static_cast<enum TPriority>(priority); };
00083 void SetType(enum TType typ)
00084 { _PRG_ASSERT(typ>=0 && typ<=typeMax); type = static_cast<uchar>(typ); };
00085 enum TType GetType() const { return static_cast<enum TType>(type); };
00086
00087
00088
00089
00090
00091
00092 void SetIsPrevInstruction() { flag |= 1; };
00093 int IsPrevInstruction() const { return flag&1; };
00094
00095
00096
00097 void SetIsLabel() { flag |= 2; };
00098 int IsLabel() const { return flag&2; };
00099
00100
00101
00102 void SetContinue() { flag |= 4; };
00103 int Continue() const { return flag&4; };
00104 private:
00105 uchar priority;
00106 uchar flag;
00107 uchar type;
00108 };
00109
00110
00111
00112
00113 class ByteInfos
00114 {
00115 public:
00116
00117
00118
00119
00120 ByteInfo& operator[](vma_t address);
00121 const ByteInfo& operator[](vma_t address) const;
00122
00123
00124
00125
00126 uchar GetIstrLen(vma_t) const;
00127
00128
00129
00130 void SetLen(vma_t address,unsigned len);
00131
00132
00133
00134 unsigned GetLen(vma_t address) const;
00135
00136
00137
00138 bool IsOccupied(vma_t address) const;
00139
00140
00141
00142 bool IsOccupied(vma_t address,int bytes) const;
00143
00144
00145
00146 private:
00147 enum dummy { PageSize = 4096 };
00148 typedef fix_vector<ByteInfo,PageSize> TPage;
00149 typedef std::map< vma_t,freddy77::hp_auto_ptr<TPage>,std::less<vma_t> > TInfos;
00150 TInfos map;
00151 static ByteInfo emptyInfo;
00152 };
00153
00154 #endif // FILE_BYTEINFO_H