|
|
|
@ -137,11 +137,11 @@ bool Incremental ( vector <uint64_t> &found, const char * what, T& output,
|
|
|
|
|
string select;
|
|
|
|
|
if(found.empty())
|
|
|
|
|
{
|
|
|
|
|
cout << "search ready - insert " << what << ", 'p' for results" << endl;
|
|
|
|
|
cout << "search ready - insert " << what << ", 'p' for results, 'p #' to limit number of results" << endl;
|
|
|
|
|
}
|
|
|
|
|
else if( found.size() == 1)
|
|
|
|
|
{
|
|
|
|
|
cout << "Found an "<< singular <<"!" << endl;
|
|
|
|
|
cout << "Found single "<< singular <<"!" << endl;
|
|
|
|
|
cout << hex << "0x" << found[0] << endl;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
@ -151,7 +151,17 @@ bool Incremental ( vector <uint64_t> &found, const char * what, T& output,
|
|
|
|
|
incremental_more:
|
|
|
|
|
cout << ">>";
|
|
|
|
|
std::getline(cin, select);
|
|
|
|
|
if(select == "p")
|
|
|
|
|
size_t num = 0;
|
|
|
|
|
if( sscanf(select.c_str(),"p %d", &num) && num > 0)
|
|
|
|
|
{
|
|
|
|
|
cout << "Found "<< plural <<":" << endl;
|
|
|
|
|
for(int i = 0; i < min(found.size(), num);i++)
|
|
|
|
|
{
|
|
|
|
|
cout << hex << "0x" << found[i] << endl;
|
|
|
|
|
}
|
|
|
|
|
goto incremental_more;
|
|
|
|
|
}
|
|
|
|
|
else if(select == "p")
|
|
|
|
|
{
|
|
|
|
|
cout << "Found "<< plural <<":" << endl;
|
|
|
|
|
for(int i = 0; i < found.size();i++)
|
|
|
|
@ -168,18 +178,21 @@ bool Incremental ( vector <uint64_t> &found, const char * what, T& output,
|
|
|
|
|
{
|
|
|
|
|
stringstream ss (stringstream::in | stringstream::out);
|
|
|
|
|
ss << select;
|
|
|
|
|
ss >> output;
|
|
|
|
|
ss >> hex >> output;
|
|
|
|
|
if(ss.fail())
|
|
|
|
|
{
|
|
|
|
|
ss >> dec >> output;
|
|
|
|
|
if(ss.fail())
|
|
|
|
|
{
|
|
|
|
|
cout << "not a valid value for type: " << what << endl;
|
|
|
|
|
goto incremental_more;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//TODO: lots of optimization
|
|
|
|
|
void searchLoop(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges)
|
|
|
|
|
void FindIntegers(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges)
|
|
|
|
|
{
|
|
|
|
|
// input / validation of variable size
|
|
|
|
|
int size;
|
|
|
|
@ -219,7 +232,7 @@ void searchLoop(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ran
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void searchLoopVector(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges )
|
|
|
|
|
void FindVectorByLength(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges )
|
|
|
|
|
{
|
|
|
|
|
int element_size;
|
|
|
|
|
do
|
|
|
|
@ -242,7 +255,7 @@ void searchLoopVector(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void searchLoopStrObjVector(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges)
|
|
|
|
|
void FindVectorByObjectRawname(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges)
|
|
|
|
|
{
|
|
|
|
|
vector <uint64_t> found;
|
|
|
|
|
string select;
|
|
|
|
@ -260,7 +273,76 @@ void searchLoopStrObjVector(DFHack::ContextManager & DFMgr, vector <DFHack::t_me
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void searchLoopStr(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges)
|
|
|
|
|
void FindVectorByFirstObjectRawname(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges)
|
|
|
|
|
{
|
|
|
|
|
vector <uint64_t> found;
|
|
|
|
|
string select;
|
|
|
|
|
while (Incremental(found, "raw name",select,"vector","vectors"))
|
|
|
|
|
{
|
|
|
|
|
// clear the list of found addresses -- this is a one-shot
|
|
|
|
|
found.clear();
|
|
|
|
|
DFMgr.Refresh();
|
|
|
|
|
DFHack::Context * DF = DFMgr.getSingleContext();
|
|
|
|
|
DF->Attach();
|
|
|
|
|
SegmentedFinder sf(ranges,DF);
|
|
|
|
|
sf.Find<int ,vecTriplet>(0,4,found, vectorAll);
|
|
|
|
|
sf.Find<const char * ,vecTriplet>(select.c_str(),4,found, vectorStringFirst);
|
|
|
|
|
DF->Detach();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct VectorSizeFunctor : public binary_function<uint64_t, uint64_t, bool>
|
|
|
|
|
{
|
|
|
|
|
VectorSizeFunctor(SegmentedFinder & sf):sf_(sf){}
|
|
|
|
|
bool operator()( uint64_t lhs, uint64_t rhs)
|
|
|
|
|
{
|
|
|
|
|
vecTriplet* left = sf_.Translate<vecTriplet>(lhs);
|
|
|
|
|
vecTriplet* right = sf_.Translate<vecTriplet>(rhs);
|
|
|
|
|
return ((left->finish - left->start) < (right->finish - right->start));
|
|
|
|
|
}
|
|
|
|
|
SegmentedFinder & sf_;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void FindVectorByBounds(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges)
|
|
|
|
|
{
|
|
|
|
|
vector <uint64_t> found;
|
|
|
|
|
uint32_t select;
|
|
|
|
|
while (Incremental(found, "address between vector.start and vector.end",select,"vector","vectors"))
|
|
|
|
|
{
|
|
|
|
|
// clear the list of found addresses -- this is a one-shot
|
|
|
|
|
found.clear();
|
|
|
|
|
DFMgr.Refresh();
|
|
|
|
|
DFHack::Context * DF = DFMgr.getSingleContext();
|
|
|
|
|
DF->Attach();
|
|
|
|
|
SegmentedFinder sf(ranges,DF);
|
|
|
|
|
sf.Find<int ,vecTriplet>(0,4,found, vectorAll);
|
|
|
|
|
sf.Find<uint32_t ,vecTriplet>(select,4,found, vectorAddrWithin);
|
|
|
|
|
// sort by size of vector
|
|
|
|
|
std::sort(found.begin(), found.end(), VectorSizeFunctor(sf));
|
|
|
|
|
DF->Detach();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FindPtrVectorsByObjectAddress(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges)
|
|
|
|
|
{
|
|
|
|
|
vector <uint64_t> found;
|
|
|
|
|
uint32_t select;
|
|
|
|
|
while (Incremental(found, "object address",select,"vector","vectors"))
|
|
|
|
|
{
|
|
|
|
|
// clear the list of found addresses -- this is a one-shot
|
|
|
|
|
found.clear();
|
|
|
|
|
DFMgr.Refresh();
|
|
|
|
|
DFHack::Context * DF = DFMgr.getSingleContext();
|
|
|
|
|
DF->Attach();
|
|
|
|
|
SegmentedFinder sf(ranges,DF);
|
|
|
|
|
sf.Find<int ,vecTriplet>(0,4,found, vectorAll);
|
|
|
|
|
sf.Find<uint32_t ,vecTriplet>(select,4,found, vectorOfPtrWithin);
|
|
|
|
|
DF->Detach();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void FindStrings(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges)
|
|
|
|
|
{
|
|
|
|
|
vector <uint64_t> found;
|
|
|
|
|
string select;
|
|
|
|
@ -290,17 +372,17 @@ void automatedLangtables(DFHack::Context * DF, vector <DFHack::t_memrange>& rang
|
|
|
|
|
|
|
|
|
|
// find lang vector (neutral word table)
|
|
|
|
|
to_filter = allVectors;
|
|
|
|
|
sf.Find<const char * ,vecTriplet>("ABBEY",4,to_filter, vectorString);
|
|
|
|
|
sf.Find<const char * ,vecTriplet>("ABBEY",4,to_filter, vectorStringFirst);
|
|
|
|
|
uint64_t lang_addr = to_filter[0];
|
|
|
|
|
|
|
|
|
|
// find dwarven language word table
|
|
|
|
|
to_filter = allVectors;
|
|
|
|
|
sf.Find<const char * ,vecTriplet>("kulet",4,to_filter, vectorString);
|
|
|
|
|
sf.Find<const char * ,vecTriplet>("kulet",4,to_filter, vectorStringFirst);
|
|
|
|
|
kulet_vector = to_filter[0];
|
|
|
|
|
|
|
|
|
|
// find vector of languages
|
|
|
|
|
to_filter = allVectors;
|
|
|
|
|
sf.Find<const char * ,vecTriplet>("DWARF",4,to_filter, vectorString);
|
|
|
|
|
sf.Find<const char * ,vecTriplet>("DWARF",4,to_filter, vectorStringFirst);
|
|
|
|
|
|
|
|
|
|
// verify
|
|
|
|
|
for(int i = 0; i < to_filter.size(); i++)
|
|
|
|
@ -352,24 +434,30 @@ int main (void)
|
|
|
|
|
} while (mode < 1 || mode > 8 );
|
|
|
|
|
switch (mode)
|
|
|
|
|
{
|
|
|
|
|
case 1:// integers
|
|
|
|
|
searchLoop(DFMgr, selected_ranges);
|
|
|
|
|
case 1:
|
|
|
|
|
FindIntegers(DFMgr, selected_ranges);
|
|
|
|
|
break;
|
|
|
|
|
case 2:// vector by length and item size
|
|
|
|
|
searchLoopVector(DFMgr, selected_ranges);
|
|
|
|
|
case 2:
|
|
|
|
|
FindVectorByLength(DFMgr, selected_ranges);
|
|
|
|
|
break;
|
|
|
|
|
case 3:// vector>object>string
|
|
|
|
|
searchLoopStrObjVector(DFMgr, selected_ranges);
|
|
|
|
|
case 3:
|
|
|
|
|
FindVectorByObjectRawname(DFMgr, selected_ranges);
|
|
|
|
|
break;
|
|
|
|
|
case 4:// string
|
|
|
|
|
searchLoopStr(DFMgr, selected_ranges);
|
|
|
|
|
case 4:
|
|
|
|
|
FindStrings(DFMgr, selected_ranges);
|
|
|
|
|
break;
|
|
|
|
|
case 5:
|
|
|
|
|
automatedLangtables(DF,selected_ranges);
|
|
|
|
|
break;
|
|
|
|
|
case 6:
|
|
|
|
|
FindVectorByBounds(DFMgr,selected_ranges);
|
|
|
|
|
break;
|
|
|
|
|
case 7:
|
|
|
|
|
FindPtrVectorsByObjectAddress(DFMgr,selected_ranges);
|
|
|
|
|
break;
|
|
|
|
|
case 8:
|
|
|
|
|
FindVectorByFirstObjectRawname(DFMgr, selected_ranges);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
cout << "not implemented :(" << endl;
|
|
|
|
|
}
|
|
|
|
|