From 8d15e22a59fa19661d2f23d0db33454c0c282efc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Wed, 2 Jun 2010 05:39:55 +0200 Subject: [PATCH] Simplified memory search tool --- tools/playground/SegmentedFinder.h | 224 ++++++++ tools/playground/incrementalsearch.cpp | 757 ++++++++----------------- 2 files changed, 476 insertions(+), 505 deletions(-) create mode 100644 tools/playground/SegmentedFinder.h diff --git a/tools/playground/SegmentedFinder.h b/tools/playground/SegmentedFinder.h new file mode 100644 index 000000000..f16152997 --- /dev/null +++ b/tools/playground/SegmentedFinder.h @@ -0,0 +1,224 @@ +#ifndef SEGMENTED_FINDER_H +#define SEGMENTED_FINDER_H + +class SegmentedFinder; +class SegmentFinder +{ + public: + SegmentFinder(DFHack::t_memrange & mr, DFHack::Context * DF, SegmentedFinder * SF) + { + _DF = DF; + mr_ = mr; + mr_.buffer = (uint8_t *)malloc (mr_.end - mr_.start); + DF->ReadRaw(mr_.start,(mr_.end - mr_.start),mr_.buffer); + _SF = SF; + } + ~SegmentFinder() + { + delete mr_.buffer; + } + template + bool Find (needleType needle, const uint8_t increment ,vector &found, vector &newfound, comparator oper) + { + if(found.empty()) + { + //loop + for(uint64_t offset = 0; offset < (mr_.end - mr_.start) - sizeof(hayType); offset += increment) + { + if( oper(_SF,(hayType *)(mr_.buffer + offset), needle) ) + newfound.push_back(mr_.start + offset); + } + } + else + { + for( uint64_t i = 0; i < found.size(); i++) + { + if(mr_.isInRange(found[i])) + { + uint64_t corrected = found[i] - mr_.start; + if( oper(_SF,(hayType *)(mr_.buffer + corrected), needle) ) + newfound.push_back(found[i]); + } + } + } + return true; + } + private: + friend class SegmentedFinder; + SegmentedFinder * _SF; + DFHack::Context * _DF; + DFHack::t_memrange mr_; +}; + +class SegmentedFinder +{ + public: + SegmentedFinder(vector & ranges, DFHack::Context * DF) + { + _DF = DF; + for(int i = 0; i < ranges.size(); i++) + { + segments.push_back(new SegmentFinder(ranges[i], DF, this)); + } + } + ~SegmentedFinder() + { + for(int i = 0; i < segments.size(); i++) + { + delete segments[i]; + } + } + SegmentFinder * getSegmentForAddress (uint64_t addr) + { + for(int i = 0; i < segments.size(); i++) + { + if(segments[i]->mr_.isInRange(addr)) + { + return segments[i]; + } + } + return 0; + } + template + bool Find (const needleType needle, const uint8_t increment, vector &found, comparator oper) + { + vector newfound; + for(int i = 0; i < segments.size(); i++) + { + segments[i]->Find(needle, increment, found, newfound, oper); + } + found.clear(); + found = newfound; + return !(found.empty()); + } + template + T * Translate(uint64_t address) + { + for(int i = 0; i < segments.size(); i++) + { + if(segments[i]->mr_.isInRange(address)) + { + return (T *) (segments[i]->mr_.buffer + address - segments[i]->mr_.start); + } + } + return 0; + } + template + T Read(uint64_t address) + { + return *Translate(address); + } + template + bool Read(uint64_t address, T& target) + { + T * test = Translate(address); + if(test) + { + target = *test; + return true; + } + return false; + } + private: + DFHack::Context * _DF; + vector segments; +}; + +template +bool equalityP (SegmentedFinder* s, T *x, T y) +{ + return (*x) == y; +} + +struct vecTriplet +{ + uint32_t start; + uint32_t finish; + uint32_t alloc_finish; +}; + +template +bool vectorLength (SegmentedFinder* s, vecTriplet *x, Needle &y) +{ + if(x->start <= x->finish && x->finish <= x->alloc_finish) + if((x->finish - x->start) == y) + return true; + return false; +} + +// find a vector of 32bit pointers, where an object pointed to has a string 'y' as the first member +bool vectorString (SegmentedFinder* s, vecTriplet *x, const char *y) +{ + uint32_t object_ptr; + uint32_t idx = x->start; + // iterato over vector of pointers + for(uint32_t idx = x->start; idx < x->finish; idx += sizeof(uint32_t)) + { + // deref ptr idx, get ptr to object + if(!s->Read(idx,object_ptr)) + { + return false; + } + // deref ptr to first object, get ptr to string + uint32_t string_ptr; + if(!s->Read(object_ptr,string_ptr)) + return false; + // get string location in our local cache + char * str = s->Translate(string_ptr); + if(!str) + return false; + if(strcmp(y, str) == 0) + return true; + } + return false; +} + +// test if the address is within a vector's array +bool vectorAddrWithin (SegmentedFinder* s, vecTriplet *x, uint32_t address) +{ + if(address < x->finish && address >= x->start) + return true; + return false; +} + +// test if an object address is within the vector of pointers +bool vectorOfPtrWithin (SegmentedFinder* s, vecTriplet *x, uint32_t address) +{ + uint32_t object_ptr; + uint32_t idx = x->start; + for(uint32_t idx = x->start; idx < x->finish; idx += sizeof(uint32_t)) + { + if(!s->Read(idx,object_ptr)) + { + return false; + } + if(object_ptr == address) + return true; + } + return false; +} + +bool vectorAll (SegmentedFinder* s, vecTriplet *x, int ) +{ + if(x->start <= x->finish && x->finish <= x->alloc_finish) + { + if(s->getSegmentForAddress(x->start) == s->getSegmentForAddress(x->finish) + && s->getSegmentForAddress(x->finish) == s->getSegmentForAddress(x->alloc_finish)) + return true; + } + return false; +} + +bool findString (SegmentedFinder* s, uint32_t *addr, const char * compare ) +{ + // read string pointer, translate to local scheme + char *str = s->Translate(*addr); + // verify + if(!str) + return false; + if(strcmp(str, compare) == 0) + return true; + return false; +} + +#endif // SEGMENTED_FINDER_H \ No newline at end of file diff --git a/tools/playground/incrementalsearch.cpp b/tools/playground/incrementalsearch.cpp index 66f0bf63d..083597ba3 100644 --- a/tools/playground/incrementalsearch.cpp +++ b/tools/playground/incrementalsearch.cpp @@ -19,395 +19,307 @@ using namespace std; #endif #include -class SegmentedFinder; -class SegmentFinder +#include "SegmentedFinder.h" + +inline void printRange(DFHack::t_memrange * tpr) { - public: - SegmentFinder(DFHack::t_memrange & mr, DFHack::Context * DF, SegmentedFinder * SF) - { - _DF = DF; - mr_ = mr; - mr_.buffer = (uint8_t *)malloc (mr_.end - mr_.start); - DF->ReadRaw(mr_.start,(mr_.end - mr_.start),mr_.buffer); - _SF = SF; - } - ~SegmentFinder() + 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 & selected_ranges) +{ + vector ranges; + selected_ranges.clear(); + p->getMemRanges(ranges); + cout << "Which range to search? (default is 1-4)" << endl; + for(int i = 0; i< ranges.size();i++) { - delete mr_.buffer; + cout << dec << "(" << i << ") "; + printRange(&(ranges[i])); } - template - bool Find (needleType needle, const uint8_t increment ,vector &found, vector &newfound, comparator oper) + int start, end; + while(1) { - if(found.empty()) + string select; + cout << ">>"; + std::getline(cin, select); + if(select.empty()) { - //loop - for(uint64_t offset = 0; offset < (mr_.end - mr_.start) - sizeof(hayType); offset += increment) + // 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::memory_info::OS_WINDOWS) { - if( oper(_SF,(hayType *)(mr_.buffer + offset), needle) ) - newfound.push_back(mr_.start + offset); + start = min(11, (int)ranges.size()); + end = min(14, (int)ranges.size()); } - } - else - { - for( uint64_t i = 0; i < found.size(); i++) + else if(p->getDescriptor()->getOS() == DFHack::memory_info::OS_LINUX) + { + start = min(11, (int)ranges.size()); + end = min(14, (int)ranges.size()); + } + else { - if(mr_.isInRange(found[i])) - { - uint64_t corrected = found[i] - mr_.start; - if( oper(_SF,(hayType *)(mr_.buffer + corrected), needle) ) - newfound.push_back(found[i]); - } + start = 1; + end = 1; } + break; } - return true; - } - private: - friend class SegmentedFinder; - SegmentedFinder * _SF; - DFHack::Context * _DF; - DFHack::t_memrange mr_; -}; - -class SegmentedFinder -{ - public: - SegmentedFinder(vector & ranges, DFHack::Context * DF) - { - _DF = DF; - for(int i = 0; i < ranges.size(); i++) + // I like the C variants here. much less object clutter + else if(sscanf(select.c_str(), "%d-%d", &start, &end) == 2) { - segments.push_back(new SegmentFinder(ranges[i], DF, this)); + start = min(start, (int)ranges.size()); + end = min(end, (int)ranges.size()); + break; } - } - ~SegmentedFinder() - { - for(int i = 0; i < segments.size(); i++) + else { - delete segments[i]; + continue; } + break; } - SegmentFinder * getSegmentForAddress (uint64_t addr) + end++; + cout << "selected ranges:" <mr_.isInRange(addr)) - { - return segments[i]; - } - } - return 0; + printRange(&(selected_ranges[i])); } - template - bool Find (const needleType needle, const uint8_t increment, vector &found, comparator oper) +} + +bool getNumber (string prompt, int & output, int def, bool pdef = true) +{ + cout << prompt; + if(pdef) + cout << " default=" << def << endl; + while (1) { - vector newfound; - for(int i = 0; i < segments.size(); i++) + string select; + cout << ">>"; + std::getline(cin, select); + if(select.empty()) { - segments[i]->Find(needle, increment, found, newfound, oper); + output = def; + break; } - found.clear(); - found = newfound; - return !(found.empty()); - } - template - T * Translate(uint64_t address) - { - for(int i = 0; i < segments.size(); i++) + else if( sscanf(select.c_str(), "%d", &output) == 1 ) { - if(segments[i]->mr_.isInRange(address)) - { - return (T *) (segments[i]->mr_.buffer + address - segments[i]->mr_.start); - } + break; } - return 0; - } - template - T Read(uint64_t address) - { - return *Translate(address); - } - template - bool Read(uint64_t address, T& target) - { - T * test = Translate(address); - if(test) + else { - target = *test; - return true; + continue; } - return false; } - private: - DFHack::Context * _DF; - vector segments; -}; - -template -bool equalityP (SegmentedFinder* s, T *x, T y) -{ - return (*x) == y; + return true; } -struct vecTriplet -{ - uint32_t start; - uint32_t finish; - uint32_t alloc_finish; -}; - -template -bool vectorLength (SegmentedFinder* s, vecTriplet *x, Needle &y) +bool getString (string prompt, string & output) { - if(x->start <= x->finish && x->finish <= x->alloc_finish) - if((x->finish - x->start) == y) - return true; - return false; -} - -bool vectorString (SegmentedFinder* s, vecTriplet *x, const char *y) -{ - if(x->start <= x->finish && x->finish <= x->alloc_finish) + cout << prompt; + cout << ">>"; + string select; + std::getline(cin, select); + if(select.empty()) { - // deref ptr start, get ptr to firt object - uint32_t object_ptr; - if(!s->Read(x->start,object_ptr)) - return false; - // deref ptr to first object, get ptr to string - uint32_t string_ptr; - if(!s->Read(object_ptr,string_ptr)) - return false; - // get string location in our local cache - char * str = s->Translate(string_ptr); - if(!str) - return false; - if(strcmp(y, str) == 0) - return true; + return false; } - return false; -} - -bool vectorAll (SegmentedFinder* s, vecTriplet *x, int ) -{ - if(x->start <= x->finish && x->finish <= x->alloc_finish) + else { - if(s->getSegmentForAddress(x->start) == s->getSegmentForAddress(x->finish) - && s->getSegmentForAddress(x->finish) == s->getSegmentForAddress(x->alloc_finish)) - return true; + output = select; + return true; } - return false; } -bool findString (SegmentedFinder* s, uint32_t *addr, const char * compare ) +template +bool Incremental ( vector &found, const char * what, T& output, + const char *singular = "address", const char *plural = "addresses" ) { - // read string pointer, translate to local scheme - char *str = s->Translate(*addr); - // verify - if(!str) + string select; + if(found.empty()) + { + cout << "search ready - insert " << what << ", 'p' for results" << endl; + } + else if( found.size() == 1) + { + cout << "Found an "<< singular <<"!" << endl; + cout << hex << "0x" << found[0] << endl; + } + else + { + cout << "Found " << dec << found.size() << " " << plural <<"." << endl; + } + incremental_more: + cout << ">>"; + std::getline(cin, select); + if(select == "p") + { + cout << "Found "<< plural <<":" << endl; + for(int i = 0; i < found.size();i++) + { + cout << hex << "0x" << found[i] << endl; + } + goto incremental_more; + } + else if(select.empty()) + { return false; - if(strcmp(str, compare) == 0) + } + else + { + stringstream ss (stringstream::in | stringstream::out); + ss << select; + ss >> output; + if(ss.fail()) + { + cout << "not a valid value for type: " << what << endl; + goto incremental_more; + } return true; - return false; + } } //TODO: lots of optimization -void searchLoop(DFHack::ContextManager & DFMgr, vector & ranges, int size, int alignment) +void searchLoop(DFHack::ContextManager & DFMgr, vector & 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 found; found.reserve(100); - //bool initial = 1; - cout << "search ready - insert integers, 'p' for results" << endl; - string select; - while (1) + while(Incremental(found, "integer",test1)) { - cout << ">>"; - std::getline(cin, select); - if(select == "p") - { - cout << "Found addresses:" << endl; - for(int i = 0; i < found.size();i++) - { - cout << hex << "0x" << found[i] << endl; - } - } - else if(sscanf(select.c_str(),"%d", &test1) == 1) + DFMgr.Refresh(); + DFHack::Context * DF = DFMgr.getSingleContext(); + DF->Attach(); + SegmentedFinder sf(ranges,DF); + switch(size) { - // refresh the list of processes, get first suitable, attach - DFMgr.Refresh(); - DFHack::Context * DF = DFMgr.getSingleContext(); - DF->Attach(); - SegmentedFinder sf(ranges,DF); - switch(size) - { - case 1: - sf.Find(test1,alignment,found, equalityP); - break; - case 2: - sf.Find(test1,alignment,found, equalityP); - break; - case 4: - sf.Find(test1,alignment,found, equalityP); - break; - } - if( found.size() == 1) - { - cout << "Found an address!" << endl; - cout << hex << "0x" << found[0] << endl; - } - else - cout << "Found " << dec << found.size() << " addresses." << endl; - DF->Detach(); + case 1: + sf.Find(test1,alignment,found, equalityP); + break; + case 2: + sf.Find(test1,alignment,found, equalityP); + break; + case 4: + sf.Find(test1,alignment,found, equalityP); + break; } - else break; + DF->Detach(); } } -void searchLoopVector(DFHack::ContextManager & DFMgr, vector & ranges, uint32_t element_size) +void searchLoopVector(DFHack::ContextManager & DFMgr, vector & ranges ) { - vecTriplet load; + int element_size; + do + { + getNumber("Select searched vector item size in bytes",element_size, 4); + } while (element_size < 1); + uint32_t length; vector found; found.reserve(100); - //bool initial = 1; - cout << "search ready - insert vector length" << endl; - string select; - while (1) + while (Incremental(found, "vector length",length,"vector","vectors")) { - cout << ">>"; - std::getline(cin, select); - if(select == "p") - { - cout << "Found vectors:" << endl; - for(int i = 0; i < found.size();i++) - { - cout << hex << "0x" << found[i] << endl; - } - } - else if(sscanf(select.c_str(),"%d", &length) == 1) - { - // refresh the list of processes, get first suitable, attach - DFMgr.Refresh(); - DFHack::Context * DF = DFMgr.getSingleContext(); - DF->Attach(); - - // clear the list of found addresses - found.clear(); - SegmentedFinder sf(ranges,DF); - sf.Find(0,4,found,vectorAll); - sf.Find(length*element_size,4,found,vectorLength); - if( found.size() == 1) - { - cout << "Found an address!" << endl; - cout << hex << "0x" << found[0] << endl; - } - else - cout << "Found " << dec << found.size() << " addresses." << endl; - // detach again - DF->Detach(); - } - else - { - break; - } + DFMgr.Refresh(); + DFHack::Context * DF = DFMgr.getSingleContext(); + DF->Attach(); + SegmentedFinder sf(ranges,DF); + sf.Find(0,4,found,vectorAll); + sf.Find(length * element_size,4,found,vectorLength); + DF->Detach(); } } void searchLoopStrObjVector(DFHack::ContextManager & DFMgr, vector & ranges) { vector found; - cout << "search ready - insert string" << endl; string select; - while (1) + while (Incremental(found, "raw name",select,"vector","vectors")) { - cout << ">>"; - std::getline(cin, select); - if(select == "p") - { - cout << "Found vectors:" << endl; - for(int i = 0; i < found.size();i++) - { - cout << hex << "0x" << found[i] << endl; - } - } - else if(!select.empty()) - { - // refresh the list of processes, get first suitable, attach - DFMgr.Refresh(); - DFHack::Context * DF = DFMgr.getSingleContext(); - DF->Attach(); - - // clear the list of found addresses - found.clear(); - SegmentedFinder sf(ranges,DF); - sf.Find(0,4,found, vectorAll); - sf.Find(select.c_str(),4,found, vectorString); - if( found.size() == 1) - { - cout << "Found an address!" << endl; - cout << hex << "0x" << found[0] << endl; - } - else - cout << "Found " << dec << found.size() << " addresses." << endl; - // detach again - DF->Detach(); - } - else - { - break; - } + // 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(0,4,found, vectorAll); + sf.Find(select.c_str(),4,found, vectorString); + DF->Detach(); } } void searchLoopStr(DFHack::ContextManager & DFMgr, vector & ranges) { vector found; - cout << "search ready - insert string" << endl; string select; - while (1) + while (Incremental(found,"string",select,"string","strings")) { - cout << ">>"; - std::getline(cin, select); - if(select == "p") - { - cout << "Found strings:" << endl; - for(int i = 0; i < found.size();i++) - { - cout << hex << "0x" << found[i] << endl; - } - } - else if(!select.empty()) - { - // refresh the list of processes, get first suitable, attach - DFMgr.Refresh(); - DFHack::Context * DF = DFMgr.getSingleContext(); - DF->Attach(); + DFMgr.Refresh(); + DFHack::Context * DF = DFMgr.getSingleContext(); + DF->Attach(); + SegmentedFinder sf(ranges,DF); + sf.Find< const char * ,uint32_t>(select.c_str(),1,found, findString); + DF->Detach(); + } +} - // clear the list of found addresses - found.clear(); - SegmentedFinder sf(ranges,DF); - sf.Find< const char * ,uint32_t>(select.c_str(),1,found, findString); - if( found.size() == 1) - { - cout << "Found a string!" << endl; - cout << hex << "0x" << found[0] << endl; - } - else - cout << "Found " << dec << found.size() << " strings." << endl; - // detach again - DF->Detach(); - } - else +void automatedLangtables(DFHack::Context * DF, vector & ranges) +{ + vector allVectors; + vector to_filter; + uint64_t kulet_vector; + uint64_t word_table_offset; + uint64_t DWARF_vector; + uint64_t DWARF_object; + SegmentedFinder sf(ranges, DF); + + // enumerate all vectors + sf.Find(0,4,allVectors, vectorAll); + + // find lang vector (neutral word table) + to_filter = allVectors; + sf.Find("ABBEY",4,to_filter, vectorString); + uint64_t lang_addr = to_filter[0]; + + // find dwarven language word table + to_filter = allVectors; + sf.Find("kulet",4,to_filter, vectorString); + kulet_vector = to_filter[0]; + + // find vector of languages + to_filter = allVectors; + sf.Find("DWARF",4,to_filter, vectorString); + + // verify + for(int i = 0; i < to_filter.size(); i++) + { + vecTriplet * vec = sf.Translate(to_filter[i]); + if(((vec->finish - vec->start) / 4) == 4) // verified { + DWARF_vector = to_filter[i]; + DWARF_object = sf.Read(vec->start); + // compute word table offset from dwarf word table and dwarf language object addresses + word_table_offset = kulet_vector - DWARF_object; break; } } + cout << "translation vector: " << hex << "0x" << DWARF_vector << endl; + cout << "lang vector: " << hex << "0x" << lang_addr << endl; + cout << "word table offset: " << hex << "0x" << word_table_offset << endl; } - -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; -} int main (void) { string select; @@ -426,205 +338,40 @@ int main (void) return 1; } DFHack::Process * p = DF->getProcess(); - vector ranges; vector selected_ranges; - p->getMemRanges(ranges); - cout << "Which range to search? (default is 1-4)" << endl; - for(int i = 0; i< ranges.size();i++) - { - cout << dec << "(" << i << ") "; - printRange(&(ranges[i])); - } + getRanges(p,selected_ranges); - try_again_ranges: - cout << ">>"; - std::getline(cin, select); - int start, end; - if(select.empty()) - { - // 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::memory_info::OS_WINDOWS) - { - start = min(11, (int)ranges.size()); - end = min(14, (int)ranges.size()); - } - else if(p->getDescriptor()->getOS() == DFHack::memory_info::OS_LINUX) - { - start = min(11, (int)ranges.size()); - end = min(14, (int)ranges.size()); - } - else - { - start = 1; - end = 1; - } - } - // I like the C variants here. much less object clutter - else if(sscanf(select.c_str(), "%d-%d", &start, &end) == 2) - { - start = min(start, (int)ranges.size()); - end = min(end, (int)ranges.size()); - } - else - { - goto try_again_ranges; // yes, this is a goto. bite me. - } - end++; - cout << "selected ranges:" <object>string, 4=string, 5=automated lang tables" << endl; - cout << ">>"; - std::getline(cin, select); + string prompt = + "Select search type: 1=number(default), 2=vector by length, 3=vector>object>string,\n" + " 4=string, 5=automated lang tables, 6=vector by address in its array,\n" + " 7=pointer vector by address of an object, 8=vector>first object>string\n"; int mode; - if(select.empty()) - { - mode = 1; - } - else if( sscanf(select.c_str(), "%d", &mode) == 1 ) + do { - if(mode != 1 && mode != 2 && mode != 3 && mode != 4 && mode != 5) - { - goto try_again_type; - } - } - else + getNumber(prompt,mode, 1, false); + } while (mode < 1 || mode > 8 ); + switch (mode) { - goto try_again_type; - } - - if(mode == 1) - { - // input / validation of variable size - try_again_size: - cout << "Select searched variable size (1,2,4 bytes, default is 4)" << endl; - cout << ">>"; - std::getline(cin, select); - int size; - if(select.empty()) - { - size = 4; - } - else if( sscanf(select.c_str(), "%d", &size) == 1 ) - { - if(/*size != 8 &&*/ size != 4 && size != 2 && size != 1) - { - goto try_again_size; - } - } - else - { - goto try_again_size; - } - - // input / validation of variable alignment (default is to use the same alignment as size) - try_again_align: - cout << "Variable alignment (1,2,4 bytes, default is " << size << ")" << endl; - cout << ">>"; - std::getline(cin, select); - int alignment = size; - if(select.empty()) - { - alignment = size; - } - else if( sscanf(select.c_str(), "%d", &alignment) == 1 ) - { - if(/*alignment != 8 &&*/ alignment != 4 && alignment != 2 && alignment != 1) - { - goto try_again_align; - } - } - else - { - goto try_again_align; - } - // we detach, searchLoop looks for the process again. - DF->Detach(); - searchLoop(DFMgr, selected_ranges, size, alignment); - } - else if(mode == 2)// vector - { - // input / validation of variable size - try_again_vsize: - cout << "Select searched vector item size (in bytes, default is 4)" << endl; - cout << ">>"; - std::getline(cin, select); - uint32_t size; - if(select.empty()) - { - size = 4; - } - else if( sscanf(select.c_str(), "%d", &size) == 1 ) - { - if(size == 0) - { - goto try_again_vsize; - } - } - else - { - goto try_again_vsize; - } - // we detach, searchLoop looks for the process again. - DF->Detach(); - searchLoopVector(DFMgr, selected_ranges,size); - } - else if(mode == 3)// vector>object>string - { - searchLoopStrObjVector(DFMgr, selected_ranges); - } - else if(mode == 4)// string - { - searchLoopStr(DFMgr, selected_ranges); - } - else if(mode == 5) // find lang tables and stuff - { - vector allVectors; - vector to_filter; - uint64_t kulet_vector; - uint64_t word_table_offset; - uint64_t DWARF_vector; - uint64_t DWARF_object; - SegmentedFinder sf(selected_ranges, DF); - - // enumerate all vectors - sf.Find(0,4,allVectors, vectorAll); - - // find lang vector (neutral word table) - to_filter = allVectors; - sf.Find("ABBEY",4,to_filter, vectorString); - uint64_t lang_addr = to_filter[0]; - - // find dwarven language word table - to_filter = allVectors; - sf.Find("kulet",4,to_filter, vectorString); - kulet_vector = to_filter[0]; - - // find vector of languages - to_filter = allVectors; - sf.Find("DWARF",4,to_filter, vectorString); - - // verify - for(int i = 0; i < to_filter.size(); i++) - { - vecTriplet * vec = sf.Translate(to_filter[i]); - if(((vec->finish - vec->start) / 4) == 4) // verified - { - DWARF_vector = to_filter[i]; - DWARF_object = sf.Read(vec->start); - // compute word table offset from dwarf word table and dwarf language object addresses - word_table_offset = kulet_vector - DWARF_object; - break; - } - } - cout << "translation vector: " << hex << "0x" << DWARF_vector << endl; - cout << "lang vector: " << hex << "0x" << lang_addr << endl; - cout << "word table offset: " << hex << "0x" << word_table_offset << endl; + case 1:// integers + searchLoop(DFMgr, selected_ranges); + break; + case 2:// vector by length and item size + searchLoopVector(DFMgr, selected_ranges); + break; + case 3:// vector>object>string + searchLoopStrObjVector(DFMgr, selected_ranges); + break; + case 4:// string + searchLoopStr(DFMgr, selected_ranges); + break; + case 5: + automatedLangtables(DF,selected_ranges); + break; + case 6: + case 7: + case 8: + default: + cout << "not implemented :(" << endl; } #ifndef LINUX_BUILD cout << "Done. Press any key to continue" << endl;