/* { vector <uint64_t> found; Bytestream select; while (Incremental(found,"byte stream",select,"byte stream","byte streams")) { DFMgr.Refresh(); DFHack::Context * DF = DFMgr.getSingleContext(); DF->Attach(); SegmentedFinder sf(ranges,DF); sf.Incremental< Bytestream ,uint32_t>(select,1,found, findBytestream); DF->Detach(); } } */ void DataPtrTrace(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges) { int element_size; do { getNumber("Set search granularity",element_size, 4); } while (element_size < 1); vector <uint64_t> found; set <uint64_t> check; // to detect circles uint32_t select; Bytestream bs_select; DFHack::Context * DF = DFMgr.getSingleContext(); DF->Attach(); DFMgr.Refresh(); found.clear(); SegmentedFinder sf(ranges,DF); while(found.empty()) { Incremental(found,"byte stream",bs_select,"byte stream","byte streams"); sf.Incremental< Bytestream ,uint32_t>(bs_select,1,found, findBytestream); } select = found[0]; cout <<"Starting: 0x" << hex << select << endl; while(sf.getSegmentForAddress(select)) { sf.Incremental<uint32_t,uint32_t>(select,element_size,found, equalityP<uint32_t>); if(found.empty()) { cout << "."; cout.flush(); select -=element_size; continue; } cout << endl; cout <<"Object start: 0x" << hex << select << endl; cout <<"Pointer: 0x" << hex << found[0] << endl; // make sure we don't go in circles' if(check.count(select)) { break; } check.insert(select); // ascend select = found[0]; found.clear(); } DF->Detach(); }
void FindStrings(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges) { vector <uint64_t> found; string select; while (Incremental(found,"string",select,"string","strings")) { DFMgr.Refresh(); DFHack::Context * DF = DFMgr.getSingleContext(); DF->Attach(); 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) { vector <uint64_t> found; Bytestream select; while (Incremental(found,"byte stream",select,"byte stream","byte streams")) { DFMgr.Refresh(); DFHack::Context * DF = DFMgr.getSingleContext(); DF->Attach(); SegmentedFinder sf(ranges,DF); sf.Incremental< Bytestream ,uint32_t>(select,1,found, findBytestream); 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")) { DFMgr.Refresh(); DFHack::Context * DF = DFMgr.getSingleContext(); DF->Attach(); SegmentedFinder sf(ranges,DF); sf.Find<int ,vecTriplet>(0,4,found, vectorAll); sf.Filter<uint32_t ,vecTriplet>(select,found, vectorOfPtrWithin); DF->Detach(); } }
void FindVectorByFirstObjectRawname(DFHack::ContextManager & DFMgr, 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(); SegmentedFinder sf(ranges,DF); sf.Find<int ,vecTriplet>(0,4,found, vectorAll); sf.Filter<const char * ,vecTriplet>(select.c_str(),found, vectorStringFirst); DF->Detach(); } }
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")) { DFMgr.Refresh(); DFHack::Context * DF = DFMgr.getSingleContext(); DF->Attach(); SegmentedFinder sf(ranges,DF); sf.Find<int ,vecTriplet>(0,4,found, vectorAll); sf.Filter<uint32_t ,vecTriplet>(select,found, vectorAddrWithin); // sort by size of vector std::sort(found.begin(), found.end(), VectorSizeFunctor(sf)); DF->Detach(); } }
void FindVectorByLength(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges ) { int element_size; do { getNumber("Select searched vector item size in bytes",element_size, 4); } while (element_size < 1); uint32_t length; vector <uint64_t> found; found.reserve(100); while (Incremental(found, "vector length",length,"vector","vectors")) { DFMgr.Refresh(); DFHack::Context * DF = DFMgr.getSingleContext(); DF->Attach(); SegmentedFinder sf(ranges,DF); sf.Incremental<int ,vecTriplet>(0,4,found,vectorAll); sf.Filter<uint32_t,vecTriplet>(length * element_size,found,vectorLength<uint32_t>); DF->Detach(); } }
void FindIntegers(DFHack::ContextManager & DFMgr, vector <DFHack::t_memrange>& ranges) { // input / validation of variable size int size; do { getNumber("Select variable size (1,2,4 bytes)",size, 4); } while (size != 1 && size != 2 && size != 4); // input / validation of variable alignment (default is to use the same alignment as size) int alignment; do { getNumber("Select variable alignment (1,2,4 bytes)",alignment, size); } while (alignment != 1 && alignment != 2 && alignment != 4); uint32_t test1; vector <uint64_t> found; found.reserve(100); while(Incremental(found, "integer",test1)) { DFMgr.Refresh(); DFHack::Context * DF = DFMgr.getSingleContext(); DF->Attach(); SegmentedFinder sf(ranges,DF); switch(size) { case 1: sf.Incremental<uint8_t,uint8_t>(test1,alignment,found, equalityP<uint8_t>); break; case 2: sf.Incremental<uint16_t,uint16_t>(test1,alignment,found, equalityP<uint16_t>); break; case 4: sf.Incremental<uint32_t,uint32_t>(test1,alignment,found, equalityP<uint32_t>); break; } DF->Detach(); } }