From abf026db04943d670c091443c4d9954f4bfc4e86 Mon Sep 17 00:00:00 2001 From: Torusrxxx Date: Thu, 23 Jun 2016 15:50:26 +0000 Subject: [PATCH] Translate the launcher and add more shortcuts (#793) * translate the launcher * translate the launcher * translate launcher * translate launcher * translate launcher * translate launcher * translate launcher * translate launcher * translate launcher * translate launcher * translate launcher * translate this file * add more shortcuts * add more shortcuts * add more shortcuts * add more shortcuts * add more shortcuts * add more shortcuts * add more shortcuts * add more shortcuts --- src/bridge/bridgemain.cpp | 28 ++-- src/bridge/bridgemain.h | 4 +- src/exe/LoadResourceString.h | 18 +++ src/exe/Strings.rc | 135 ++++++++++++++++++ src/exe/resource1.h | 34 +++++ src/exe/x64_dbg_exe.cpp | 7 +- src/exe/x64_dbg_exe.vcxproj | 7 +- src/exe/x64_dbg_exe.vcxproj.filters | 13 +- src/gui/Src/Gui/CPUDisassembly.cpp | 37 +++-- src/gui/Src/Gui/CPUDump.cpp | 6 + src/gui/Src/Gui/LogView.cpp | 4 +- src/gui/Src/Gui/MainWindow.cpp | 4 + src/gui/Src/Gui/MemoryMapView.cpp | 9 +- src/gui/Src/Gui/RegistersView.cpp | 2 + src/gui/Src/Gui/ShortcutsDialog.cpp | 2 +- src/gui/Src/Gui/SymbolView.cpp | 15 ++ src/gui/Src/Utils/Configuration.cpp | 21 +++ src/launcher/x64_dbg_launcher.cpp | 50 ++++--- src/launcher/x64_dbg_launcher.vcxproj | 5 +- src/launcher/x64_dbg_launcher.vcxproj.filters | 7 +- 20 files changed, 340 insertions(+), 68 deletions(-) create mode 100644 src/exe/LoadResourceString.h create mode 100644 src/exe/Strings.rc create mode 100644 src/exe/resource1.h diff --git a/src/bridge/bridgemain.cpp b/src/bridge/bridgemain.cpp index da5cb290..65a96d60 100644 --- a/src/bridge/bridgemain.cpp +++ b/src/bridge/bridgemain.cpp @@ -20,35 +20,35 @@ static bool bDisableGUIUpdate; return; #ifdef _WIN64 -#define dbg_lib "x64dbg.dll" -#define gui_lib "x64gui.dll" +#define dbg_lib L"x64dbg.dll" +#define gui_lib L"x64gui.dll" #else -#define dbg_lib "x32dbg.dll" -#define gui_lib "x32gui.dll" +#define dbg_lib L"x32dbg.dll" +#define gui_lib L"x32gui.dll" #endif // _WIN64 #define LOADLIBRARY(name) \ szLib=name; \ - hInst=LoadLibraryA(name); \ + hInst=LoadLibraryW(name); \ if(!hInst) \ - return "Error loading library \""name"\"!" + return L"Error loading library \"" L#name L"\"!" #define LOADEXPORT(name) \ *((FARPROC*)&name)=GetProcAddress(hInst, #name); \ if(!name) \ { \ - sprintf(szError, "Export %s:%s could not be found!", szLib, #name); \ + wsprintfW(szError, L"Export %s:%s could not be found!", szLib, L#name); \ return szError; \ } -BRIDGE_IMPEXP const char* BridgeInit() +BRIDGE_IMPEXP const wchar_t* BridgeInit() { //Initialize critial section InitializeCriticalSection(&csIni); //Settings load if(!GetModuleFileNameW(0, szIniFile, MAX_PATH)) - return "Error getting module path!"; + return L"Error getting module path!"; int len = (int)wcslen(szIniFile); while(szIniFile[len] != L'.' && szIniFile[len] != L'\\' && len) len--; @@ -58,8 +58,8 @@ BRIDGE_IMPEXP const char* BridgeInit() wcscpy_s(&szIniFile[len], _countof(szIniFile) - len, L".ini"); HINSTANCE hInst; - const char* szLib; - static char szError[256] = ""; + const wchar_t* szLib; + static wchar_t szError[256] = L""; //GUI Load LOADLIBRARY(gui_lib); @@ -92,16 +92,16 @@ BRIDGE_IMPEXP const char* BridgeInit() return 0; } -BRIDGE_IMPEXP const char* BridgeStart() +BRIDGE_IMPEXP const wchar_t* BridgeStart() { if(!_dbg_dbginit || !_gui_guiinit) - return "\"_dbg_dbginit\" || \"_gui_guiinit\" was not loaded yet, call BridgeInit!"; + return L"\"_dbg_dbginit\" || \"_gui_guiinit\" was not loaded yet, call BridgeInit!"; int errorLine = 0; BridgeSettingRead(&errorLine); _dbg_sendmessage(DBG_INITIALIZE_LOCKS, nullptr, nullptr); //initialize locks before any other thread than the main thread are started _gui_guiinit(0, 0); //remove arguments if(!BridgeSettingFlush()) - return "Failed to save settings!"; + return L"Failed to save settings!"; _dbg_sendmessage(DBG_DEINITIALIZE_LOCKS, nullptr, nullptr); //deinitialize locks when only one thread is left (hopefully) DeleteCriticalSection(&csIni); return 0; diff --git a/src/bridge/bridgemain.h b/src/bridge/bridgemain.h index eb310aae..7260e69f 100644 --- a/src/bridge/bridgemain.h +++ b/src/bridge/bridgemain.h @@ -43,8 +43,8 @@ extern "C" #define DBG_VERSION 25 //Bridge functions -BRIDGE_IMPEXP const char* BridgeInit(); -BRIDGE_IMPEXP const char* BridgeStart(); +BRIDGE_IMPEXP const wchar_t* BridgeInit(); +BRIDGE_IMPEXP const wchar_t* BridgeStart(); BRIDGE_IMPEXP void* BridgeAlloc(size_t size); BRIDGE_IMPEXP void BridgeFree(void* ptr); BRIDGE_IMPEXP bool BridgeSettingGet(const char* section, const char* key, char* value); diff --git a/src/exe/LoadResourceString.h b/src/exe/LoadResourceString.h new file mode 100644 index 00000000..f1775f45 --- /dev/null +++ b/src/exe/LoadResourceString.h @@ -0,0 +1,18 @@ +#include + +#include "resource1.h" // String resources + +inline std::wstring _LoadResString(UINT uID) { + wchar_t* p = nullptr; + int len = ::LoadStringW(NULL, uID, reinterpret_cast(&p), 0); + if(len > 0) + { + return std::wstring(p, len); + } + else + { + return std::wstring(); + } +} + +#define LoadResString(uID) _LoadResString(uID).c_str() diff --git a/src/exe/Strings.rc b/src/exe/Strings.rc new file mode 100644 index 00000000..6c6691c1 --- /dev/null +++ b/src/exe/Strings.rc @@ -0,0 +1,135 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource1.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// zh(CN) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource1.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDS_ERROR "错误" + IDS_ERRORGETTINGMODULEPATH "获取模块路径时出错!" + IDS_QUESTION "温馨提示" + IDS_ASKSHELLEXT "您想要为调试器注册右键菜单吗?" + IDS_ASKDESKTOPSHORTCUT "您想要创建桌面快捷方式吗?" + IDS_DONE "完成!" + IDS_NEWCFGWRITTEN "新的配置已经写入!" +END + +STRINGTABLE +BEGIN + IDS_INVDPATH32 "启动器的配置文件中没有指定x32dbg的路径..." + IDS_INVDPATH64 "启动器的配置文件中没有指定x64dbg的路径..." + IDS_INVDPE "无效的PE文件!" + IDS_FILEERR "文件没找到,或者已被占用!" + IDS_SHORTCUTDESC "一个面向未来的调试器!" + IDS_ASKADMIN "您确定以管理员权限运行本程序了吗?" + IDS_REGCREATEKEYFAIL "RegCreateKey 失败!" + IDS_REGSETVALUEEXFAIL "RegSetValueEx 失败!" + IDS_REGOPENKEYFAIL "RegOpenKeyEx 失败!" + IDS_BRIDGEINITERR "BridgeInit 发生错误" + IDS_SHELLEXTDBG "用x64dbg调试" + IDS_BRIDGESTARTERR "BridgeStart 发生错误" +END + +#endif // zh(CN) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// en(US) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDS_ERROR "Error" + IDS_ERRORGETTINGMODULEPATH "Error getting module path!" + IDS_QUESTION "Question" + IDS_ASKSHELLEXT "Do you want to register a shell extension?" + IDS_ASKDESKTOPSHORTCUT "Do you want to create Desktop Shortcuts?" + IDS_DONE "Done!" + IDS_NEWCFGWRITTEN "New configuration written!" +END + +STRINGTABLE +BEGIN + IDS_INVDPATH32 "Path to x32dbg not specified in launcher configuration..." + IDS_INVDPATH64 "Path to x64dbg not specified in launcher configuration..." + IDS_INVDPE "Invalid PE File!" + IDS_FILEERR "File not found or in use!" + IDS_SHORTCUTDESC "A Debugger for the future!" + IDS_ASKADMIN "Running as Admin?" + IDS_REGCREATEKEYFAIL "RegCreateKey failed!" + IDS_REGSETVALUEEXFAIL "RegSetValueEx failed!" + IDS_REGOPENKEYFAIL "RegOpenKeyEx Failed!" + IDS_BRIDGEINITERR "BridgeInit Error" + IDS_SHELLEXTDBG "Debug with x64dbg" + IDS_BRIDGESTARTERR "BridgeStart Error" +END + +#endif // en(US) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/src/exe/resource1.h b/src/exe/resource1.h new file mode 100644 index 00000000..6be0b8cb --- /dev/null +++ b/src/exe/resource1.h @@ -0,0 +1,34 @@ +//{{NO_DEPENDENCIES}} +// +// +// +#define IDS_ERROR 105 +#define IDS_ERRORGETTINGMODULEPATH 106 +#define IDS_QUESTION 107 +#define IDS_ASKSHELLEXT 108 +#define IDS_ASKDESKTOPSHORTCUT 109 +#define IDS_DONE 110 +#define IDS_NEWCFGWRITTEN 111 +#define IDS_INVDPATH32 112 +#define IDS_INVDPATH64 113 +#define IDS_INVDPE 114 +#define IDS_FILEERR 115 +#define IDS_SHORTCUTDESC 116 +#define IDS_ASKADMIN 117 +#define IDS_REGCREATEKEYFAIL 118 +#define IDS_REGSETVALUEEXFAIL 119 +#define IDS_REGOPENKEYFAIL 120 +#define IDS_BRIDGEINITERR 121 +#define IDS_SHELLEXTDBG 122 +#define IDS_BRIDGESTARTERR 126 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/src/exe/x64_dbg_exe.cpp b/src/exe/x64_dbg_exe.cpp index 7385ec00..4b3ff873 100644 --- a/src/exe/x64_dbg_exe.cpp +++ b/src/exe/x64_dbg_exe.cpp @@ -8,6 +8,7 @@ #include #include "crashdump.h" #include "..\bridge\bridgemain.h" +#include "LoadResourceString.h" /** @fn int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) @@ -26,16 +27,16 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi { CrashDumpInitialize(); - const char* errormsg = BridgeInit(); + const wchar_t* errormsg = BridgeInit(); if(errormsg) { - MessageBoxA(0, errormsg, "BridgeInit Error", MB_ICONERROR | MB_SYSTEMMODAL); + MessageBoxW(0, errormsg, LoadResString(IDS_BRIDGEINITERR), MB_ICONERROR | MB_SYSTEMMODAL); return 1; } errormsg = BridgeStart(); if(errormsg) { - MessageBoxA(0, errormsg, "BridgeStart Error", MB_ICONERROR | MB_SYSTEMMODAL); + MessageBoxW(0, errormsg, LoadResString(IDS_BRIDGESTARTERR), MB_ICONERROR | MB_SYSTEMMODAL); return 1; } return 0; diff --git a/src/exe/x64_dbg_exe.vcxproj b/src/exe/x64_dbg_exe.vcxproj index 93a60735..d080720c 100644 --- a/src/exe/x64_dbg_exe.vcxproj +++ b/src/exe/x64_dbg_exe.vcxproj @@ -1,4 +1,4 @@ - + @@ -25,7 +25,9 @@ + + @@ -37,6 +39,7 @@ true + @@ -193,4 +196,4 @@ - \ No newline at end of file + diff --git a/src/exe/x64_dbg_exe.vcxproj.filters b/src/exe/x64_dbg_exe.vcxproj.filters index 9c14f78e..6b69ad52 100644 --- a/src/exe/x64_dbg_exe.vcxproj.filters +++ b/src/exe/x64_dbg_exe.vcxproj.filters @@ -1,4 +1,4 @@ - + @@ -32,6 +32,12 @@ Header Files + + Header Files + + + Header Files + @@ -43,6 +49,9 @@ Resource Files + + Resource Files + @@ -61,4 +70,4 @@ Resource Files - \ No newline at end of file + diff --git a/src/gui/Src/Gui/CPUDisassembly.cpp b/src/gui/Src/Gui/CPUDisassembly.cpp index bf493d75..8b8616fd 100644 --- a/src/gui/Src/Gui/CPUDisassembly.cpp +++ b/src/gui/Src/Gui/CPUDisassembly.cpp @@ -234,9 +234,9 @@ void CPUDisassembly::setupRightClickContextMenu() }); QAction* toggleBreakpointAction = makeShortcutAction(tr("Toggle"), SLOT(toggleInt3BPActionSlot()), "ActionToggleBreakpoint"); - QAction* editSoftwareBreakpointAction = makeAction(tr("Edit"), SLOT(editSoftBpActionSlot())); - QAction* setHwBreakpointAction = makeAction(tr("Set Hardware on Execution"), SLOT(toggleHwBpActionSlot())); - QAction* removeHwBreakpointAction = makeAction(tr("Remove Hardware"), SLOT(toggleHwBpActionSlot())); + QAction* editSoftwareBreakpointAction = makeShortcutAction(tr("Edit"), SLOT(editSoftBpActionSlot()), "ActionEditBreakpoint"); + QAction* setHwBreakpointAction = makeShortcutAction(tr("Set Hardware on Execution"), SLOT(toggleHwBpActionSlot()), "ActionSetHwBpE"); + QAction* removeHwBreakpointAction = makeShortcutAction(tr("Remove Hardware"), SLOT(toggleHwBpActionSlot()), "ActionRemoveHwBp"); QMenu* replaceSlotMenu = makeMenu(tr("Set Hardware on Execution")); QAction* replaceSlot0Action = makeMenuAction(replaceSlotMenu, tr("Replace Slot 0 (Free)"), SLOT(setHwBpOnSlot0ActionSlot())); @@ -281,16 +281,16 @@ void CPUDisassembly::setupRightClickContextMenu() switch(bpList.bp[i].slot) { case 0: - replaceSlot0Action->setText("Replace Slot 0 (0x" + QString("%1").arg(bpList.bp[i].addr, 8, 16, QChar('0')).toUpper() + ")"); + replaceSlot0Action->setText(tr("Replace Slot %1 (0x%2)").arg(1).arg(ToPtrString(bpList.bp[i].addr))); break; case 1: - replaceSlot1Action->setText("Replace Slot 1 (0x" + QString("%1").arg(bpList.bp[i].addr, 8, 16, QChar('0')).toUpper() + ")"); + replaceSlot1Action->setText(tr("Replace Slot %1 (0x%2)").arg(2).arg(ToPtrString(bpList.bp[i].addr))); break; case 2: - replaceSlot2Action->setText("Replace Slot 2 (0x" + QString("%1").arg(bpList.bp[i].addr, 8, 16, QChar('0')).toUpper() + ")"); + replaceSlot2Action->setText(tr("Replace Slot %1 (0x%2)").arg(3).arg(ToPtrString(bpList.bp[i].addr))); break; case 3: - replaceSlot3Action->setText("Replace Slot 3 (0x" + QString("%1").arg(bpList.bp[i].addr, 8, 16, QChar('0')).toUpper() + ")"); + replaceSlot3Action->setText(tr("Replace Slot %1 (0x%2)").arg(4).arg(ToPtrString(bpList.bp[i].addr))); break; default: break; @@ -412,22 +412,27 @@ void CPUDisassembly::setupRightClickContextMenu() analysisMenu->addAction(makeShortcutAction(tr("Analyze single function"), SLOT(analyzeSingleFunctionSlot()), "ActionAnalyzeSingleFunction")); - analysisMenu->addAction(makeAction(tr("Remove analysis from module"), SLOT(removeAnalysisModuleSlot()))); + analysisMenu->addAction(makeShortcutAction(tr("Remove analysis from module"), SLOT(removeAnalysisModuleSlot()), "ActionRemoveAnalysisFromModule")); analysisMenu->addSeparator(); - analysisMenu->addAction(makeAction(tr("Remove analysis from selection"), SLOT(removeAnalysisSelectionSlot()))); + analysisMenu->addAction(makeShortcutAction(tr("Remove analysis from selection"), SLOT(removeAnalysisSelectionSlot()), "ActionRemoveAnalysisFromSelection")); - QMenu* encodeTypeMenu = makeMenu("Treat selection head as"); + QMenu* encodeTypeMenu = makeMenu(tr("Treat selection head as")); - QMenu* encodeTypeRangeMenu = makeMenu("Treat selection as"); + QMenu* encodeTypeRangeMenu = makeMenu(tr("Treat selection as")); - std::string strTable[] = {"Command", "Byte", "Word", "Dword", "Fword", "Qword", "Tbyte", "Oword", "", + const char* strTable[] = {"Command", "Byte", "Word", "Dword", "Fword", "Qword", "Tbyte", "Oword", "", "Float", "Double", "Long Double", "", "ASCII", "UNICODE", "", "MMWord", "XMMWord", "YMMWord" }; + const char* shortcutTable[] = {nullptr, "ActionTreatSelectionAsByte", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, + "ActionTreatSelectionAsASCII", "ActionTreatSelectionAsUNICODE", nullptr, + nullptr, nullptr, nullptr}; + ENCODETYPE enctypeTable[] = {enc_code, enc_byte, enc_word, enc_dword, enc_fword, enc_qword, enc_tbyte, enc_oword, enc_middle, enc_real4, enc_real8, enc_real10 , enc_middle, enc_ascii, enc_unicode, enc_middle, @@ -445,10 +450,14 @@ void CPUDisassembly::setupRightClickContextMenu() } else { - QAction* action = makeAction(tr(strTable[i].c_str()), SLOT(setEncodeTypeRangeSlot())); + QAction* action; + if(shortcutTable[i]) + action = makeShortcutAction(tr(strTable[i]), SLOT(setEncodeTypeRangeSlot()), shortcutTable[i]); + else + action = makeAction(tr(strTable[i]), SLOT(setEncodeTypeRangeSlot())); action->setData(enctypeTable[i]); encodeTypeRangeMenu->addAction(action); - action = makeAction(tr(strTable[i].c_str()), SLOT(setEncodeTypeSlot())); + action = makeAction(tr(strTable[i]), SLOT(setEncodeTypeSlot())); action->setData(enctypeTable[i]); encodeTypeMenu->addAction(action); } diff --git a/src/gui/Src/Gui/CPUDump.cpp b/src/gui/Src/Gui/CPUDump.cpp index 6ba72d94..53481ba6 100644 --- a/src/gui/Src/Gui/CPUDump.cpp +++ b/src/gui/Src/Gui/CPUDump.cpp @@ -127,10 +127,14 @@ void CPUDump::setupContextMenu() //Sync with expression mSyncWithExpression = new QAction(QIcon(":/icons/images/sync.png"), tr("&Sync with expression"), this); + mSyncWithExpression->setShortcutContext(Qt::WidgetShortcut); + this->addAction(mSyncWithExpression); connect(mSyncWithExpression, SIGNAL(triggered(bool)), this, SLOT(syncWithExpressionSlot())); //Entropy mEntropy = new QAction(QIcon(":/icons/images/entropy.png"), tr("Entrop&y..."), this); + mEntropy->setShortcutContext(Qt::WidgetShortcut); + this->addAction(mEntropy); connect(mEntropy, SIGNAL(triggered()), this, SLOT(entropySlot())); //Label @@ -423,6 +427,8 @@ void CPUDump::refreshShortcutsSlot() mGotoEnd->setShortcut(ConfigShortcut("ActionGotoEnd")); mGotoFileOffset->setShortcut(ConfigShortcut("ActionGotoFileOffset")); mYaraAction->setShortcut(ConfigShortcut("ActionYara")); + mSyncWithExpression->setShortcut(ConfigShortcut("ActionSyncWithExpression")); + mEntropy->setShortcut(ConfigShortcut("ActionEntropy")); } void CPUDump::getColumnRichText(int col, dsint rva, RichTextPainter::List & richText) diff --git a/src/gui/Src/Gui/LogView.cpp b/src/gui/Src/Gui/LogView.cpp index dba6f1f7..96484a9a 100644 --- a/src/gui/Src/Gui/LogView.cpp +++ b/src/gui/Src/Gui/LogView.cpp @@ -53,7 +53,7 @@ void LogView::setupContextMenu() void LogView::refreshShortcutsSlot() { actionCopy->setShortcut(ConfigShortcut("ActionCopy")); - // More shortcuts? + actionToggleLogging->setShortcut(ConfigShortcut("ActionToggleLogging")); } void LogView::contextMenuEvent(QContextMenuEvent* event) @@ -111,7 +111,7 @@ void LogView::saveSlot() { savedLog.write(this->document()->toPlainText().toUtf8().constData()); savedLog.close(); - addMsgToLogSlot(tr("Log have been saved to %1\n").arg(fileName)); + addMsgToLogSlot(tr("Log have been saved as %1\n").arg(fileName)); } } diff --git a/src/gui/Src/Gui/MainWindow.cpp b/src/gui/Src/Gui/MainWindow.cpp index 5f2ec45a..6fa5f4a4 100644 --- a/src/gui/Src/Gui/MainWindow.cpp +++ b/src/gui/Src/Gui/MainWindow.cpp @@ -460,6 +460,10 @@ void MainWindow::refreshShortcuts() setGlobalShortcut(ui->actionRtu, ConfigShortcut("DebugRtu")); setGlobalShortcut(ui->actionCommand, ConfigShortcut("DebugCommand")); setGlobalShortcut(ui->actionSkipNextInstruction, ConfigShortcut("DebugSkipNextInstruction")); + setGlobalShortcut(ui->actionTicnd, ConfigShortcut("DebugTraceIntoConditional")); + setGlobalShortcut(ui->actionTocnd, ConfigShortcut("DebugTraceOverConditional")); + setGlobalShortcut(ui->actionTRBit, ConfigShortcut("DebugEnableTraceRecordBit")); + setGlobalShortcut(ui->actionTRNone, ConfigShortcut("DebugTraceRecordNone")); setGlobalShortcut(ui->actionScylla, ConfigShortcut("PluginsScylla")); diff --git a/src/gui/Src/Gui/MemoryMapView.cpp b/src/gui/Src/Gui/MemoryMapView.cpp index fa0352e8..8e5f7f6c 100644 --- a/src/gui/Src/Gui/MemoryMapView.cpp +++ b/src/gui/Src/Gui/MemoryMapView.cpp @@ -109,11 +109,13 @@ void MemoryMapView::setupContextMenu() //Allocate memory mMemoryAllocate = new QAction(tr("&Allocate memory"), this); + mMemoryAllocate->setShortcutContext(Qt::WidgetShortcut); connect(mMemoryAllocate, SIGNAL(triggered()), this, SLOT(memoryAllocateSlot())); this->addAction(mMemoryAllocate); //Free memory mMemoryFree = new QAction(tr("&Free memory"), this); + mMemoryFree->setShortcutContext(Qt::WidgetShortcut); connect(mMemoryFree, SIGNAL(triggered()), this, SLOT(memoryFreeSlot())); this->addAction(mMemoryFree); @@ -123,6 +125,8 @@ void MemoryMapView::setupContextMenu() //Entropy mEntropy = new QAction(QIcon(":/icons/images/entropy.png"), tr("Entropy..."), this); + mEntropy->setShortcutContext(Qt::WidgetShortcut); + this->addAction(mEntropy); connect(mEntropy, SIGNAL(triggered()), this, SLOT(entropy())); //Find @@ -145,6 +149,9 @@ void MemoryMapView::refreshShortcutsSlot() mMemoryRemove->setShortcut(ConfigShortcut("ActionToggleBreakpoint")); mMemoryExecuteSingleshootToggle->setShortcut(ConfigShortcut("ActionToggleBreakpoint")); mFindPattern->setShortcut(ConfigShortcut("ActionFindPattern")); + mEntropy->setShortcut(ConfigShortcut("ActionEntropy")); + mMemoryFree->setShortcut(ConfigShortcut("ActionFreeMemory")); + mMemoryAllocate->setShortcut(ConfigShortcut("ActionAllocateMemory")); } void MemoryMapView::contextMenuSlot(const QPoint & pos) @@ -471,7 +478,7 @@ void MemoryMapView::entropy() DbgMemRead(addr, data, size); EntropyDialog entropyDialog(this); - entropyDialog.setWindowTitle(QString().sprintf("Entropy (Address: %p, Size: %p)", addr, size)); + entropyDialog.setWindowTitle(tr("Entropy (Address: %1, Size: %2)").arg(ToPtrString(addr).arg(ToPtrString(size)))); entropyDialog.show(); entropyDialog.GraphMemory(data, size); entropyDialog.exec(); diff --git a/src/gui/Src/Gui/RegistersView.cpp b/src/gui/Src/Gui/RegistersView.cpp index c3178e61..b30bc3ab 100644 --- a/src/gui/Src/Gui/RegistersView.cpp +++ b/src/gui/Src/Gui/RegistersView.cpp @@ -441,6 +441,7 @@ RegistersView::RegistersView(QWidget* parent) : QScrollArea(parent), mVScrollOff wCM_CopySymbolToClipboard->setShortcutContext(Qt::WidgetShortcut); this->addAction(wCM_CopySymbolToClipboard); wCM_CopyAll = new QAction(tr("Copy all registers"), this); + wCM_CopyAll->setShortcutContext(Qt::WidgetShortcut); this->addAction(wCM_CopyAll); wCM_FollowInDisassembly = new QAction(tr("Follow in Disassembler"), this); wCM_FollowInDump = new QAction(tr("Follow in Dump"), this); @@ -1152,6 +1153,7 @@ void RegistersView::refreshShortcutsSlot() wCM_ToggleValue->setShortcut(ConfigShortcut("ActionToggleRegisterValue")); wCM_CopyToClipboard->setShortcut(ConfigShortcut("ActionCopy")); wCM_CopySymbolToClipboard->setShortcut(ConfigShortcut("ActionCopySymbol")); + wCM_CopyAll->setShortcut(ConfigShortcut("ActionCopyAllRegisters")); } RegistersView::~RegistersView() diff --git a/src/gui/Src/Gui/ShortcutsDialog.cpp b/src/gui/Src/Gui/ShortcutsDialog.cpp index e5df615e..2168e3bb 100644 --- a/src/gui/Src/Gui/ShortcutsDialog.cpp +++ b/src/gui/Src/Gui/ShortcutsDialog.cpp @@ -11,7 +11,7 @@ ShortcutsDialog::ShortcutsDialog(QWidget* parent) : QDialog(parent), ui(new Ui:: // x64 has no model-view-controler pattern QStringList tblHeader; - tblHeader << "Instruction" << "Shortcut"; + tblHeader << tr("Instruction") << tr("Shortcut"); currentRow = 0; diff --git a/src/gui/Src/Gui/SymbolView.cpp b/src/gui/Src/Gui/SymbolView.cpp index 7e9ccca1..105cae51 100644 --- a/src/gui/Src/Gui/SymbolView.cpp +++ b/src/gui/Src/Gui/SymbolView.cpp @@ -144,12 +144,24 @@ void SymbolView::setupContextMenu() connect(mEntropyAction, SIGNAL(triggered()), this, SLOT(moduleEntropy())); mModSetUserAction = new QAction(tr("Mark as &user module"), this); + mModSetUserAction->setShortcutContext(Qt::WidgetWithChildrenShortcut); + this->addAction(mModSetUserAction); + mModuleList->mList->addAction(mModSetUserAction); + mModuleList->mSearchList->addAction(mModSetUserAction); connect(mModSetUserAction, SIGNAL(triggered()), this, SLOT(moduleSetUser())); mModSetSystemAction = new QAction(tr("Mark as &system module"), this); + mModSetSystemAction->setShortcutContext(Qt::WidgetWithChildrenShortcut); + this->addAction(mModSetSystemAction); + mModuleList->mList->addAction(mModSetSystemAction); + mModuleList->mSearchList->addAction(mModSetSystemAction); connect(mModSetSystemAction, SIGNAL(triggered()), this, SLOT(moduleSetSystem())); mModSetPartyAction = new QAction(tr("Mark as &party..."), this); + mModSetPartyAction->setShortcutContext(Qt::WidgetWithChildrenShortcut); + this->addAction(mModSetPartyAction); + mModuleList->mList->addAction(mModSetPartyAction); + mModuleList->mSearchList->addAction(mModSetPartyAction); connect(mModSetPartyAction, SIGNAL(triggered()), this, SLOT(moduleSetParty())); //Shortcuts @@ -161,6 +173,9 @@ void SymbolView::refreshShortcutsSlot() { mToggleBreakpoint->setShortcut(ConfigShortcut("ActionToggleBreakpoint")); mToggleBookmark->setShortcut(ConfigShortcut("ActionToggleBookmark")); + mModSetUserAction->setShortcut(ConfigShortcut("ActionMarkAsUser")); + mModSetSystemAction->setShortcut(ConfigShortcut("ActionMarkAsSystem")); + mModSetPartyAction->setShortcut(ConfigShortcut("ActionMarkAsParty")); } void SymbolView::updateStyle() diff --git a/src/gui/Src/Utils/Configuration.cpp b/src/gui/Src/Utils/Configuration.cpp index 1eee94d3..a6d08b23 100644 --- a/src/gui/Src/Utils/Configuration.cpp +++ b/src/gui/Src/Utils/Configuration.cpp @@ -291,6 +291,10 @@ Configuration::Configuration() : QObject(), noMoreMsgbox(false) defaultShortcuts.insert("DebugRtu", Shortcut(tr("Debug -> Run to user code"), "Alt+F9", true)); defaultShortcuts.insert("DebugSkipNextInstruction", Shortcut(tr("Debug -> Skip next instruction"), "Ctrl+F8", true)); defaultShortcuts.insert("DebugCommand", Shortcut(tr("Debug -> Command"), "Ctrl+Return", true)); + defaultShortcuts.insert("DebugTraceIntoConditional", Shortcut(tr("Debug -> Trace Into Conditional"), "")); + defaultShortcuts.insert("DebugTraceOverConditional", Shortcut(tr("Debug -> Trace Over Conditional"), "")); + defaultShortcuts.insert("DebugEnableTraceRecordBit", Shortcut(tr("Debug -> Trace Record -> Bit"), "")); + defaultShortcuts.insert("DebugTraceRecordNone", Shortcut(tr("Debug -> Trace Record -> None"), "")); defaultShortcuts.insert("PluginsScylla", Shortcut(tr("Plugins -> Scylla"), "Ctrl+I", true)); @@ -344,6 +348,23 @@ Configuration::Configuration() : QObject(), noMoreMsgbox(false) defaultShortcuts.insert("ActionFind", Shortcut(tr("Actions -> Find"), "Ctrl+F")); defaultShortcuts.insert("ActionDecompileFunction", Shortcut(tr("Actions -> Decompile Function"), "F5")); defaultShortcuts.insert("ActionDecompileSelection", Shortcut(tr("Actions -> Decompile Selection"), "Shift+F5")); + defaultShortcuts.insert("ActionEditBreakpoint", Shortcut(tr("Actions -> Edit breakpoint"), "")); + defaultShortcuts.insert("ActionToggleLogging", Shortcut(tr("Actions -> Enable/Disable Logging"), "")); + defaultShortcuts.insert("ActionAllocateMemory", Shortcut(tr("Actions -> Allocate Memory"), "")); + defaultShortcuts.insert("ActionFreeMemory", Shortcut(tr("Actions -> Free Memory"), "")); + defaultShortcuts.insert("ActionSyncWithExpression", Shortcut(tr("Actions -> Sync With Expression"), "")); + defaultShortcuts.insert("ActionEntropy", Shortcut(tr("Actions -> Entropy"), "")); + defaultShortcuts.insert("ActionCopyAllRegisters", Shortcut(tr("Actions -> Copy All Registers"), "")); + defaultShortcuts.insert("ActionMarkAsUser", Shortcut(tr("Actions -> Mark As User Module"), "")); + defaultShortcuts.insert("ActionMarkAsSystem", Shortcut(tr("Actions -> Mark As System Module"), "")); + defaultShortcuts.insert("ActionMarkAsParty", Shortcut(tr("Actions -> Mark As Party"), "")); + defaultShortcuts.insert("ActionSetHwBpE", Shortcut(tr("Actions -> Set Hardware Breakpoint (Execute)"), "")); + defaultShortcuts.insert("ActionRemoveHwBp", Shortcut(tr("Actions -> Remove Hardware Breakpoint"), "")); + defaultShortcuts.insert("ActionRemoveAnalysisFromModule", Shortcut(tr("Actions -> Remove Analysis From Module"), "")); + defaultShortcuts.insert("ActionRemoveAnalysisFromSelection", Shortcut(tr("Actions -> Remove Analysis From Selection"), "")); + defaultShortcuts.insert("ActionTreatSelectionAsByte", Shortcut(tr("Actions -> Treat Selection As Bytes"), "")); + defaultShortcuts.insert("ActionTreatSelectionAsASCII", Shortcut(tr("Actions -> Treat Selection As ASCII"), "")); + defaultShortcuts.insert("ActionTreatSelectionAsUNICODE", Shortcut(tr("Actions -> Treat Selection As UNICODE"), "")); defaultShortcuts.insert("ActionIncreaseRegister", Shortcut(tr("Actions -> Increase Register"), "+")); defaultShortcuts.insert("ActionDecreaseRegister", Shortcut(tr("Actions -> Decrease Register"), "-")); diff --git a/src/launcher/x64_dbg_launcher.cpp b/src/launcher/x64_dbg_launcher.cpp index 197b0baf..d5e10121 100644 --- a/src/launcher/x64_dbg_launcher.cpp +++ b/src/launcher/x64_dbg_launcher.cpp @@ -7,6 +7,8 @@ #include #include +#include "../exe/LoadResourceString.h" + typedef BOOL(WINAPI* LPFN_ISWOW64PROCESS)(HANDLE, PBOOL); enum arch @@ -72,11 +74,6 @@ static bool BrowseFileOpen(HWND owner, const TCHAR* filter, const TCHAR* defext, return !!GetOpenFileName(&ofstruct); } -#define SHELLEXT_EXE_KEY TEXT("exefile\\shell\\Debug with x64dbg\\Command") -#define SHELLEXT_ICON_EXE_KEY TEXT("exefile\\shell\\Debug with x64dbg") -#define SHELLEXT_DLL_KEY TEXT("dllfile\\shell\\Debug with x64dbg\\Command") -#define SHELLEXT_ICON_DLL_KEY TEXT("dllfile\\shell\\Debug with x64dbg") - static BOOL isWoW64() { @@ -103,6 +100,11 @@ static TCHAR* GetDesktopPath() return nullptr; } +const wchar_t* SHELLEXT_EXE_KEY = L"exefile\\shell\\Debug with x64dbg\\Command"; +const wchar_t* SHELLEXT_ICON_EXE_KEY = L"exefile\\shell\\Debug with x64dbg"; +const wchar_t* SHELLEXT_DLL_KEY = L"dllfile\\shell\\Debug with x64dbg\\Command"; +const wchar_t* SHELLEXT_ICON_DLL_KEY = L"dllfile\\shell\\Debug with x64dbg"; + static HRESULT AddDesktopShortcut(TCHAR* szPathOfFile, const TCHAR* szNameOfLink) { HRESULT hRes = NULL; @@ -119,7 +121,7 @@ static HRESULT AddDesktopShortcut(TCHAR* szPathOfFile, const TCHAR* szNameOfLink CComPtr ppf; psl->SetPath(szPathOfFile); - psl->SetDescription(TEXT("A Debugger for the future!")); + psl->SetDescription(LoadResString(IDS_SHORTCUTDESC)); psl->SetIconLocation(szPathOfFile, 0); psl->SetWorkingDirectory(pathFile); @@ -141,25 +143,27 @@ static bool RegisterShellExtension(const TCHAR* key, const TCHAR* command) auto result = true; if(RegCreateKey(HKEY_CLASSES_ROOT, key, &hKey) != ERROR_SUCCESS) { - MessageBox(nullptr, TEXT("RegCreateKeyA failed!"), TEXT("Running as Admin?"), MB_ICONERROR); + MessageBox(nullptr, LoadResString(IDS_REGCREATEKEYFAIL), LoadResString(IDS_ASKADMIN), MB_ICONERROR); return false; } if(RegSetValueEx(hKey, nullptr, 0, REG_EXPAND_SZ, LPBYTE(command), (_tcslen(command) + 1) * sizeof(TCHAR)) != ERROR_SUCCESS) { - MessageBox(nullptr, TEXT("RegSetValueExA failed!"), TEXT("Running as Admin?"), MB_ICONERROR); + MessageBox(nullptr, LoadResString(IDS_REGSETVALUEEXFAIL), LoadResString(IDS_ASKADMIN), MB_ICONERROR); result = false; } RegCloseKey(hKey); return result; } -static void AddShellIcon(const TCHAR* key, const TCHAR* command) +static void AddShellIcon(const TCHAR* key, const TCHAR* icon, const TCHAR* title) { HKEY pKey; - if(RegOpenKeyExW(HKEY_CLASSES_ROOT, key, 0, KEY_ALL_ACCESS, &pKey) != ERROR_SUCCESS) - MessageBoxW(nullptr, L"RegOpenKeyExW Failed!", L"Running as Admin?", MB_ICONERROR); - if(RegSetValueExW(pKey, L"Icon", 0, REG_SZ, LPBYTE(command), (_tcslen(command) + 1) * sizeof(TCHAR)) != ERROR_SUCCESS) - MessageBoxW(nullptr, L"RegSetValueExA failed!", L"Running as Admin?", MB_ICONERROR); + if(RegOpenKeyEx(HKEY_CLASSES_ROOT, key, 0, KEY_ALL_ACCESS, &pKey) != ERROR_SUCCESS) + MessageBox(nullptr, LoadResString(IDS_REGOPENKEYFAIL), LoadResString(IDS_ASKADMIN), MB_ICONERROR); + if(RegSetValueEx(pKey, L"Icon", 0, REG_SZ, LPBYTE(icon), (_tcslen(icon) + 1) * sizeof(TCHAR)) != ERROR_SUCCESS) + MessageBox(nullptr, LoadResString(IDS_REGSETVALUEEXFAIL), LoadResString(IDS_ASKADMIN), MB_ICONERROR); + if(RegSetValueEx(pKey, nullptr, 0, REG_SZ, LPBYTE(title), (_tcslen(title) + 1) * sizeof(TCHAR)) != ERROR_SUCCESS) + MessageBox(nullptr, LoadResString(IDS_REGSETVALUEEXFAIL), LoadResString(IDS_ASKADMIN), MB_ICONERROR); RegCloseKey(pKey); } @@ -230,7 +234,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi TCHAR szModulePath[MAX_PATH] = TEXT(""); if(!GetModuleFileName(nullptr, szModulePath, MAX_PATH)) { - MessageBox(nullptr, TEXT("Error getting module path!"), TEXT("Error"), MB_ICONERROR | MB_SYSTEMMODAL); + MessageBox(nullptr, LoadResString(IDS_ERRORGETTINGMODULEPATH), LoadResString(IDS_ERROR), MB_ICONERROR | MB_SYSTEMMODAL); return 0; } TCHAR szIniPath[MAX_PATH] = TEXT(""); @@ -300,25 +304,25 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi WritePrivateProfileString(TEXT("Launcher"), TEXT("x64dbg"), sz64Path, szIniPath); bDoneSomething = true; } - if(MessageBox(nullptr, TEXT("Do you want to register a shell extension?"), TEXT("Question"), MB_YESNO | MB_ICONQUESTION) == IDYES) + if(MessageBox(nullptr, LoadResString(IDS_ASKSHELLEXT), LoadResString(IDS_QUESTION), MB_YESNO | MB_ICONQUESTION) == IDYES) { TCHAR szLauncherCommand[MAX_PATH] = TEXT(""); _stprintf_s(szLauncherCommand, _countof(szLauncherCommand), TEXT("\"%s\" \"%%1\""), szModulePath); TCHAR szIconCommand[MAX_PATH] = TEXT(""); _stprintf_s(szIconCommand, _countof(szIconCommand), TEXT("\"%s\",0"), szModulePath); if(RegisterShellExtension(SHELLEXT_EXE_KEY, szLauncherCommand)) - AddShellIcon(SHELLEXT_ICON_EXE_KEY, szIconCommand); + AddShellIcon(SHELLEXT_ICON_EXE_KEY, szIconCommand, LoadResString(IDS_SHELLEXTDBG)); if(RegisterShellExtension(SHELLEXT_DLL_KEY, szLauncherCommand)) - AddShellIcon(SHELLEXT_ICON_DLL_KEY, szIconCommand); + AddShellIcon(SHELLEXT_ICON_DLL_KEY, szIconCommand, LoadResString(IDS_SHELLEXTDBG)); } - if(MessageBox(nullptr, TEXT("Do you want to create Desktop Shortcuts?"), TEXT("Question"), MB_YESNO | MB_ICONQUESTION) == IDYES) + if(MessageBox(nullptr, LoadResString(IDS_ASKDESKTOPSHORTCUT), LoadResString(IDS_QUESTION), MB_YESNO | MB_ICONQUESTION) == IDYES) { AddDesktopShortcut(sz32Path, TEXT("x32dbg")); if(isWoW64()) AddDesktopShortcut(sz64Path, TEXT("x64dbg")); } if(bDoneSomething) - MessageBox(nullptr, TEXT("New configuration written!"), TEXT("Done!"), MB_ICONINFORMATION); + MessageBox(nullptr, LoadResString(IDS_NEWCFGWRITTEN), LoadResString(IDS_DONE), MB_ICONINFORMATION); } if(argc == 2) //one argument -> execute debugger { @@ -337,22 +341,22 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi if(sz32Path[0]) ShellExecute(nullptr, TEXT("open"), sz32Path, cmdLine.c_str(), sz32Dir, SW_SHOWNORMAL); else - MessageBox(nullptr, TEXT("Path to x32dbg not specified in launcher configuration..."), TEXT("Error!"), MB_ICONERROR); + MessageBox(nullptr, LoadResString(IDS_INVDPATH32), LoadResString(IDS_ERROR), MB_ICONERROR); break; case x64: if(sz64Path[0]) ShellExecute(nullptr, TEXT("open"), sz64Path, cmdLine.c_str(), sz64Dir, SW_SHOWNORMAL); else - MessageBox(nullptr, TEXT("Path to x64dbg not specified in launcher configuration..."), TEXT("Error!"), MB_ICONERROR); + MessageBox(nullptr, LoadResString(IDS_INVDPATH64), LoadResString(IDS_ERROR), MB_ICONERROR); break; case invalid: - MessageBox(nullptr, argv[1], TEXT("Invalid PE File!"), MB_ICONERROR); + MessageBox(nullptr, argv[1], LoadResString(IDS_INVDPE), MB_ICONERROR); break; case notfound: - MessageBox(nullptr, argv[1], TEXT("File not found or in use!"), MB_ICONERROR); + MessageBox(nullptr, argv[1], LoadResString(IDS_FILEERR), MB_ICONERROR); break; } } diff --git a/src/launcher/x64_dbg_launcher.vcxproj b/src/launcher/x64_dbg_launcher.vcxproj index 93dfc9f9..eac388b7 100644 --- a/src/launcher/x64_dbg_launcher.vcxproj +++ b/src/launcher/x64_dbg_launcher.vcxproj @@ -1,4 +1,4 @@ - + @@ -16,6 +16,7 @@ + @@ -101,4 +102,4 @@ - \ No newline at end of file + diff --git a/src/launcher/x64_dbg_launcher.vcxproj.filters b/src/launcher/x64_dbg_launcher.vcxproj.filters index 9a88ec3a..9933423d 100644 --- a/src/launcher/x64_dbg_launcher.vcxproj.filters +++ b/src/launcher/x64_dbg_launcher.vcxproj.filters @@ -1,4 +1,4 @@ - + @@ -26,6 +26,9 @@ Resource Files + + Resource Files + @@ -35,4 +38,4 @@ Header Files - \ No newline at end of file +