Improve disassembler configuration and lifecycle management
Co-authored-by: mr.exodia.tpodt <mr.exodia.tpodt@gmail.com>
This commit is contained in:
parent
98291b35b7
commit
ad8cc1f4e8
|
@ -3,6 +3,7 @@
|
|||
#include "QZydis.h"
|
||||
#include "main.h"
|
||||
#include "Exports.h"
|
||||
#include "Configuration.h"
|
||||
|
||||
#include "ReferenceManager.h"
|
||||
#include "SymbolView.h"
|
||||
|
@ -203,7 +204,11 @@ Bridge::Bridge(QObject* parent) : QObject(parent)
|
|||
mResultEvents[i] = CreateEventW(nullptr, true, true, nullptr);
|
||||
mMainThreadId = GetCurrentThreadId();
|
||||
|
||||
// Initialize QZydis disassembler
|
||||
mDisasm = new QZydis(int(ConfigUint("Disassembler", "MaxModuleSize")), Bridge::getArchitecture());
|
||||
|
||||
connect(this, &Bridge::throttleUpdate, this, &Bridge::throttleUpdateSlot);
|
||||
connect(Config(), SIGNAL(tokenizerConfigUpdated()), this, SLOT(configUpdatedSlot()));
|
||||
}
|
||||
|
||||
Bridge::~Bridge()
|
||||
|
@ -211,6 +216,7 @@ Bridge::~Bridge()
|
|||
EnterCriticalSection(&mCsBridge);
|
||||
for(size_t i = 0; i < BridgeResult::Last; i++)
|
||||
CloseHandle(mResultEvents[i]);
|
||||
delete mDisasm;
|
||||
DeleteCriticalSection(&mCsBridge);
|
||||
}
|
||||
|
||||
|
@ -276,6 +282,15 @@ void Bridge::setDbgStopped()
|
|||
mDbgStopped = true;
|
||||
}
|
||||
|
||||
void Bridge::configUpdatedSlot()
|
||||
{
|
||||
if(mDisasm)
|
||||
{
|
||||
mDisasm->UpdateConfig();
|
||||
mDisasm->UpdateArchitecture();
|
||||
}
|
||||
}
|
||||
|
||||
/************************************************************************************
|
||||
Message processing
|
||||
************************************************************************************/
|
||||
|
@ -520,13 +535,12 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
{
|
||||
duint parVA = (duint)param1;
|
||||
char* text = (char*)param2;
|
||||
if(!text || !parVA || !DbgIsDebugging())
|
||||
if(!text || !parVA || !DbgIsDebugging() || !mDisasm)
|
||||
return 0;
|
||||
byte_t buffer[16];
|
||||
if(!DbgMemRead(parVA, buffer, 16))
|
||||
return 0;
|
||||
QZydis disasm(int(ConfigUint("Disassembler", "MaxModuleSize")), Bridge::getArchitecture());
|
||||
Instruction_t instr = disasm.DisassembleAt(buffer, 16, 0, parVA);
|
||||
Instruction_t instr = mDisasm->DisassembleAt(buffer, 16, 0, parVA);
|
||||
QString finalInstruction;
|
||||
for(const auto & curToken : instr.tokens.tokens)
|
||||
finalInstruction += curToken.text;
|
||||
|
|
|
@ -18,6 +18,7 @@ namespace Qt
|
|||
|
||||
class ReferenceManager;
|
||||
class SymbolView;
|
||||
class QZydis;
|
||||
|
||||
class Bridge : public QObject
|
||||
{
|
||||
|
@ -29,6 +30,7 @@ class Bridge : public QObject
|
|||
|
||||
private slots:
|
||||
void throttleUpdateSlot(GUIMSG msg);
|
||||
void configUpdatedSlot();
|
||||
|
||||
public:
|
||||
explicit Bridge(QObject* parent = nullptr);
|
||||
|
@ -202,4 +204,5 @@ private:
|
|||
volatile bool mDbgStopped = false;
|
||||
QMap<GUIMSG, DWORD> mLastUpdates;
|
||||
QMap<GUIMSG, QTimer*> mUpdateTimers;
|
||||
QZydis* mDisasm = nullptr;
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue