cutter/src/AnalTask.cpp

103 lines
2.5 KiB
C++
Raw Normal View History

2018-03-04 17:42:02 +00:00
#include "Cutter.h"
2018-05-26 18:09:20 +00:00
#include "AnalTask.h"
2017-10-01 19:09:42 +00:00
#include "MainWindow.h"
#include "dialogs/OptionsDialog.h"
#include <QJsonArray>
2018-05-05 13:20:14 +00:00
#include <QDebug>
#include <QCheckBox>
AnalTask::AnalTask(QObject *parent) :
AsyncTask(parent)
{
}
2018-05-26 18:09:20 +00:00
AnalTask::~AnalTask()
{
}
2018-05-26 18:09:20 +00:00
void AnalTask::interrupt()
{
2018-05-26 18:09:20 +00:00
AsyncTask::interrupt();
r_cons_singleton()->breaked = true;
}
2018-05-26 18:09:20 +00:00
void AnalTask::runTask()
{
2018-05-26 18:49:57 +00:00
log(tr("Loading Binary...\n"));
Core()->setCPU(options.arch, options.cpu, options.bits);
2018-02-27 10:20:48 +00:00
int perms = R_IO_READ | R_IO_EXEC;
if (options.writeEnabled)
2018-02-27 10:20:48 +00:00
perms |= R_IO_WRITE;
2018-05-05 13:20:14 +00:00
// Demangle (must be before file Core()->loadFile)
Core()->setConfig("bin.demangle", options.demangle);
2018-05-05 13:20:14 +00:00
// Do not reload the file if already loaded
QJsonArray openedFiles = Core()->getOpenedFiles();
2018-03-21 20:32:32 +00:00
if (!openedFiles.size()) {
bool fileLoaded = Core()->loadFile(options.filename,
options.binLoadAddr,
options.mapAddr,
perms,
options.useVA,
options.loadBinInfo,
options.forceBinPlugin);
if (!fileLoaded) {
// Something wrong happened, fallback to open dialog
emit openFileFailed();
2018-05-26 18:09:20 +00:00
AsyncTask::interrupt();
return;
}
}
2018-05-27 19:49:14 +00:00
if (isInterrupted()) {
return;
}
if (!options.os.isNull()) {
Core()->cmd("e asm.os=" + options.os);
}
2018-05-05 13:20:14 +00:00
// Load PDB and/or scripts
if (!options.pdbFile.isNull()) {
Core()->loadPDB(options.pdbFile);
}
2018-05-27 19:49:14 +00:00
if (isInterrupted()) {
return;
}
if (!options.script.isNull()) {
Core()->loadScript(options.script);
}
2018-05-27 19:49:14 +00:00
if (isInterrupted()) {
return;
}
if (options.endian != InitialOptions::Endianness::Auto) {
Core()->setEndianness(options.endian == InitialOptions::Endianness::Big);
}
Core()->setBBSize(options.bbsize);
2018-05-05 13:20:14 +00:00
// Use prj.simple as default as long as regular projects are broken
Core()->setConfig("prj.simple", true);
2018-05-27 19:38:19 +00:00
if (!options.analCmd.empty()) {
log(tr("Analyzing...\n"));
for (QString cmd : options.analCmd) {
if (isInterrupted()) {
return;
}
log(" " + tr("Running") + " " + cmd + "\n");
Core()->cmd(cmd);
}
log(tr("Analysis complete!\n"));
} else {
log(tr("Skipping Analysis.\n"));
}
}