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 #include "global.h"
00026 #ifdef HAVE_HDRSTOP
00027 #pragma hdrstop
00028 #endif
00029
00030 #include <cctype>
00031 #include <algorithm>
00032 #include "codeglob.h"
00033
00034 using namespace std;
00035
00036
00037
00038
00039
00040 void CodeParser::GetStringStats(vma_t address,unsigned& len,unsigned& num_printable)
00041 {
00042 try
00043 {
00044 ObjectModule::DataReader reader = module->GetDataReader(address);
00045 unsigned n = 0;
00046 num_printable = 0;
00047 for (;;)
00048 {
00049
00050 if (module->HasRelocation()
00051 && module->GetRelocationInfos().GetRelocation(reader.Tell()))
00052 {
00053 len = num_printable = 0;
00054 return;
00055 }
00056
00057
00058 if (byteInfo.IsOccupied(reader.Tell()))
00059 {
00060 len = num_printable = 0;
00061 return;
00062 }
00063
00064 uint8_t car = reader.ReadByte();
00065 if (isprint(car))
00066 ++num_printable;
00067 ++n;
00068 if (car == 0)
00069 break;
00070 }
00071 len = n;
00072 }
00073 catch(const ObjectModule::OutOfAddress&)
00074 {
00075 len = num_printable = 0;
00076 }
00077 }
00078
00079 void CodeParser::GetPointerArrayStats(vma_t address,PointerArrayStat& stat)
00080 {
00081
00082 stat.nCodePointer = 0;
00083 stat.nPointer = 0;
00084 stat.nNull = 0;
00085 stat.nFirstNull = 0;
00086 bool bFirstNull = false;
00087 try
00088 {
00089 ObjectModule::DataReader reader = module->GetDataReader(address);
00090 for (unsigned n=0;;++n)
00091 {
00092
00093 if (byteInfo.IsOccupied(reader.Tell(),addr_bytes))
00094 break;
00095
00096 vma_t addr = reader.ReadDword();
00097
00098 if (IsNullAddress(addr))
00099 {
00100 ++stat.nNull;
00101
00102 if (!bFirstNull)
00103 stat.nFirstNull = n;
00104 bFirstNull = true;
00105 }
00106
00107 else if (!module->IsValid(addr))
00108 break;
00109 ++stat.nPointer;
00110 if (module->GetSection(addr)->IsCode())
00111 ++stat.nCodePointer;
00112 }
00113 }
00114 catch(const ObjectModule::OutOfAddress&) {};
00115
00116 if (!bFirstNull)
00117 stat.nFirstNull = stat.nPointer;
00118 }
00119
00120 void CodeParser::GetBitStat(vma_t address,unsigned numBytes,BitStat& stat)
00121 {
00122
00123 fill(stat.bit8,stat.bit8+8,0);
00124 fill(stat.bit16,stat.bit16+16,0);
00125 fill(stat.bit32,stat.bit32+32,0);
00126
00127 unsigned n;
00128 try
00129 {
00130 ObjectModule::DataReader reader = module->GetDataReader(address);
00131 for (n=0;n<numBytes;++n)
00132 {
00133 if (byteInfo.IsOccupied(reader.Tell()))
00134 break;
00135 uint8_t byte = reader.ReadByte();
00136
00137
00138 unsigned *pCount = &stat.bit32[(n%4u)*8u];
00139 for(unsigned n=1;n != (1<<8);++pCount,n<<=1)
00140 if(byte & n)
00141 ++*pCount;
00142 }
00143 }
00144 catch(const ObjectModule::OutOfAddress&) {};
00145
00146
00147 for(n=0;n < 16;++n)
00148 stat.bit16[n] = stat.bit32[n] + stat.bit32[n+16];
00149 for(n=0;n < 8;++n)
00150 stat.bit8[n] = stat.bit16[n] + stat.bit16[n+8];
00151 }