X-Git-Url: https://git.siccegge.de//index.cgi?p=frida%2Ffrida.git;a=blobdiff_plain;f=src%2Fcore%2FInformationManager.cxx;h=73ea5ef1cda9bfdb61fda0fe59e807ed7d11d524;hp=294dc2f53583b7e3a9c5ce6b8f33fd49427bf058;hb=efaafdaf4a18b5f2f4dd743aa3f0e609d428b15a;hpb=0daf9a157f3d41690cf4a0287db1adecc4ad0b71 diff --git a/src/core/InformationManager.cxx b/src/core/InformationManager.cxx index 294dc2f..73ea5ef 100644 --- a/src/core/InformationManager.cxx +++ b/src/core/InformationManager.cxx @@ -8,6 +8,10 @@ #include #include +InformationManager::InformationManager() + : logger(log4cxx::Logger::getLogger("InformationManager")) +{} + InformationManager::~InformationManager() { for (auto b : blocks) delete b.second; @@ -17,6 +21,7 @@ InformationManager::~InformationManager() { } void InformationManager::reset(const std::string& filename) { + this->filename = filename; disassembler.reset(createLLVMDisassembler(filename, this)); if (disassembler.get() != NULL) disassembler.get()->start(); @@ -28,6 +33,20 @@ void InformationManager::save(const QString& filename) { zip.setComment("FRIDA 0.0"); QuaZipFile outZipFile(&zip); + { + QFile binary(this->filename.c_str()); + binary.open(QIODevice::ReadOnly); + QuaZipNewInfo zipinfo("binary"); + zipinfo.setPermissions(static_cast(0x6444)); + outZipFile.open(QIODevice::WriteOnly, zipinfo); + QByteArray buffer; + while (!binary.atEnd()) { + buffer = binary.read(4096); + outZipFile.write(buffer); + } + outZipFile.close(); + } + for (auto funpair : functions) { Function* fun = funpair.second; QuaZipNewInfo zipinfo(fun->getName().c_str()); @@ -37,23 +56,9 @@ void InformationManager::save(const QString& filename) { stream.setAutoFormatting(true); stream.setAutoFormattingIndent(-1); stream.writeStartDocument(); - stream.writeStartElement("function"); - stream.writeAttribute("name", fun->getName().c_str()); - stream.writeAttribute("entry", QString::number(fun->getStartAddress(), 16)); - - for (auto& blockentry : fun->blocks()) { - stream.writeStartElement("block"); - stream.writeAttribute("id", blockentry.second->getName().c_str()); - stream.writeTextElement("start", QString::number(blockentry.second->getStartAddress(), 16)); - stream.writeTextElement("end", QString::number(blockentry.second->getEndAddress(), 16)); - if (0 != blockentry.second->getNextBlock(0)) - stream.writeTextElement("next", QString::number(blockentry.second->getNextBlock(0), 16)); - if (0 != blockentry.second->getNextBlock(1)) - stream.writeTextElement("next", QString::number(blockentry.second->getNextBlock(1), 16)); - stream.writeEndElement(); // "block" - } - stream.writeEndElement(); // "function" + fun->serialize(stream); + stream.writeEndDocument(); outZipFile.close(); } @@ -101,6 +106,7 @@ Comment* InformationManager::newLocalComment(uint64_t address, Function* f) { } void InformationManager::finishFunction(Function* fun) { + LOG4CXX_DEBUG(logger, "Finishing function " << fun->getName()); for (auto b : fun->blocks()) { BasicBlock* bl = b.second; blocks.insert(std::make_pair(bl->getStartAddress(), bl));