GUI: refactor BridgeResult and fix a bunch of bugs in the process
This commit is contained in:
parent
c345647e85
commit
3dc120d623
|
@ -18,14 +18,16 @@ static Bridge* mBridge;
|
|||
Bridge::Bridge(QObject* parent) : QObject(parent)
|
||||
{
|
||||
InitializeCriticalSection(&csBridge);
|
||||
hResultEvent = CreateEventW(nullptr, true, true, nullptr);;
|
||||
for(size_t i = 0; i < BridgeResult::Last; i++)
|
||||
resultEvents[i] = CreateEventW(nullptr, true, true, nullptr);
|
||||
dwMainThreadId = GetCurrentThreadId();
|
||||
}
|
||||
|
||||
Bridge::~Bridge()
|
||||
{
|
||||
CloseHandle(hResultEvent);
|
||||
EnterCriticalSection(&csBridge);
|
||||
for(size_t i = 0; i < BridgeResult::Last; i++)
|
||||
CloseHandle(resultEvents[i]);
|
||||
DeleteCriticalSection(&csBridge);
|
||||
}
|
||||
|
||||
|
@ -48,10 +50,13 @@ void Bridge::CopyToClipboard(const QString & text, const QString & htmlText)
|
|||
GuiAddStatusBarMessage(tr("The data has been copied to clipboard.\n").toUtf8().constData());
|
||||
}
|
||||
|
||||
void Bridge::setResult(dsint result)
|
||||
void Bridge::setResult(BridgeResult::Type type, dsint result)
|
||||
{
|
||||
bridgeResult = result;
|
||||
SetEvent(hResultEvent);
|
||||
#ifdef DEBUG
|
||||
OutputDebugStringA(QString().sprintf("[x64dbg] [%u] Bridge::setResult(%d, %p)\n", GetCurrentThreadId(), type, result).toUtf8().constData());
|
||||
#endif //DEBUG
|
||||
bridgeResults[type] = result;
|
||||
SetEvent(resultEvents[type]);
|
||||
}
|
||||
|
||||
/************************************************************************************
|
||||
|
@ -73,7 +78,7 @@ void Bridge::initBridge()
|
|||
|
||||
void Bridge::emitMenuAddToList(QWidget* parent, QMenu* menu, int hMenu, int hParentMenu)
|
||||
{
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::MenuAddToList);
|
||||
emit menuAddMenuToList(parent, menu, hMenu, hParentMenu);
|
||||
result.Wait();
|
||||
}
|
||||
|
@ -140,7 +145,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
|
||||
case GUI_SCRIPT_ADD:
|
||||
{
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::ScriptAdd);
|
||||
emit scriptAdd((int)param1, (const char**)param2);
|
||||
result.Wait();
|
||||
}
|
||||
|
@ -156,7 +161,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
|
||||
case GUI_SCRIPT_ERROR:
|
||||
{
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::ScriptMessage);
|
||||
emit scriptError((int)param1, QString((const char*)param2));
|
||||
result.Wait();
|
||||
}
|
||||
|
@ -172,7 +177,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
|
||||
case GUI_SCRIPT_MESSAGE:
|
||||
{
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::ScriptMessage);
|
||||
emit scriptMessage(QString((const char*)param1));
|
||||
result.Wait();
|
||||
}
|
||||
|
@ -180,7 +185,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
|
||||
case GUI_SCRIPT_MSGYN:
|
||||
{
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::ScriptMessage);
|
||||
emit scriptQuestion(QString((const char*)param1));
|
||||
return (void*)result.Wait();
|
||||
}
|
||||
|
@ -280,7 +285,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
|
||||
case GUI_REF_INITIALIZE:
|
||||
{
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::RefInitialize);
|
||||
emit referenceInitialize(QString((const char*)param1));
|
||||
result.Wait();
|
||||
}
|
||||
|
@ -331,7 +336,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
|
||||
case GUI_MENU_ADD:
|
||||
{
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::MenuAdd);
|
||||
emit menuAddMenu((int)param1, QString((const char*)param2));
|
||||
return (void*)result.Wait();
|
||||
}
|
||||
|
@ -339,7 +344,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
|
||||
case GUI_MENU_ADD_ENTRY:
|
||||
{
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::MenuAddEntry);
|
||||
emit menuAddMenuEntry((int)param1, QString((const char*)param2));
|
||||
return (void*)result.Wait();
|
||||
}
|
||||
|
@ -347,7 +352,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
|
||||
case GUI_MENU_ADD_SEPARATOR:
|
||||
{
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::MenuAddSeparator);
|
||||
emit menuAddSeparator((int)param1);
|
||||
result.Wait();
|
||||
}
|
||||
|
@ -355,7 +360,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
|
||||
case GUI_MENU_CLEAR:
|
||||
{
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::MenuClear);
|
||||
emit menuClearMenu((int)param1, false);
|
||||
result.Wait();
|
||||
}
|
||||
|
@ -363,7 +368,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
|
||||
case GUI_MENU_REMOVE:
|
||||
{
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::MenuRemove);
|
||||
emit menuRemoveMenuEntry((int)param1);
|
||||
result.Wait();
|
||||
}
|
||||
|
@ -375,7 +380,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
SELECTIONDATA* selection = (SELECTIONDATA*)param2;
|
||||
if(!DbgIsDebugging())
|
||||
return (void*)false;
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::SelectionGet);
|
||||
switch(hWindow)
|
||||
{
|
||||
case GUI_DISASSEMBLY:
|
||||
|
@ -416,7 +421,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
const SELECTIONDATA* selection = (const SELECTIONDATA*)param2;
|
||||
if(!DbgIsDebugging())
|
||||
return (void*)false;
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::SelectionSet);
|
||||
switch(hWindow)
|
||||
{
|
||||
case GUI_DISASSEMBLY:
|
||||
|
@ -438,7 +443,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
case GUI_GETLINE_WINDOW:
|
||||
{
|
||||
QString text = "";
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::GetlineWindow);
|
||||
emit getStrWindow(QString((const char*)param1), &text);
|
||||
if(result.Wait())
|
||||
{
|
||||
|
@ -497,7 +502,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
{
|
||||
int hMenu = (int)param1;
|
||||
const ICONDATA* icon = (const ICONDATA*)param2;
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::MenuSetIcon);
|
||||
if(!icon)
|
||||
emit setIconMenu(hMenu, QIcon());
|
||||
else
|
||||
|
@ -515,7 +520,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
{
|
||||
int hEntry = (int)param1;
|
||||
const ICONDATA* icon = (const ICONDATA*)param2;
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::MenuSetEntryIcon);
|
||||
if(!icon)
|
||||
emit setIconMenuEntry(hEntry, QIcon());
|
||||
else
|
||||
|
@ -531,7 +536,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
|
||||
case GUI_MENU_SET_ENTRY_CHECKED:
|
||||
{
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::MenuSetEntryChecked);
|
||||
emit setCheckedMenuEntry(int(param1), bool(param2));
|
||||
result.Wait();
|
||||
}
|
||||
|
@ -539,7 +544,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
|
||||
case GUI_MENU_SET_VISIBLE:
|
||||
{
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::MenuSetVisible);
|
||||
emit setVisibleMenu(int(param1), bool(param2));
|
||||
result.Wait();
|
||||
}
|
||||
|
@ -547,7 +552,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
|
||||
case GUI_MENU_SET_ENTRY_VISIBLE:
|
||||
{
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::MenuSetEntryVisible);
|
||||
emit setVisibleMenuEntry(int(param1), bool(param2));
|
||||
result.Wait();
|
||||
}
|
||||
|
@ -555,7 +560,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
|
||||
case GUI_MENU_SET_NAME:
|
||||
{
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::MenuSetName);
|
||||
emit setNameMenu(int(param1), QString((const char*)param2));
|
||||
result.Wait();
|
||||
}
|
||||
|
@ -563,7 +568,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
|
||||
case GUI_MENU_SET_ENTRY_NAME:
|
||||
{
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::MenuSetEntryName);
|
||||
emit setNameMenuEntry(int(param1), QString((const char*)param2));
|
||||
result.Wait();
|
||||
}
|
||||
|
@ -603,7 +608,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
|
||||
case GUI_GET_GLOBAL_NOTES:
|
||||
{
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::GetGlobalNotes);
|
||||
emit getGlobalNotes(param1);
|
||||
result.Wait();
|
||||
}
|
||||
|
@ -618,7 +623,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
|
||||
case GUI_GET_DEBUGGEE_NOTES:
|
||||
{
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::GetDebuggeeNotes);
|
||||
emit getDebuggeeNotes(param1);
|
||||
result.Wait();
|
||||
}
|
||||
|
@ -638,7 +643,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
|
||||
case GUI_REGISTER_SCRIPT_LANG:
|
||||
{
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::RegisterScriptLang);
|
||||
emit registerScriptLang((SCRIPTTYPEINFO*)param1);
|
||||
result.Wait();
|
||||
}
|
||||
|
@ -684,7 +689,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
|
||||
case GUI_LOAD_GRAPH:
|
||||
{
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::LoadGraph);
|
||||
emit loadGraph((BridgeCFGraphList*)param1, duint(param2));
|
||||
return (void*)result.Wait();
|
||||
}
|
||||
|
@ -692,7 +697,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
|
||||
case GUI_GRAPH_AT:
|
||||
{
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::GraphAt);
|
||||
emit graphAt(duint(param1));
|
||||
return (void*)result.Wait();
|
||||
}
|
||||
|
@ -757,7 +762,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
{
|
||||
if(param1)
|
||||
{
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::GetActiveView);
|
||||
emit getActiveView((ACTIVEVIEW*)param1);
|
||||
result.Wait();
|
||||
}
|
||||
|
@ -779,7 +784,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
|
||||
case GUI_TYPE_ADDNODE:
|
||||
{
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::TypeAddNode);
|
||||
emit typeAddNode(param1, (const TYPEDESCRIPTOR*)param2);
|
||||
return (void*)result.Wait();
|
||||
}
|
||||
|
@ -787,7 +792,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
|
||||
case GUI_TYPE_CLEAR:
|
||||
{
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::TypeClear);
|
||||
emit typeClear();
|
||||
result.Wait();
|
||||
}
|
||||
|
@ -807,7 +812,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
|||
|
||||
case GUI_MENU_SET_ENTRY_HOTKEY:
|
||||
{
|
||||
BridgeResult result;
|
||||
BridgeResult result(BridgeResult::MenuSetEntryHotkey);
|
||||
auto params = QString((const char*)param2).split('\1');
|
||||
if(params.length() == 2)
|
||||
{
|
||||
|
|
|
@ -33,7 +33,7 @@ public:
|
|||
static void CopyToClipboard(const QString & text, const QString & htmlText);
|
||||
|
||||
//result function
|
||||
void setResult(dsint result = 0);
|
||||
void setResult(BridgeResult::Type type, dsint result = 0);
|
||||
|
||||
//helper functions
|
||||
void emitMenuAddToList(QWidget* parent, QMenu* menu, int hMenu, int hParentMenu = -1);
|
||||
|
@ -164,9 +164,9 @@ signals:
|
|||
|
||||
private:
|
||||
CRITICAL_SECTION csBridge;
|
||||
HANDLE hResultEvent;
|
||||
HANDLE resultEvents[BridgeResult::Last];
|
||||
duint bridgeResults[BridgeResult::Last];
|
||||
DWORD dwMainThreadId = 0;
|
||||
dsint bridgeResult = 0;
|
||||
volatile bool dbgStopped = false;
|
||||
};
|
||||
|
||||
|
|
|
@ -2,24 +2,40 @@
|
|||
#include "Bridge.h"
|
||||
#include <QCoreApplication>
|
||||
|
||||
BridgeResult::BridgeResult()
|
||||
BridgeResult::BridgeResult(Type type)
|
||||
: mType(type)
|
||||
{
|
||||
EnterCriticalSection(&Bridge::getBridge()->csBridge);
|
||||
ResetEvent(Bridge::getBridge()->hResultEvent);
|
||||
Bridge* bridge = Bridge::getBridge();
|
||||
EnterCriticalSection(&bridge->csBridge);
|
||||
#ifdef DEBUG
|
||||
OutputDebugStringA(QString().sprintf("[x64dbg] [%u] BridgeResult(%d)\n", GetCurrentThreadId(), type).toUtf8().constData());
|
||||
#endif //DEBUG
|
||||
ResetEvent(bridge->resultEvents[type]);
|
||||
}
|
||||
|
||||
BridgeResult::~BridgeResult()
|
||||
{
|
||||
#ifdef DEBUG
|
||||
OutputDebugStringA(QString().sprintf("[x64dbg] [%u] ~BridgeResult(%d)\n", GetCurrentThreadId(), mType).toUtf8().constData());
|
||||
#endif //DEBUG
|
||||
LeaveCriticalSection(&Bridge::getBridge()->csBridge);
|
||||
}
|
||||
|
||||
dsint BridgeResult::Wait()
|
||||
{
|
||||
#ifdef DEBUG
|
||||
OutputDebugStringA(QString().sprintf("[x64dbg] [%u] BridgeResult::Wait(%d)\n", GetCurrentThreadId(), mType).toUtf8().constData());
|
||||
#endif //DEBUG
|
||||
Bridge* bridge = Bridge::getBridge();
|
||||
HANDLE hResultEvent = bridge->resultEvents[mType];
|
||||
//Don't freeze when waiting on the main thread (https://github.com/x64dbg/x64dbg/issues/1716)
|
||||
if(GetCurrentThreadId() == Bridge::getBridge()->dwMainThreadId)
|
||||
while(WaitForSingleObject(Bridge::getBridge()->hResultEvent, 10) == WAIT_TIMEOUT)
|
||||
if(GetCurrentThreadId() == bridge->dwMainThreadId)
|
||||
while(WaitForSingleObject(hResultEvent, 10) == WAIT_TIMEOUT)
|
||||
QCoreApplication::processEvents();
|
||||
else
|
||||
WaitForSingleObject(Bridge::getBridge()->hResultEvent, INFINITE);
|
||||
return Bridge::getBridge()->bridgeResult;
|
||||
WaitForSingleObject(hResultEvent, INFINITE);
|
||||
#ifdef DEBUG
|
||||
OutputDebugStringA(QString().sprintf("[x64dbg] [%u] BridgeResult::~Wait(%d)\n", GetCurrentThreadId(), mType).toUtf8().constData());
|
||||
#endif //DEBUG
|
||||
return bridge->bridgeResults[mType];
|
||||
}
|
||||
|
|
|
@ -6,9 +6,43 @@
|
|||
class BridgeResult
|
||||
{
|
||||
public:
|
||||
BridgeResult();
|
||||
enum Type
|
||||
{
|
||||
ScriptAdd,
|
||||
ScriptMessage,
|
||||
RefInitialize,
|
||||
MenuAddToList,
|
||||
MenuAdd,
|
||||
MenuAddEntry,
|
||||
MenuAddSeparator,
|
||||
MenuClear,
|
||||
MenuRemove,
|
||||
SelectionGet,
|
||||
SelectionSet,
|
||||
GetlineWindow,
|
||||
MenuSetIcon,
|
||||
MenuSetEntryIcon,
|
||||
MenuSetEntryChecked,
|
||||
MenuSetVisible,
|
||||
MenuSetEntryVisible,
|
||||
MenuSetName,
|
||||
MenuSetEntryName,
|
||||
GetGlobalNotes,
|
||||
GetDebuggeeNotes,
|
||||
RegisterScriptLang,
|
||||
LoadGraph,
|
||||
GraphAt,
|
||||
GetActiveView,
|
||||
TypeAddNode,
|
||||
TypeClear,
|
||||
MenuSetEntryHotkey,
|
||||
Last,
|
||||
};
|
||||
explicit BridgeResult(Type type);
|
||||
~BridgeResult();
|
||||
dsint Wait();
|
||||
private:
|
||||
Type mType;
|
||||
};
|
||||
|
||||
#endif // BRIDGERESULT_H
|
||||
|
|
|
@ -1268,7 +1268,7 @@ void CPUDisassembly::selectionGetSlot(SELECTIONDATA* selection)
|
|||
{
|
||||
selection->start = rvaToVa(getSelectionStart());
|
||||
selection->end = rvaToVa(getSelectionEnd());
|
||||
Bridge::getBridge()->setResult(1);
|
||||
Bridge::getBridge()->setResult(BridgeResult::SelectionGet, 1);
|
||||
}
|
||||
|
||||
void CPUDisassembly::selectionSetSlot(const SELECTIONDATA* selection)
|
||||
|
@ -1279,13 +1279,13 @@ void CPUDisassembly::selectionSetSlot(const SELECTIONDATA* selection)
|
|||
dsint end = selection->end;
|
||||
if(start < selMin || start >= selMax || end < selMin || end >= selMax) //selection out of range
|
||||
{
|
||||
Bridge::getBridge()->setResult(0);
|
||||
Bridge::getBridge()->setResult(BridgeResult::SelectionSet, 0);
|
||||
return;
|
||||
}
|
||||
setSingleSelection(start - selMin);
|
||||
expandSelectionUpTo(end - selMin);
|
||||
reloadData();
|
||||
Bridge::getBridge()->setResult(1);
|
||||
Bridge::getBridge()->setResult(BridgeResult::SelectionSet, 1);
|
||||
}
|
||||
|
||||
void CPUDisassembly::selectionUpdatedSlot()
|
||||
|
|
|
@ -1360,7 +1360,7 @@ void CPUDump::selectionGet(SELECTIONDATA* selection)
|
|||
{
|
||||
selection->start = rvaToVa(getSelectionStart());
|
||||
selection->end = rvaToVa(getSelectionEnd());
|
||||
Bridge::getBridge()->setResult(1);
|
||||
Bridge::getBridge()->setResult(BridgeResult::SelectionGet, 1);
|
||||
}
|
||||
|
||||
void CPUDump::selectionSet(const SELECTIONDATA* selection)
|
||||
|
@ -1371,13 +1371,13 @@ void CPUDump::selectionSet(const SELECTIONDATA* selection)
|
|||
dsint end = selection->end;
|
||||
if(start < selMin || start >= selMax || end < selMin || end >= selMax) //selection out of range
|
||||
{
|
||||
Bridge::getBridge()->setResult(0);
|
||||
Bridge::getBridge()->setResult(BridgeResult::SelectionSet, 0);
|
||||
return;
|
||||
}
|
||||
setSingleSelection(start - selMin);
|
||||
expandSelectionUpTo(end - selMin);
|
||||
reloadData();
|
||||
Bridge::getBridge()->setResult(1);
|
||||
Bridge::getBridge()->setResult(BridgeResult::SelectionSet, 1);
|
||||
}
|
||||
|
||||
void CPUDump::memoryAccessSingleshootSlot()
|
||||
|
|
|
@ -664,7 +664,7 @@ void CPUStack::selectionGet(SELECTIONDATA* selection)
|
|||
{
|
||||
selection->start = rvaToVa(getSelectionStart());
|
||||
selection->end = rvaToVa(getSelectionEnd());
|
||||
Bridge::getBridge()->setResult(1);
|
||||
Bridge::getBridge()->setResult(BridgeResult::SelectionGet, 1);
|
||||
}
|
||||
|
||||
void CPUStack::selectionSet(const SELECTIONDATA* selection)
|
||||
|
@ -675,13 +675,13 @@ void CPUStack::selectionSet(const SELECTIONDATA* selection)
|
|||
dsint end = selection->end;
|
||||
if(start < selMin || start >= selMax || end < selMin || end >= selMax) //selection out of range
|
||||
{
|
||||
Bridge::getBridge()->setResult(0);
|
||||
Bridge::getBridge()->setResult(BridgeResult::SelectionSet, 0);
|
||||
return;
|
||||
}
|
||||
setSingleSelection(start - selMin);
|
||||
expandSelectionUpTo(end - selMin);
|
||||
reloadData();
|
||||
Bridge::getBridge()->setResult(1);
|
||||
Bridge::getBridge()->setResult(BridgeResult::SelectionSet, 1);
|
||||
}
|
||||
void CPUStack::selectionUpdatedSlot()
|
||||
{
|
||||
|
|
|
@ -214,7 +214,7 @@ void CommandLineEdit::registerScriptType(SCRIPTTYPEINFO* info)
|
|||
// Must be valid pointer
|
||||
if(!info)
|
||||
{
|
||||
Bridge::getBridge()->setResult(0);
|
||||
Bridge::getBridge()->setResult(BridgeResult::RegisterScriptLang, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -232,7 +232,7 @@ void CommandLineEdit::registerScriptType(SCRIPTTYPEINFO* info)
|
|||
if(BridgeSettingGet("Gui", "ScriptType", savedType) && strcmp(info->name, savedType) == 0)
|
||||
mCmdScriptType->setCurrentIndex(info->id);
|
||||
|
||||
Bridge::getBridge()->setResult(1);
|
||||
Bridge::getBridge()->setResult(BridgeResult::RegisterScriptLang, 1);
|
||||
}
|
||||
|
||||
void CommandLineEdit::unregisterScriptType(int id)
|
||||
|
|
|
@ -2071,7 +2071,7 @@ void DisassemblerGraphView::loadGraphSlot(BridgeCFGraphList* graphList, duint ad
|
|||
auto message = tr("The graph you are trying to render has a large number of nodes (%1). This can cause x64dbg to hang or crash. It is recommended to save your data before you continue.\n\nDo you want to continue rendering this graph?").arg(nodeCount);
|
||||
if(QMessageBox::question(this, title, message, QMessageBox::Yes, QMessageBox::No | QMessageBox::Default) == QMessageBox::No)
|
||||
{
|
||||
Bridge::getBridge()->setResult(0);
|
||||
Bridge::getBridge()->setResult(BridgeResult::LoadGraph, 0);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -2081,12 +2081,12 @@ void DisassemblerGraphView::loadGraphSlot(BridgeCFGraphList* graphList, duint ad
|
|||
this->cur_instr = addr ? addr : this->function;
|
||||
this->forceCenter = true;
|
||||
loadCurrentGraph();
|
||||
Bridge::getBridge()->setResult(1);
|
||||
Bridge::getBridge()->setResult(BridgeResult::LoadGraph, 1);
|
||||
}
|
||||
|
||||
void DisassemblerGraphView::graphAtSlot(duint addr)
|
||||
{
|
||||
Bridge::getBridge()->setResult(this->navigate(addr) ? this->currentGraph.entryPoint : 0);
|
||||
Bridge::getBridge()->setResult(BridgeResult::GraphAt, this->navigate(addr) ? this->currentGraph.entryPoint : 0);
|
||||
}
|
||||
|
||||
void DisassemblerGraphView::updateGraphSlot()
|
||||
|
@ -2367,7 +2367,7 @@ void DisassemblerGraphView::toggleSummarySlot()
|
|||
void DisassemblerGraphView::selectionGetSlot(SELECTIONDATA* selection)
|
||||
{
|
||||
selection->start = selection->end = cur_instr;
|
||||
Bridge::getBridge()->setResult(1);
|
||||
Bridge::getBridge()->setResult(BridgeResult::SelectionGet, 1);
|
||||
}
|
||||
|
||||
void DisassemblerGraphView::disassembleAtSlot(dsint va, dsint cip)
|
||||
|
|
|
@ -80,5 +80,5 @@ void LogStatusLabel::getActiveView(ACTIVEVIEW* active)
|
|||
QWidget* now = QApplication::focusWidget();
|
||||
strncpy_s(active->title, findTitle(now, active->titleHwnd).toUtf8().constData(), _TRUNCATE);
|
||||
strncpy_s(active->className, className(now, active->classHwnd).toUtf8().constData(), _TRUNCATE);
|
||||
Bridge::getBridge()->setResult();
|
||||
Bridge::getBridge()->setResult(BridgeResult::GetActiveView);
|
||||
}
|
||||
|
|
|
@ -81,6 +81,10 @@ MainWindow::MainWindow(QWidget* parent)
|
|||
connect(Bridge::getBridge(), SIGNAL(setIconMenuEntry(int, QIcon)), this, SLOT(setIconMenuEntry(int, QIcon)));
|
||||
connect(Bridge::getBridge(), SIGNAL(setCheckedMenuEntry(int, bool)), this, SLOT(setCheckedMenuEntry(int, bool)));
|
||||
connect(Bridge::getBridge(), SIGNAL(setHotkeyMenuEntry(int, QString, QString)), this, SLOT(setHotkeyMenuEntry(int, QString, QString)));
|
||||
connect(Bridge::getBridge(), SIGNAL(setVisibleMenuEntry(int, bool)), this, SLOT(setVisibleMenuEntry(int, bool)));
|
||||
connect(Bridge::getBridge(), SIGNAL(setVisibleMenu(int, bool)), this, SLOT(setVisibleMenu(int, bool)));
|
||||
connect(Bridge::getBridge(), SIGNAL(setNameMenuEntry(int, QString)), this, SLOT(setNameMenuEntry(int, QString)));
|
||||
connect(Bridge::getBridge(), SIGNAL(setNameMenu(int, QString)), this, SLOT(setNameMenu(int, QString)));
|
||||
connect(Bridge::getBridge(), SIGNAL(showCpu()), this, SLOT(displayCpuWidget()));
|
||||
connect(Bridge::getBridge(), SIGNAL(addQWidgetTab(QWidget*)), this, SLOT(addQWidgetTab(QWidget*)));
|
||||
connect(Bridge::getBridge(), SIGNAL(showQWidgetTab(QWidget*)), this, SLOT(showQWidgetTab(QWidget*)));
|
||||
|
@ -94,7 +98,7 @@ MainWindow::MainWindow(QWidget* parent)
|
|||
|
||||
// Setup menu API
|
||||
initMenuApi();
|
||||
addMenuToList(this, ui->menuPlugins, GUI_PLUGIN_MENU);
|
||||
Bridge::getBridge()->emitMenuAddToList(this, ui->menuPlugins, GUI_PLUGIN_MENU);
|
||||
|
||||
// Set window title
|
||||
if(BridgeIsProcessElevated())
|
||||
|
@ -1082,7 +1086,7 @@ void MainWindow::addMenuToList(QWidget* parent, QMenu* menu, int hMenu, int hPar
|
|||
{
|
||||
if(!findMenu(hMenu))
|
||||
mMenuList.push_back(MenuInfo(parent, menu, hMenu, hParentMenu, hMenu == GUI_PLUGIN_MENU));
|
||||
Bridge::getBridge()->setResult();
|
||||
Bridge::getBridge()->setResult(BridgeResult::MenuAddToList);
|
||||
}
|
||||
|
||||
void MainWindow::addMenu(int hMenu, QString title)
|
||||
|
@ -1090,7 +1094,7 @@ void MainWindow::addMenu(int hMenu, QString title)
|
|||
const MenuInfo* menu = findMenu(hMenu);
|
||||
if(!menu && hMenu != -1)
|
||||
{
|
||||
Bridge::getBridge()->setResult(-1);
|
||||
Bridge::getBridge()->setResult(BridgeResult::MenuAdd, -1);
|
||||
return;
|
||||
}
|
||||
int hMenuNew = hEntryMenuPool++;
|
||||
|
@ -1105,7 +1109,7 @@ void MainWindow::addMenu(int hMenu, QString title)
|
|||
menu->mMenu->addMenu(wMenu);
|
||||
menu->mMenu->menuAction()->setVisible(true);
|
||||
}
|
||||
Bridge::getBridge()->setResult(hMenuNew);
|
||||
Bridge::getBridge()->setResult(BridgeResult::MenuAdd, hMenuNew);
|
||||
}
|
||||
|
||||
void MainWindow::addMenuEntry(int hMenu, QString title)
|
||||
|
@ -1113,7 +1117,7 @@ void MainWindow::addMenuEntry(int hMenu, QString title)
|
|||
const MenuInfo* menu = findMenu(hMenu);
|
||||
if(!menu && hMenu != -1)
|
||||
{
|
||||
Bridge::getBridge()->setResult(-1);
|
||||
Bridge::getBridge()->setResult(BridgeResult::MenuAddEntry, -1);
|
||||
return;
|
||||
}
|
||||
MenuEntryInfo newInfo;
|
||||
|
@ -1135,7 +1139,7 @@ void MainWindow::addMenuEntry(int hMenu, QString title)
|
|||
menu->mMenu->addAction(wAction);
|
||||
menu->mMenu->menuAction()->setVisible(true);
|
||||
}
|
||||
Bridge::getBridge()->setResult(hEntryNew);
|
||||
Bridge::getBridge()->setResult(BridgeResult::MenuAddEntry, hEntryNew);
|
||||
}
|
||||
|
||||
void MainWindow::addSeparator(int hMenu)
|
||||
|
@ -1149,7 +1153,7 @@ void MainWindow::addSeparator(int hMenu)
|
|||
newInfo.mAction = menu->mMenu->addSeparator();
|
||||
mEntryList.push_back(newInfo);
|
||||
}
|
||||
Bridge::getBridge()->setResult();
|
||||
Bridge::getBridge()->setResult(BridgeResult::MenuAddSeparator);
|
||||
}
|
||||
|
||||
void MainWindow::clearMenuHelper(int hMenu)
|
||||
|
@ -1173,7 +1177,7 @@ void MainWindow::clearMenuHelper(int hMenu)
|
|||
clearMenuHelper(hMenu);
|
||||
}
|
||||
|
||||
void MainWindow::clearMenu(int hMenu, bool erase)
|
||||
void MainWindow::clearMenuImpl(int hMenu, bool erase)
|
||||
{
|
||||
//this recursively removes the entries from mEntryList and mMenuList
|
||||
clearMenuHelper(hMenu);
|
||||
|
@ -1201,7 +1205,12 @@ void MainWindow::clearMenu(int hMenu, bool erase)
|
|||
break;
|
||||
}
|
||||
}
|
||||
Bridge::getBridge()->setResult();
|
||||
}
|
||||
|
||||
void MainWindow::clearMenu(int hMenu, bool erase)
|
||||
{
|
||||
clearMenuImpl(hMenu, erase);
|
||||
Bridge::getBridge()->setResult(BridgeResult::MenuClear);
|
||||
}
|
||||
|
||||
void MainWindow::initMenuApi()
|
||||
|
@ -1239,12 +1248,13 @@ void MainWindow::removeMenuEntry(int hEntryMenu)
|
|||
parentMenu->mMenu->menuAction()->setVisible(false);
|
||||
mEntryList.erase(mEntryList.begin() + i);
|
||||
}
|
||||
Bridge::getBridge()->setResult();
|
||||
Bridge::getBridge()->setResult(BridgeResult::MenuRemove);
|
||||
return;
|
||||
}
|
||||
}
|
||||
//if hEntryMenu is not in mEntryList, clear+erase it from mMenuList
|
||||
clearMenu(hEntryMenu, true);
|
||||
clearMenuImpl(hEntryMenu, true);
|
||||
Bridge::getBridge()->setResult(BridgeResult::MenuRemove);
|
||||
}
|
||||
|
||||
void MainWindow::setIconMenuEntry(int hEntry, QIcon icon)
|
||||
|
@ -1258,7 +1268,7 @@ void MainWindow::setIconMenuEntry(int hEntry, QIcon icon)
|
|||
break;
|
||||
}
|
||||
}
|
||||
Bridge::getBridge()->setResult();
|
||||
Bridge::getBridge()->setResult(BridgeResult::MenuSetEntryIcon);
|
||||
}
|
||||
|
||||
void MainWindow::setIconMenu(int hMenu, QIcon icon)
|
||||
|
@ -1271,7 +1281,7 @@ void MainWindow::setIconMenu(int hMenu, QIcon icon)
|
|||
menu.mMenu->setIcon(icon);
|
||||
}
|
||||
}
|
||||
Bridge::getBridge()->setResult();
|
||||
Bridge::getBridge()->setResult(BridgeResult::MenuSetIcon);
|
||||
}
|
||||
|
||||
void MainWindow::setCheckedMenuEntry(int hEntry, bool checked)
|
||||
|
@ -1286,7 +1296,7 @@ void MainWindow::setCheckedMenuEntry(int hEntry, bool checked)
|
|||
break;
|
||||
}
|
||||
}
|
||||
Bridge::getBridge()->setResult();
|
||||
Bridge::getBridge()->setResult(BridgeResult::MenuSetEntryChecked);
|
||||
}
|
||||
|
||||
QString MainWindow::nestedMenuDescription(const MenuInfo* menu)
|
||||
|
@ -1335,7 +1345,7 @@ void MainWindow::setHotkeyMenuEntry(int hEntry, QString hotkey, QString id)
|
|||
break;
|
||||
}
|
||||
}
|
||||
Bridge::getBridge()->setResult();
|
||||
Bridge::getBridge()->setResult(BridgeResult::MenuSetEntryHotkey);
|
||||
}
|
||||
|
||||
void MainWindow::setVisibleMenuEntry(int hEntry, bool visible)
|
||||
|
@ -1349,7 +1359,7 @@ void MainWindow::setVisibleMenuEntry(int hEntry, bool visible)
|
|||
break;
|
||||
}
|
||||
}
|
||||
Bridge::getBridge()->setResult();
|
||||
Bridge::getBridge()->setResult(BridgeResult::MenuSetEntryVisible);
|
||||
}
|
||||
|
||||
void MainWindow::setVisibleMenu(int hMenu, bool visible)
|
||||
|
@ -1362,7 +1372,7 @@ void MainWindow::setVisibleMenu(int hMenu, bool visible)
|
|||
menu.mMenu->setVisible(visible);
|
||||
}
|
||||
}
|
||||
Bridge::getBridge()->setResult();
|
||||
Bridge::getBridge()->setResult(BridgeResult::MenuSetVisible);
|
||||
}
|
||||
|
||||
void MainWindow::setNameMenuEntry(int hEntry, QString name)
|
||||
|
@ -1377,7 +1387,7 @@ void MainWindow::setNameMenuEntry(int hEntry, QString name)
|
|||
break;
|
||||
}
|
||||
}
|
||||
Bridge::getBridge()->setResult();
|
||||
Bridge::getBridge()->setResult(BridgeResult::MenuSetEntryName);
|
||||
}
|
||||
|
||||
void MainWindow::setNameMenu(int hMenu, QString name)
|
||||
|
@ -1390,7 +1400,7 @@ void MainWindow::setNameMenu(int hMenu, QString name)
|
|||
menu.mMenu->setTitle(name);
|
||||
}
|
||||
}
|
||||
Bridge::getBridge()->setResult();
|
||||
Bridge::getBridge()->setResult(BridgeResult::MenuSetName);
|
||||
}
|
||||
|
||||
void MainWindow::runSelection()
|
||||
|
@ -1421,7 +1431,7 @@ void MainWindow::getStrWindow(const QString title, QString* text)
|
|||
if(mLineEdit.exec() != QDialog::Accepted)
|
||||
bResult = false;
|
||||
*text = mLineEdit.editText;
|
||||
Bridge::getBridge()->setResult(bResult);
|
||||
Bridge::getBridge()->setResult(BridgeResult::GetlineWindow, bResult);
|
||||
}
|
||||
|
||||
void MainWindow::patchWindow()
|
||||
|
|
|
@ -243,6 +243,7 @@ private:
|
|||
QString nestedMenuDescription(const MenuInfo* menu);
|
||||
QString nestedMenuEntryDescription(const MenuEntryInfo & entry);
|
||||
void clearMenuHelper(int hMenu);
|
||||
void clearMenuImpl(int hMenu, bool erase);
|
||||
|
||||
bool bCanClose;
|
||||
MainWindowCloseThread* mCloseThread;
|
||||
|
|
|
@ -615,7 +615,7 @@ void MemoryMapView::addVirtualModSlot()
|
|||
void MemoryMapView::selectionGetSlot(SELECTIONDATA* selection)
|
||||
{
|
||||
selection->start = selection->end = duint(getCellContent(getInitialSelection(), 0).toULongLong(nullptr, 16));
|
||||
Bridge::getBridge()->setResult(1);
|
||||
Bridge::getBridge()->setResult(BridgeResult::SelectionGet, 1);
|
||||
}
|
||||
|
||||
void MemoryMapView::disassembleAtSlot(dsint va, dsint cip)
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
#include "Bridge.h"
|
||||
#include <QMessageBox>
|
||||
|
||||
NotepadView::NotepadView(QWidget* parent) : QPlainTextEdit(parent)
|
||||
NotepadView::NotepadView(QWidget* parent, BridgeResult::Type type) : QPlainTextEdit(parent), mType(type)
|
||||
{
|
||||
updateStyle();
|
||||
connect(Config(), SIGNAL(colorsUpdated()), this, SLOT(updateStyle()));
|
||||
|
@ -31,5 +31,5 @@ void NotepadView::getNotes(void* ptr)
|
|||
strcpy_s(result, text.length() + 1, text.constData());
|
||||
}
|
||||
*(char**)ptr = result;
|
||||
Bridge::getBridge()->setResult();
|
||||
Bridge::getBridge()->setResult(mType);
|
||||
}
|
||||
|
|
|
@ -2,18 +2,21 @@
|
|||
#define NOTEPADVIEW_H
|
||||
|
||||
#include <QPlainTextEdit>
|
||||
#include "BridgeResult.h"
|
||||
|
||||
class NotepadView : public QPlainTextEdit
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit NotepadView(QWidget* parent = 0);
|
||||
NotepadView(QWidget* parent, BridgeResult::Type type);
|
||||
|
||||
public slots:
|
||||
void updateStyle();
|
||||
void setNotes(const QString text);
|
||||
void getNotes(void* ptr);
|
||||
|
||||
private:
|
||||
BridgeResult::Type mType;
|
||||
};
|
||||
|
||||
#endif // NOTEPADVIEW_H
|
||||
|
|
|
@ -4,13 +4,13 @@
|
|||
NotesManager::NotesManager(QWidget* parent) : QTabWidget(parent)
|
||||
{
|
||||
connect(Bridge::getBridge(), SIGNAL(dbgStateChanged(DBGSTATE)), this, SLOT(dbgStateChangedSlot(DBGSTATE)));
|
||||
mGlobal = new NotepadView(this);
|
||||
mGlobal = new NotepadView(this, BridgeResult::GetGlobalNotes);
|
||||
mGlobal->setWindowTitle("GlobalNotes");
|
||||
connect(Bridge::getBridge(), SIGNAL(setGlobalNotes(QString)), mGlobal, SLOT(setNotes(QString)));
|
||||
connect(Bridge::getBridge(), SIGNAL(getGlobalNotes(void*)), mGlobal, SLOT(getNotes(void*)));
|
||||
addTab(mGlobal, tr("Global"));
|
||||
|
||||
mDebuggee = new NotepadView(this);
|
||||
mDebuggee = new NotepadView(this, BridgeResult::GetDebuggeeNotes);
|
||||
mDebuggee->setWindowTitle("DebuggeeNotes");
|
||||
connect(Bridge::getBridge(), SIGNAL(setDebuggeeNotes(QString)), mDebuggee, SLOT(setNotes(QString)));
|
||||
connect(Bridge::getBridge(), SIGNAL(getDebuggeeNotes(void*)), mDebuggee, SLOT(getNotes(void*)));
|
||||
|
|
|
@ -33,7 +33,7 @@ void ReferenceManager::newReferenceView(QString name)
|
|||
connect(mCurrentReferenceView, SIGNAL(showCpu()), this, SIGNAL(showCpu()));
|
||||
insertTab(0, mCurrentReferenceView, name);
|
||||
setCurrentIndex(0);
|
||||
Bridge::getBridge()->setResult(1);
|
||||
Bridge::getBridge()->setResult(BridgeResult::RefInitialize, 1);
|
||||
}
|
||||
|
||||
void ReferenceManager::closeTab(int index)
|
||||
|
|
|
@ -434,7 +434,7 @@ void ScriptView::add(int count, const char** lines)
|
|||
setCellContent(i, 1, QString(lines[i]));
|
||||
BridgeFree(lines);
|
||||
reloadData(); //repaint
|
||||
Bridge::getBridge()->setResult(1);
|
||||
Bridge::getBridge()->setResult(BridgeResult::ScriptAdd, 1);
|
||||
}
|
||||
|
||||
void ScriptView::clear()
|
||||
|
@ -608,7 +608,7 @@ void ScriptView::enableHighlighting(bool enable)
|
|||
|
||||
void ScriptView::messageResult(int result)
|
||||
{
|
||||
Bridge::getBridge()->setResult(result == QMessageBox::Yes);
|
||||
Bridge::getBridge()->setResult(BridgeResult::ScriptMessage, result == QMessageBox::Yes);
|
||||
}
|
||||
|
||||
void ScriptView::closeSlot()
|
||||
|
|
|
@ -73,13 +73,13 @@ void StructWidget::typeAddNode(void* parent, const TYPEDESCRIPTOR* type)
|
|||
QVariant var;
|
||||
var.setValue(dtype);
|
||||
item->setData(0, Qt::UserRole, var);
|
||||
Bridge::getBridge()->setResult(dsint(item));
|
||||
Bridge::getBridge()->setResult(BridgeResult::TypeAddNode, dsint(item));
|
||||
}
|
||||
|
||||
void StructWidget::typeClear()
|
||||
{
|
||||
ui->treeWidget->clear();
|
||||
Bridge::getBridge()->setResult();
|
||||
Bridge::getBridge()->setResult(BridgeResult::TypeClear);
|
||||
}
|
||||
|
||||
void StructWidget::typeUpdateWidget()
|
||||
|
@ -128,7 +128,7 @@ void StructWidget::typeUpdateWidget()
|
|||
void StructWidget::dbgStateChangedSlot(DBGSTATE state)
|
||||
{
|
||||
if(state == stopped)
|
||||
typeClear();
|
||||
ui->treeWidget->clear();
|
||||
}
|
||||
|
||||
void StructWidget::setupColumns()
|
||||
|
|
|
@ -810,5 +810,5 @@ void SymbolView::emptySearchResultSlot()
|
|||
void SymbolView::selectionGetSlot(SELECTIONDATA* selection)
|
||||
{
|
||||
selection->start = selection->end = duint(mModuleList->mCurList->getCellContent(mModuleList->mCurList->getInitialSelection(), ColBase).toULongLong(nullptr, 16));
|
||||
Bridge::getBridge()->setResult(1);
|
||||
Bridge::getBridge()->setResult(BridgeResult::SelectionGet, 1);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue