|
|
|
@ -27,9 +27,17 @@ inline void printRange(DFHack::t_memrange * tpr)
|
|
|
|
|
std::cout << std::hex << tpr->start << " - " << tpr->end << "|" << (tpr->read ? "r" : "-") << (tpr->write ? "w" : "-") << (tpr->execute ? "x" : "-") << "|" << tpr->name << std::endl;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool getRanges(DFHack::Process * p, vector <DFHack::t_memrange>& selected_ranges)
|
|
|
|
|
/*
|
|
|
|
|
* Since the start and/or end of a memory range can change each time we
|
|
|
|
|
* detach and re-attach to the DF process, we save the indexes of the
|
|
|
|
|
* memory ranges we want to look at, and re-read the ranges each time
|
|
|
|
|
* we re-attach. Hopefully we won't encounter any circumstances where
|
|
|
|
|
* entire new ranges are added or removed...
|
|
|
|
|
*/
|
|
|
|
|
bool getRanges(DFHack::Process * p, vector <int>& selected_ranges)
|
|
|
|
|
{
|
|
|
|
|
vector <DFHack::t_memrange> ranges;
|
|
|
|
|
ranges.clear();
|
|
|
|
|
selected_ranges.clear();
|
|
|
|
|
p->getMemRanges(ranges);
|
|
|
|
|
cout << "Which range to search? (default is 1-4)" << endl;
|
|
|
|
@ -46,8 +54,9 @@ bool getRanges(DFHack::Process * p, vector <DFHack::t_memrange>& selected_ranges
|
|
|
|
|
std::getline(cin, select);
|
|
|
|
|
if(select.empty())
|
|
|
|
|
{
|
|
|
|
|
// empty input, assume default. observe the length of the memory range vector
|
|
|
|
|
// these are hardcoded values, intended for my convenience only
|
|
|
|
|
// empty input, assume default. observe the length of the memory
|
|
|
|
|
// range vector these are hardcoded values, intended for my
|
|
|
|
|
// convenience only
|
|
|
|
|
if(p->getDescriptor()->getOS() == DFHack::OS_WINDOWS)
|
|
|
|
|
{
|
|
|
|
|
start = min(11, (int)ranges.size());
|
|
|
|
@ -78,20 +87,18 @@ bool getRanges(DFHack::Process * p, vector <DFHack::t_memrange>& selected_ranges
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
end++;
|
|
|
|
|
cout << "selected ranges:" <<endl;
|
|
|
|
|
vector <DFHack::t_memrange>::iterator it;
|
|
|
|
|
it = ranges.begin() + start;
|
|
|
|
|
while (it != ranges.begin() + end)
|
|
|
|
|
|
|
|
|
|
for (int i = start; i <= end; i++)
|
|
|
|
|
{
|
|
|
|
|
// check if readable
|
|
|
|
|
if((*it).read)
|
|
|
|
|
if (ranges[i].read)
|
|
|
|
|
{
|
|
|
|
|
selected_ranges.push_back(*it);
|
|
|
|
|
printRange(&*it);
|
|
|
|
|
selected_ranges.push_back(i);
|
|
|
|
|
printRange(&(ranges[i]));
|
|
|
|
|
}
|
|
|
|
|
it++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -139,6 +146,32 @@ bool getString (string prompt, string & output)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool readRanges(DFHack::Context * DF, vector <int>& selected_ranges,
|
|
|
|
|
vector <DFHack::t_memrange>& ranges)
|
|
|
|
|
{
|
|
|
|
|
DFHack::Process * p = DF->getProcess();
|
|
|
|
|
|
|
|
|
|
vector <DFHack::t_memrange> new_ranges;
|
|
|
|
|
new_ranges.clear();
|
|
|
|
|
p->getMemRanges(new_ranges);
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < selected_ranges.size(); i++)
|
|
|
|
|
{
|
|
|
|
|
int idx = selected_ranges[i];
|
|
|
|
|
|
|
|
|
|
if (ranges.size() == i)
|
|
|
|
|
// First time ranges vector has been filled in.
|
|
|
|
|
ranges.push_back(new_ranges[idx]);
|
|
|
|
|
// If something was wrong with the range on one memory read,
|
|
|
|
|
// don't read it again.
|
|
|
|
|
else if(ranges[i].valid)
|
|
|
|
|
ranges[i] = new_ranges[idx];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <class T>
|
|
|
|
|
bool Incremental ( vector <uint64_t> &found, const char * what, T& output,
|
|
|
|
|
const char *singular = "address", const char *plural = "addresses", bool numberz = false )
|
|
|
|
@ -215,8 +248,11 @@ bool Incremental ( vector <uint64_t> &found, const char * what, T& output,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FindIntegers(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges)
|
|
|
|
|
void FindIntegers(DFHack::ContextManager & DFMgr,
|
|
|
|
|
vector <int>& selected_ranges)
|
|
|
|
|
{
|
|
|
|
|
vector <DFHack::t_memrange> ranges;
|
|
|
|
|
|
|
|
|
|
// input / validation of variable size
|
|
|
|
|
int size;
|
|
|
|
|
do
|
|
|
|
@ -238,6 +274,7 @@ void FindIntegers(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& r
|
|
|
|
|
DFMgr.Refresh();
|
|
|
|
|
DFHack::Context * DF = DFMgr.getSingleContext();
|
|
|
|
|
DF->Attach();
|
|
|
|
|
readRanges(DF, selected_ranges, ranges);
|
|
|
|
|
SegmentedFinder sf(ranges,DF);
|
|
|
|
|
switch(size)
|
|
|
|
|
{
|
|
|
|
@ -255,8 +292,11 @@ void FindIntegers(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& r
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FindVectorByLength(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges )
|
|
|
|
|
void FindVectorByLength(DFHack::ContextManager & DFMgr,
|
|
|
|
|
vector <int>& selected_ranges )
|
|
|
|
|
{
|
|
|
|
|
vector <DFHack::t_memrange> ranges;
|
|
|
|
|
|
|
|
|
|
int element_size;
|
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
@ -271,6 +311,7 @@ void FindVectorByLength(DFHack::ContextManager & DFMgr, vector <DFHack::t_memran
|
|
|
|
|
DFMgr.Refresh();
|
|
|
|
|
DFHack::Context * DF = DFMgr.getSingleContext();
|
|
|
|
|
DF->Attach();
|
|
|
|
|
readRanges(DF, selected_ranges, ranges);
|
|
|
|
|
SegmentedFinder sf(ranges,DF);
|
|
|
|
|
//sf.Incremental<int ,vecTriplet>(0,4,found,vectorAll);
|
|
|
|
|
//sf.Filter<uint32_t,vecTriplet>(length * element_size,found,vectorLength<uint32_t>);
|
|
|
|
@ -279,15 +320,19 @@ void FindVectorByLength(DFHack::ContextManager & DFMgr, vector <DFHack::t_memran
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FindVectorByObjectRawname(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges)
|
|
|
|
|
void FindVectorByObjectRawname(DFHack::ContextManager & DFMgr,
|
|
|
|
|
vector <int>& selected_ranges)
|
|
|
|
|
{
|
|
|
|
|
vector <DFHack::t_memrange> ranges;
|
|
|
|
|
vector <uint64_t> found;
|
|
|
|
|
string select;
|
|
|
|
|
|
|
|
|
|
while (Incremental(found, "raw name",select,"vector","vectors"))
|
|
|
|
|
{
|
|
|
|
|
DFMgr.Refresh();
|
|
|
|
|
DFHack::Context * DF = DFMgr.getSingleContext();
|
|
|
|
|
DF->Attach();
|
|
|
|
|
readRanges(DF, selected_ranges, ranges);
|
|
|
|
|
SegmentedFinder sf(ranges,DF);
|
|
|
|
|
sf.Find<int ,vecTriplet>(0,4,found, vectorAll);
|
|
|
|
|
sf.Filter<const char * ,vecTriplet>(select.c_str(),found, vectorString);
|
|
|
|
@ -295,8 +340,10 @@ void FindVectorByObjectRawname(DFHack::ContextManager & DFMgr, vector <DFHack::t
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FindVectorByFirstObjectRawname(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges)
|
|
|
|
|
void FindVectorByFirstObjectRawname(DFHack::ContextManager & DFMgr,
|
|
|
|
|
vector <int>& selected_ranges)
|
|
|
|
|
{
|
|
|
|
|
vector <DFHack::t_memrange> ranges;
|
|
|
|
|
vector <uint64_t> found;
|
|
|
|
|
string select;
|
|
|
|
|
while (Incremental(found, "raw name",select,"vector","vectors"))
|
|
|
|
@ -304,6 +351,7 @@ void FindVectorByFirstObjectRawname(DFHack::ContextManager & DFMgr, vector <DFHa
|
|
|
|
|
DFMgr.Refresh();
|
|
|
|
|
DFHack::Context * DF = DFMgr.getSingleContext();
|
|
|
|
|
DF->Attach();
|
|
|
|
|
readRanges(DF, selected_ranges, ranges);
|
|
|
|
|
SegmentedFinder sf(ranges,DF);
|
|
|
|
|
sf.Find<int ,vecTriplet>(0,4,found, vectorAll);
|
|
|
|
|
sf.Filter<const char * ,vecTriplet>(select.c_str(),found, vectorStringFirst);
|
|
|
|
@ -323,8 +371,10 @@ struct VectorSizeFunctor : public binary_function<uint64_t, uint64_t, bool>
|
|
|
|
|
SegmentedFinder & sf_;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void FindVectorByBounds(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges)
|
|
|
|
|
void FindVectorByBounds(DFHack::ContextManager & DFMgr,
|
|
|
|
|
vector <int>& selected_ranges)
|
|
|
|
|
{
|
|
|
|
|
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"))
|
|
|
|
@ -332,6 +382,7 @@ void FindVectorByBounds(DFHack::ContextManager & DFMgr, vector <DFHack::t_memran
|
|
|
|
|
DFMgr.Refresh();
|
|
|
|
|
DFHack::Context * DF = DFMgr.getSingleContext();
|
|
|
|
|
DF->Attach();
|
|
|
|
|
readRanges(DF, selected_ranges, ranges);
|
|
|
|
|
SegmentedFinder sf(ranges,DF);
|
|
|
|
|
sf.Find<int ,vecTriplet>(0,4,found, vectorAll);
|
|
|
|
|
sf.Filter<uint32_t ,vecTriplet>(select,found, vectorAddrWithin);
|
|
|
|
@ -341,8 +392,10 @@ void FindVectorByBounds(DFHack::ContextManager & DFMgr, vector <DFHack::t_memran
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FindPtrVectorsByObjectAddress(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges)
|
|
|
|
|
void FindPtrVectorsByObjectAddress(DFHack::ContextManager & DFMgr,
|
|
|
|
|
vector <int>& selected_ranges)
|
|
|
|
|
{
|
|
|
|
|
vector <DFHack::t_memrange> ranges;
|
|
|
|
|
vector <uint64_t> found;
|
|
|
|
|
uint32_t select;
|
|
|
|
|
while (Incremental(found, "object address",select,"vector","vectors"))
|
|
|
|
@ -350,6 +403,7 @@ void FindPtrVectorsByObjectAddress(DFHack::ContextManager & DFMgr, vector <DFHac
|
|
|
|
|
DFMgr.Refresh();
|
|
|
|
|
DFHack::Context * DF = DFMgr.getSingleContext();
|
|
|
|
|
DF->Attach();
|
|
|
|
|
readRanges(DF, selected_ranges, ranges);
|
|
|
|
|
SegmentedFinder sf(ranges,DF);
|
|
|
|
|
sf.Find<int ,vecTriplet>(0,4,found, vectorAll);
|
|
|
|
|
sf.Filter<uint32_t ,vecTriplet>(select,found, vectorOfPtrWithin);
|
|
|
|
@ -357,8 +411,10 @@ void FindPtrVectorsByObjectAddress(DFHack::ContextManager & DFMgr, vector <DFHac
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FindStrBufs(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges)
|
|
|
|
|
void FindStrBufs(DFHack::ContextManager & DFMgr,
|
|
|
|
|
vector <int>& selected_ranges)
|
|
|
|
|
{
|
|
|
|
|
vector <DFHack::t_memrange> ranges;
|
|
|
|
|
vector <uint64_t> found;
|
|
|
|
|
string select;
|
|
|
|
|
while (Incremental(found,"buffer",select,"buffer","buffers"))
|
|
|
|
@ -366,6 +422,7 @@ void FindStrBufs(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ra
|
|
|
|
|
DFMgr.Refresh();
|
|
|
|
|
DFHack::Context * DF = DFMgr.getSingleContext();
|
|
|
|
|
DF->Attach();
|
|
|
|
|
readRanges(DF, selected_ranges, ranges);
|
|
|
|
|
SegmentedFinder sf(ranges,DF);
|
|
|
|
|
sf.Find< const char * ,uint32_t>(select.c_str(),1,found, findStrBuffer);
|
|
|
|
|
DF->Detach();
|
|
|
|
@ -374,8 +431,10 @@ void FindStrBufs(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ra
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void FindStrings(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges)
|
|
|
|
|
void FindStrings(DFHack::ContextManager & DFMgr,
|
|
|
|
|
vector <int>& selected_ranges)
|
|
|
|
|
{
|
|
|
|
|
vector <DFHack::t_memrange> ranges;
|
|
|
|
|
vector <uint64_t> found;
|
|
|
|
|
string select;
|
|
|
|
|
while (Incremental(found,"string",select,"string","strings"))
|
|
|
|
@ -383,14 +442,17 @@ void FindStrings(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ra
|
|
|
|
|
DFMgr.Refresh();
|
|
|
|
|
DFHack::Context * DF = DFMgr.getSingleContext();
|
|
|
|
|
DF->Attach();
|
|
|
|
|
readRanges(DF, selected_ranges, ranges);
|
|
|
|
|
SegmentedFinder sf(ranges,DF);
|
|
|
|
|
sf.Incremental< const char * ,uint32_t>(select.c_str(),1,found, findString);
|
|
|
|
|
DF->Detach();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FindData(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges)
|
|
|
|
|
void FindData(DFHack::ContextManager & DFMgr,
|
|
|
|
|
vector <int>& selected_ranges)
|
|
|
|
|
{
|
|
|
|
|
vector <DFHack::t_memrange> ranges;
|
|
|
|
|
vector <uint64_t> found;
|
|
|
|
|
Bytestream select;
|
|
|
|
|
while (Incremental(found,"byte stream",select,"byte stream","byte streams"))
|
|
|
|
@ -398,6 +460,7 @@ void FindData(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& range
|
|
|
|
|
DFMgr.Refresh();
|
|
|
|
|
DFHack::Context * DF = DFMgr.getSingleContext();
|
|
|
|
|
DF->Attach();
|
|
|
|
|
readRanges(DF, selected_ranges, ranges);
|
|
|
|
|
SegmentedFinder sf(ranges,DF);
|
|
|
|
|
sf.Incremental< Bytestream ,uint32_t>(select,1,found, findBytestream);
|
|
|
|
|
DF->Detach();
|
|
|
|
@ -449,10 +512,11 @@ bool TriggerIncremental ( vector <uint64_t> &found )
|
|
|
|
|
else return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void FindCoords(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges)
|
|
|
|
|
void FindCoords(DFHack::ContextManager & DFMgr, vector <int>& selected_ranges)
|
|
|
|
|
{
|
|
|
|
|
vector <uint64_t> found;
|
|
|
|
|
vector <DFHack::t_memrange> ranges;
|
|
|
|
|
|
|
|
|
|
int size = 4;
|
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
@ -463,6 +527,7 @@ void FindCoords(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ran
|
|
|
|
|
DFMgr.Refresh();
|
|
|
|
|
DFHack::Context * DF = DFMgr.getSingleContext();
|
|
|
|
|
DF->Attach();
|
|
|
|
|
readRanges(DF, selected_ranges, ranges);
|
|
|
|
|
DFHack::Gui * pos = DF->getGui();
|
|
|
|
|
pos->Start();
|
|
|
|
|
int32_t x, y, z;
|
|
|
|
@ -488,8 +553,11 @@ void FindCoords(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ran
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PtrTrace(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges)
|
|
|
|
|
void PtrTrace(DFHack::ContextManager & DFMgr,
|
|
|
|
|
vector <int>& selected_ranges)
|
|
|
|
|
{
|
|
|
|
|
vector <DFHack::t_memrange> ranges;
|
|
|
|
|
|
|
|
|
|
int element_size;
|
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
@ -505,6 +573,7 @@ void PtrTrace(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& range
|
|
|
|
|
found.clear();
|
|
|
|
|
DFHack::Context * DF = DFMgr.getSingleContext();
|
|
|
|
|
DF->Attach();
|
|
|
|
|
readRanges(DF, selected_ranges, ranges);
|
|
|
|
|
SegmentedFinder sf(ranges,DF);
|
|
|
|
|
cout <<"Starting: 0x" << hex << select << endl;
|
|
|
|
|
while(sf.getSegmentForAddress(select))
|
|
|
|
@ -548,8 +617,10 @@ void PtrTrace(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& range
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
void DataPtrTrace(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges)
|
|
|
|
|
void DataPtrTrace(DFHack::ContextManager & DFMgr,
|
|
|
|
|
vector <int>& selected_ranges)
|
|
|
|
|
{
|
|
|
|
|
vector <DFHack::t_memrange> ranges;
|
|
|
|
|
int element_size;
|
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
@ -563,6 +634,7 @@ void DataPtrTrace(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& r
|
|
|
|
|
DFHack::Context * DF = DFMgr.getSingleContext();
|
|
|
|
|
DF->Attach();
|
|
|
|
|
DFMgr.Refresh();
|
|
|
|
|
readRanges(DF, selected_ranges, ranges);
|
|
|
|
|
found.clear();
|
|
|
|
|
SegmentedFinder sf(ranges,DF);
|
|
|
|
|
while(found.empty())
|
|
|
|
@ -669,12 +741,15 @@ struct tilecolors
|
|
|
|
|
};
|
|
|
|
|
#pragma pack()
|
|
|
|
|
|
|
|
|
|
void autoSearch(DFHack::Context * DF, vector <DFHack::t_memrange>& ranges)
|
|
|
|
|
void autoSearch(DFHack::Context * DF, vector <int>& selected_ranges)
|
|
|
|
|
{
|
|
|
|
|
vector <DFHack::t_memrange> ranges;
|
|
|
|
|
vector <uint64_t> allVectors;
|
|
|
|
|
vector <uint64_t> filtVectors;
|
|
|
|
|
vector <uint64_t> to_filter;
|
|
|
|
|
|
|
|
|
|
readRanges(DF, selected_ranges, ranges);
|
|
|
|
|
|
|
|
|
|
cout << "stealing memory..." << endl;
|
|
|
|
|
SegmentedFinder sf(ranges, DF);
|
|
|
|
|
cout << "looking for vectors..." << endl;
|
|
|
|
@ -906,7 +981,7 @@ int main (void)
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
DFHack::Process * p = DF->getProcess();
|
|
|
|
|
vector <DFHack::t_memrange> selected_ranges;
|
|
|
|
|
vector <int> selected_ranges;
|
|
|
|
|
getRanges(p, selected_ranges);
|
|
|
|
|
|
|
|
|
|
string prompt =
|
|
|
|
|