GUI: option to not highlight operands and continue with the mnemonic highlighting instead
This commit is contained in:
parent
b61a681f25
commit
e285b4ed2f
|
|
@ -8,7 +8,7 @@ CapstoneTokenizer::CapstoneTokenizer(int maxModuleLength)
|
|||
_success(false),
|
||||
isNop(false)
|
||||
{
|
||||
SetConfig(false, false, false, false);
|
||||
SetConfig(false, false, false, false, false);
|
||||
}
|
||||
|
||||
CapstoneTokenizer::TokenColor colorNamesMap[CapstoneTokenizer::TokenType::Last];
|
||||
|
|
@ -137,6 +137,14 @@ bool CapstoneTokenizer::Tokenize(duint addr, const unsigned char* data, int data
|
|||
addToken(TokenType::Uncategorized, "???");
|
||||
}
|
||||
|
||||
if(_bNoHighlightOperands)
|
||||
{
|
||||
while(_inst.tokens.size() && _inst.tokens[_inst.tokens.size() - 1].type == TokenType::Space)
|
||||
_inst.tokens.pop_back();
|
||||
for(SingleToken & token : _inst.tokens)
|
||||
token.type = _mnemonicType;
|
||||
}
|
||||
|
||||
instruction = _inst;
|
||||
|
||||
return true;
|
||||
|
|
@ -162,17 +170,19 @@ void CapstoneTokenizer::UpdateConfig()
|
|||
SetConfig(ConfigBool("Disassembler", "Uppercase"),
|
||||
ConfigBool("Disassembler", "TabbedMnemonic"),
|
||||
ConfigBool("Disassembler", "ArgumentSpaces"),
|
||||
ConfigBool("Disassembler", "MemorySpaces"));
|
||||
ConfigBool("Disassembler", "MemorySpaces"),
|
||||
ConfigBool("Disassembler", "NoHighlightOperands"));
|
||||
_maxModuleLength = (int)ConfigUint("Disassembler", "MaxModuleSize");
|
||||
UpdateStringPool();
|
||||
}
|
||||
|
||||
void CapstoneTokenizer::SetConfig(bool bUppercase, bool bTabbedMnemonic, bool bArgumentSpaces, bool bMemorySpaces)
|
||||
void CapstoneTokenizer::SetConfig(bool bUppercase, bool bTabbedMnemonic, bool bArgumentSpaces, bool bMemorySpaces, bool bNoHighlightOperands)
|
||||
{
|
||||
_bUppercase = bUppercase;
|
||||
_bTabbedMnemonic = bTabbedMnemonic;
|
||||
_bArgumentSpaces = bArgumentSpaces;
|
||||
_bMemorySpaces = bMemorySpaces;
|
||||
_bNoHighlightOperands = bNoHighlightOperands;
|
||||
}
|
||||
|
||||
int CapstoneTokenizer::Size() const
|
||||
|
|
@ -361,34 +371,31 @@ bool CapstoneTokenizer::tokenizePrefix()
|
|||
bool CapstoneTokenizer::tokenizeMnemonic()
|
||||
{
|
||||
QString mnemonic = QString(_cp.Mnemonic().c_str());
|
||||
if(isNop)
|
||||
{
|
||||
tokenizeMnemonic(TokenType::MnemonicNop, mnemonic);
|
||||
return true;
|
||||
}
|
||||
auto type = TokenType::MnemonicNormal;
|
||||
_mnemonicType = TokenType::MnemonicNormal;
|
||||
auto id = _cp.GetId();
|
||||
if(_cp.InGroup(CS_GRP_CALL))
|
||||
type = TokenType::MnemonicCall;
|
||||
if(isNop)
|
||||
_mnemonicType = TokenType::MnemonicNop;
|
||||
else if(_cp.InGroup(CS_GRP_CALL))
|
||||
_mnemonicType = TokenType::MnemonicCall;
|
||||
else if(_cp.InGroup(CS_GRP_RET))
|
||||
type = TokenType::MnemonicRet;
|
||||
_mnemonicType = TokenType::MnemonicRet;
|
||||
else if(_cp.InGroup(CS_GRP_JUMP) || _cp.IsLoop())
|
||||
{
|
||||
switch(id)
|
||||
{
|
||||
case X86_INS_JMP:
|
||||
case X86_INS_LJMP:
|
||||
type = TokenType::MnemonicUncondJump;
|
||||
_mnemonicType = TokenType::MnemonicUncondJump;
|
||||
break;
|
||||
default:
|
||||
type = TokenType::MnemonicCondJump;
|
||||
_mnemonicType = TokenType::MnemonicCondJump;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if(_cp.IsInt3())
|
||||
type = TokenType::MnemonicInt3;
|
||||
_mnemonicType = TokenType::MnemonicInt3;
|
||||
else if(_cp.IsUnusual())
|
||||
type = TokenType::MnemonicUnusual;
|
||||
_mnemonicType = TokenType::MnemonicUnusual;
|
||||
else
|
||||
{
|
||||
switch(id)
|
||||
|
|
@ -405,14 +412,14 @@ bool CapstoneTokenizer::tokenizeMnemonic()
|
|||
case X86_INS_POPFQ:
|
||||
case X86_INS_POPAL:
|
||||
case X86_INS_POPAW:
|
||||
type = TokenType::MnemonicPushPop;
|
||||
_mnemonicType = TokenType::MnemonicPushPop;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
tokenizeMnemonic(type, mnemonic);
|
||||
tokenizeMnemonic(_mnemonicType, mnemonic);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -147,7 +147,7 @@ public:
|
|||
bool Tokenize(duint addr, const unsigned char* data, int datasize, InstructionToken & instruction);
|
||||
bool TokenizeData(const QString & datatype, const QString & data, InstructionToken & instruction);
|
||||
void UpdateConfig();
|
||||
void SetConfig(bool bUppercase, bool bTabbedMnemonic, bool bArgumentSpaces, bool bMemorySpaces);
|
||||
void SetConfig(bool bUppercase, bool bTabbedMnemonic, bool bArgumentSpaces, bool bMemorySpaces, bool bNoHighlightOperands);
|
||||
int Size() const;
|
||||
const Capstone & GetCapstone() const;
|
||||
|
||||
|
|
@ -172,6 +172,8 @@ private:
|
|||
bool _bTabbedMnemonic;
|
||||
bool _bArgumentSpaces;
|
||||
bool _bMemorySpaces;
|
||||
bool _bNoHighlightOperands;
|
||||
TokenType _mnemonicType;
|
||||
|
||||
void addToken(TokenType type, QString text, const TokenValue & value);
|
||||
void addToken(TokenType type, const QString & text);
|
||||
|
|
|
|||
|
|
@ -183,11 +183,13 @@ void SettingsDialog::LoadSettings()
|
|||
GetSettingBool("Disassembler", "Uppercase", &settings.disasmUppercase);
|
||||
GetSettingBool("Disassembler", "OnlyCipAutoComments", &settings.disasmOnlyCipAutoComments);
|
||||
GetSettingBool("Disassembler", "TabbedMnemonic", &settings.disasmTabBetweenMnemonicAndArguments);
|
||||
GetSettingBool("Disassembler", "NoHighlightOperands", &settings.disasmNoHighlightOperands);
|
||||
ui->chkArgumentSpaces->setChecked(settings.disasmArgumentSpaces);
|
||||
ui->chkMemorySpaces->setChecked(settings.disasmMemorySpaces);
|
||||
ui->chkUppercase->setChecked(settings.disasmUppercase);
|
||||
ui->chkOnlyCipAutoComments->setChecked(settings.disasmOnlyCipAutoComments);
|
||||
ui->chkTabBetweenMnemonicAndArguments->setChecked(settings.disasmTabBetweenMnemonicAndArguments);
|
||||
ui->chkNoHighlightOperands->setChecked(settings.disasmNoHighlightOperands);
|
||||
|
||||
//Gui tab
|
||||
GetSettingBool("Gui", "FpuRegistersLittleEndian", &settings.guiFpuRegistersLittleEndian);
|
||||
|
|
@ -312,6 +314,7 @@ void SettingsDialog::SaveSettings()
|
|||
BridgeSettingSetUint("Disassembler", "Uppercase", settings.disasmUppercase);
|
||||
BridgeSettingSetUint("Disassembler", "OnlyCipAutoComments", settings.disasmOnlyCipAutoComments);
|
||||
BridgeSettingSetUint("Disassembler", "TabbedMnemonic", settings.disasmTabBetweenMnemonicAndArguments);
|
||||
BridgeSettingSetUint("Disassembler", "NoHighlightOperands", settings.disasmNoHighlightOperands);
|
||||
|
||||
//Gui tab
|
||||
BridgeSettingSetUint("Gui", "FpuRegistersLittleEndian", settings.guiFpuRegistersLittleEndian);
|
||||
|
|
@ -718,3 +721,9 @@ void SettingsDialog::on_spinMaxTraceCount_valueChanged(int arg1)
|
|||
{
|
||||
settings.engineMaxTraceCount = arg1;
|
||||
}
|
||||
|
||||
void SettingsDialog::on_chkNoHighlightOperands_toggled(bool checked)
|
||||
{
|
||||
bTokenizerConfigUpdated = true;
|
||||
settings.disasmNoHighlightOperands = checked;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -64,6 +64,7 @@ private slots:
|
|||
void on_chkUppercase_stateChanged(int arg1);
|
||||
void on_chkOnlyCipAutoComments_stateChanged(int arg1);
|
||||
void on_chkTabBetweenMnemonicAndArguments_stateChanged(int arg1);
|
||||
void on_chkNoHighlightOperands_toggled(bool checked);
|
||||
//Gui Tab
|
||||
void on_chkFpuRegistersLittleEndian_stateChanged(int arg1);
|
||||
void on_chkSaveColumnOrder_stateChanged(int arg1);
|
||||
|
|
@ -143,6 +144,7 @@ private:
|
|||
bool disasmUppercase;
|
||||
bool disasmOnlyCipAutoComments;
|
||||
bool disasmTabBetweenMnemonicAndArguments;
|
||||
bool disasmNoHighlightOperands;
|
||||
//Gui Tab
|
||||
bool guiFpuRegistersLittleEndian;
|
||||
bool guiSaveColumnOrder;
|
||||
|
|
|
|||
|
|
@ -489,6 +489,13 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="chkNoHighlightOperands">
|
||||
<property name="text">
|
||||
<string>Don't highlight operands</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer_2">
|
||||
<property name="orientation">
|
||||
|
|
|
|||
|
|
@ -197,6 +197,7 @@ Configuration::Configuration() : QObject(), noMoreMsgbox(false)
|
|||
disassemblyBool.insert("OnlyCipAutoComments", false);
|
||||
disassemblyBool.insert("TabbedMnemonic", false);
|
||||
disassemblyBool.insert("LongDataInstruction", false);
|
||||
disassemblyBool.insert("NoHighlightOperands", false);
|
||||
defaultBools.insert("Disassembler", disassemblyBool);
|
||||
|
||||
QMap<QString, bool> engineBool;
|
||||
|
|
|
|||
Loading…
Reference in New Issue