Thread Safe
This commit is contained in:
parent
2324106748
commit
740684100c
|
@ -2,7 +2,7 @@
|
|||
|
||||
GUIGUIINIT _gui_guiinit;
|
||||
GUISENDMESSAGE _gui_sendmessage;
|
||||
GUITRANSLATEDBG _gui_translate_dbg;
|
||||
GUITRANSLATETEXT _gui_translate_text;
|
||||
|
||||
DBGDBGINIT _dbg_dbginit;
|
||||
DBGMEMFINDBASEADDR _dbg_memfindbaseaddr;
|
||||
|
|
|
@ -7,12 +7,12 @@
|
|||
//GUI typedefs
|
||||
typedef int (*GUIGUIINIT)(int, char**);
|
||||
typedef void* (*GUISENDMESSAGE)(GUIMSG type, void* param1, void* param2);
|
||||
typedef const char* (*GUITRANSLATEDBG)(const char* source);
|
||||
typedef const char* (*GUITRANSLATETEXT)(const char* source);
|
||||
|
||||
//GUI functions
|
||||
extern GUIGUIINIT _gui_guiinit;
|
||||
extern GUISENDMESSAGE _gui_sendmessage;
|
||||
extern GUITRANSLATEDBG _gui_translate_dbg;
|
||||
extern GUITRANSLATETEXT _gui_translate_text;
|
||||
|
||||
//DBG typedefs
|
||||
typedef const char* (*DBGDBGINIT)();
|
||||
|
|
|
@ -1485,12 +1485,9 @@ BRIDGE_IMPEXP void GuiFoldDisassembly(duint startAddress, duint length)
|
|||
_gui_sendmessage(GUI_FOLD_DISASSEMBLY, (void*)startAddress, (void*)length);
|
||||
}
|
||||
|
||||
BRIDGE_IMPEXP const char* GuiTranslateDbg(const char* Source)
|
||||
BRIDGE_IMPEXP const char* GuiTranslateText(const char* Source)
|
||||
{
|
||||
EnterCriticalSection(&csTranslate);
|
||||
auto text = _gui_translate_dbg(Source);
|
||||
LeaveCriticalSection(&csTranslate);
|
||||
return text;
|
||||
return _gui_translate_text(Source);
|
||||
}
|
||||
|
||||
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
|
||||
|
|
|
@ -997,7 +997,7 @@ typedef struct
|
|||
|
||||
//GUI functions
|
||||
//code page is utf8
|
||||
BRIDGE_IMPEXP const char* GuiTranslateDbg(const char* Source);
|
||||
BRIDGE_IMPEXP const char* GuiTranslateText(const char* Source);
|
||||
BRIDGE_IMPEXP void GuiDisasmAt(duint addr, duint cip);
|
||||
BRIDGE_IMPEXP void GuiSetDebugState(DBGSTATE state);
|
||||
BRIDGE_IMPEXP void GuiAddLogMessage(const char* msg);
|
||||
|
|
|
@ -22,7 +22,7 @@ static void GuiAddLogMessageAsync(const char* msg)
|
|||
void dputs(const char* Text)
|
||||
{
|
||||
// Only append the newline if the caller didn't
|
||||
const char* TranslatedText = GuiTranslateDbg(Text);
|
||||
const char* TranslatedText = GuiTranslateText(Text);
|
||||
size_t textlen = strlen(TranslatedText);
|
||||
if(TranslatedText[textlen - 1] != '\n')
|
||||
{
|
||||
|
@ -57,7 +57,7 @@ void dprintf(const char* Format, ...)
|
|||
void dprintf_args(const char* Format, va_list Args)
|
||||
{
|
||||
char buffer[16384];
|
||||
vsnprintf_s(buffer, _TRUNCATE, GuiTranslateDbg(Format), Args);
|
||||
vsnprintf_s(buffer, _TRUNCATE, GuiTranslateText(Format), Args);
|
||||
|
||||
GuiAddLogMessageAsync(buffer);
|
||||
}
|
||||
|
|
|
@ -149,7 +149,7 @@ bool tryassembledata(duint addr, unsigned char* dest, int destsize, int* size, c
|
|||
if(!parsedatainstruction(instruction, di))
|
||||
{
|
||||
if(di.operand == "")
|
||||
strcpy_s(error, MAX_ERROR_SIZE, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "missing operand")));
|
||||
strcpy_s(error, MAX_ERROR_SIZE, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "missing operand")));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -167,14 +167,14 @@ bool tryassembledata(duint addr, unsigned char* dest, int destsize, int* size, c
|
|||
unsigned long long result = 0;
|
||||
if(!convertLongLongNumber(di.operand.c_str(), result, 16))
|
||||
{
|
||||
strcpy_s(error, MAX_ERROR_SIZE, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "failed to convert operand")));
|
||||
strcpy_s(error, MAX_ERROR_SIZE, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "failed to convert operand")));
|
||||
return false;
|
||||
}
|
||||
auto buf = (char*)&result;
|
||||
for(auto i = retsize; i < sizeof(result); i++)
|
||||
if(buf[i])
|
||||
{
|
||||
strcpy_s(error, MAX_ERROR_SIZE, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "operand value too big")));
|
||||
strcpy_s(error, MAX_ERROR_SIZE, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "operand value too big")));
|
||||
return false;
|
||||
}
|
||||
buffer = String(buf, retsize);
|
||||
|
@ -187,7 +187,7 @@ bool tryassembledata(duint addr, unsigned char* dest, int destsize, int* size, c
|
|||
std::vector<unsigned char> data;
|
||||
if(!StringUtils::FromHex(StringUtils::PadLeft(di.operand, retsize * 2, '0'), data, true))
|
||||
{
|
||||
strcpy_s(error, MAX_ERROR_SIZE, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "invalid operand (FromHex failed)")));
|
||||
strcpy_s(error, MAX_ERROR_SIZE, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "invalid operand (FromHex failed)")));
|
||||
return false;
|
||||
}
|
||||
if(data.size() != retsize)
|
||||
|
@ -206,7 +206,7 @@ bool tryassembledata(duint addr, unsigned char* dest, int destsize, int* size, c
|
|||
std::vector<unsigned char> data;
|
||||
if(!StringUtils::FromHex(StringUtils::PadLeft(di.operand, retsize * 2, '0'), data, false))
|
||||
{
|
||||
strcpy_s(error, MAX_ERROR_SIZE, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "invalid operand (FromHex failed)")));
|
||||
strcpy_s(error, MAX_ERROR_SIZE, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "invalid operand (FromHex failed)")));
|
||||
return false;
|
||||
}
|
||||
if(data.size() != retsize)
|
||||
|
@ -235,7 +235,7 @@ bool tryassembledata(duint addr, unsigned char* dest, int destsize, int* size, c
|
|||
}
|
||||
|
||||
case enc_real10:
|
||||
strcpy_s(error, MAX_ERROR_SIZE, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "80bit extended float is not supported")));
|
||||
strcpy_s(error, MAX_ERROR_SIZE, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "80bit extended float is not supported")));
|
||||
return false; //80 bit float is not supported in MSVC, need to add other library
|
||||
|
||||
case enc_ascii:
|
||||
|
@ -243,12 +243,12 @@ bool tryassembledata(duint addr, unsigned char* dest, int destsize, int* size, c
|
|||
String unescaped;
|
||||
if(!StringUtils::Unescape(di.operand, unescaped))
|
||||
{
|
||||
strcpy_s(error, MAX_ERROR_SIZE, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "invalid string literal")));
|
||||
strcpy_s(error, MAX_ERROR_SIZE, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "invalid string literal")));
|
||||
return false;
|
||||
}
|
||||
if(unescaped.size() > size_t(destsize))
|
||||
{
|
||||
strcpy_s(error, MAX_ERROR_SIZE, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "string too long")));
|
||||
strcpy_s(error, MAX_ERROR_SIZE, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "string too long")));
|
||||
if(size)
|
||||
{
|
||||
*size = int(unescaped.size()); //return correct size
|
||||
|
@ -266,14 +266,14 @@ bool tryassembledata(duint addr, unsigned char* dest, int destsize, int* size, c
|
|||
String unescaped;
|
||||
if(!StringUtils::Unescape(di.operand, unescaped))
|
||||
{
|
||||
strcpy_s(error, MAX_ERROR_SIZE, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "invalid string literal")));
|
||||
strcpy_s(error, MAX_ERROR_SIZE, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "invalid string literal")));
|
||||
return false;
|
||||
}
|
||||
WString unicode = StringUtils::Utf8ToUtf16(unescaped);
|
||||
|
||||
if(unicode.size()*sizeof(wchar_t) > size_t(destsize))
|
||||
{
|
||||
strcpy_s(error, MAX_ERROR_SIZE, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "string too long")));
|
||||
strcpy_s(error, MAX_ERROR_SIZE, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "string too long")));
|
||||
if(size)
|
||||
{
|
||||
retsize = unicode.size() * 2; //return correct size
|
||||
|
@ -293,7 +293,7 @@ bool tryassembledata(duint addr, unsigned char* dest, int destsize, int* size, c
|
|||
|
||||
if(retsize > size_t(destsize))
|
||||
{
|
||||
strcpy_s(error, MAX_ERROR_SIZE, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "dest buffer too small")));
|
||||
strcpy_s(error, MAX_ERROR_SIZE, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "dest buffer too small")));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -385,7 +385,7 @@ void DebugUpdateGui(duint disasm_addr, bool stack)
|
|||
else
|
||||
sprintf(modtext, "Module: %s - ", modname);
|
||||
char title[1024] = "";
|
||||
sprintf(title, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "File: %s - PID: %X - %sThread: %X")), szBaseFileName, fdProcessInfo->dwProcessId, modtext, ThreadGetId(hActiveThread));
|
||||
sprintf(title, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "File: %s - PID: %X - %sThread: %X")), szBaseFileName, fdProcessInfo->dwProcessId, modtext, ThreadGetId(hActiveThread));
|
||||
GuiUpdateWindowTitle(title);
|
||||
GuiUpdateAllViews();
|
||||
GuiFocusView(GUI_DISASSEMBLY);
|
||||
|
@ -482,14 +482,14 @@ static void printHwBpInfo(const BREAKPOINT & bp)
|
|||
switch(TITANGETTYPE(bp.titantype)) //type
|
||||
{
|
||||
case UE_HARDWARE_EXECUTE:
|
||||
bptype = _strdup(GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "execute")));
|
||||
bptype = _strdup(GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "execute")));
|
||||
bpsize = "";
|
||||
break;
|
||||
case UE_HARDWARE_READWRITE:
|
||||
bptype = _strdup(GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "read/write")));
|
||||
bptype = _strdup(GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "read/write")));
|
||||
break;
|
||||
case UE_HARDWARE_WRITE:
|
||||
bptype = _strdup(GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "write")));
|
||||
bptype = _strdup(GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "write")));
|
||||
break;
|
||||
default:
|
||||
bptype = _strdup(" ");
|
||||
|
@ -1141,7 +1141,7 @@ static void cbCreateProcess(CREATE_PROCESS_DEBUG_INFO* CreateProcessInfo)
|
|||
|
||||
char DebugFileName[deflen] = "";
|
||||
if(!GetFileNameFromHandle(CreateProcessInfo->hFile, DebugFileName) && !GetFileNameFromProcessHandle(CreateProcessInfo->hProcess, DebugFileName))
|
||||
strcpy_s(DebugFileName, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "??? (GetFileNameFromHandle failed)")));
|
||||
strcpy_s(DebugFileName, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "??? (GetFileNameFromHandle failed)")));
|
||||
dprintf(QT_TRANSLATE_NOOP("DBG", "Process Started: %p %s\n"), base, DebugFileName);
|
||||
|
||||
//update memory map
|
||||
|
|
|
@ -499,32 +499,32 @@ static CMDRESULT cbDebugSetBPXTextCommon(BP_TYPE Type, int argc, char* argv[], c
|
|||
|
||||
static CMDRESULT cbDebugSetBPXNameCommon(BP_TYPE Type, int argc, char* argv[])
|
||||
{
|
||||
return cbDebugSetBPXTextCommon(Type, argc, argv, String(GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "breakpoint name"))), BpSetName);
|
||||
return cbDebugSetBPXTextCommon(Type, argc, argv, String(GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "breakpoint name"))), BpSetName);
|
||||
}
|
||||
|
||||
static CMDRESULT cbDebugSetBPXConditionCommon(BP_TYPE Type, int argc, char* argv[])
|
||||
{
|
||||
return cbDebugSetBPXTextCommon(Type, argc, argv, String(GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "break condition"))), BpSetBreakCondition);
|
||||
return cbDebugSetBPXTextCommon(Type, argc, argv, String(GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "break condition"))), BpSetBreakCondition);
|
||||
}
|
||||
|
||||
static CMDRESULT cbDebugSetBPXLogCommon(BP_TYPE Type, int argc, char* argv[])
|
||||
{
|
||||
return cbDebugSetBPXTextCommon(Type, argc, argv, String(GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "logging text"))), BpSetLogText);
|
||||
return cbDebugSetBPXTextCommon(Type, argc, argv, String(GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "logging text"))), BpSetLogText);
|
||||
}
|
||||
|
||||
static CMDRESULT cbDebugSetBPXLogConditionCommon(BP_TYPE Type, int argc, char* argv[])
|
||||
{
|
||||
return cbDebugSetBPXTextCommon(Type, argc, argv, String(GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "logging condition"))), BpSetLogCondition);
|
||||
return cbDebugSetBPXTextCommon(Type, argc, argv, String(GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "logging condition"))), BpSetLogCondition);
|
||||
}
|
||||
|
||||
static CMDRESULT cbDebugSetBPXCommandCommon(BP_TYPE Type, int argc, char* argv[])
|
||||
{
|
||||
return cbDebugSetBPXTextCommon(Type, argc, argv, String(GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "command on hit"))), BpSetCommandText);
|
||||
return cbDebugSetBPXTextCommon(Type, argc, argv, String(GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "command on hit"))), BpSetCommandText);
|
||||
}
|
||||
|
||||
static CMDRESULT cbDebugSetBPXCommandConditionCommon(BP_TYPE Type, int argc, char* argv[])
|
||||
{
|
||||
return cbDebugSetBPXTextCommon(Type, argc, argv, String(GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "command condition"))), BpSetCommandCondition);
|
||||
return cbDebugSetBPXTextCommon(Type, argc, argv, String(GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "command condition"))), BpSetCommandCondition);
|
||||
}
|
||||
|
||||
static CMDRESULT cbDebugGetBPXHitCountCommon(BP_TYPE Type, int argc, char* argv[])
|
||||
|
|
|
@ -909,11 +909,11 @@ CMDRESULT cbInstrBswap(int argc, char* argv[])
|
|||
CMDRESULT cbInstrRefinit(int argc, char* argv[])
|
||||
{
|
||||
String TranslatedString;
|
||||
TranslatedString = GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Script"));
|
||||
TranslatedString = GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Script"));
|
||||
GuiReferenceInitialize(TranslatedString.c_str());
|
||||
TranslatedString = GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Address"));
|
||||
TranslatedString = GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Address"));
|
||||
GuiReferenceAddColumn(sizeof(duint) * 2, TranslatedString.c_str());
|
||||
TranslatedString = GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Data"));
|
||||
TranslatedString = GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Data"));
|
||||
GuiReferenceAddColumn(0, TranslatedString.c_str());
|
||||
GuiReferenceSetRowCount(0);
|
||||
GuiReferenceReloadData();
|
||||
|
@ -955,9 +955,9 @@ static bool cbRefFind(Capstone* disasm, BASIC_INSTRUCTION_INFO* basicinfo, REFIN
|
|||
{
|
||||
String TranslatedString;
|
||||
GuiReferenceInitialize(refinfo->name);
|
||||
TranslatedString = GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Address"));
|
||||
TranslatedString = GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Address"));
|
||||
GuiReferenceAddColumn(sizeof(duint) * 2, TranslatedString.c_str());
|
||||
TranslatedString = GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Disassembly"));
|
||||
TranslatedString = GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Disassembly"));
|
||||
GuiReferenceAddColumn(10, TranslatedString.c_str());
|
||||
GuiReferenceSetRowCount(0);
|
||||
GuiReferenceReloadData();
|
||||
|
@ -1039,9 +1039,9 @@ CMDRESULT cbInstrRefFindRange(int argc, char* argv[])
|
|||
duint ticks = GetTickCount();
|
||||
char title[256] = "";
|
||||
if(range.start == range.end)
|
||||
sprintf_s(title, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Constant: %p")), range.start);
|
||||
sprintf_s(title, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Constant: %p")), range.start);
|
||||
else
|
||||
sprintf_s(title, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Range: %p-%p")), range.start, range.end);
|
||||
sprintf_s(title, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Range: %p-%p")), range.start, range.end);
|
||||
|
||||
duint refFindType = CURRENT_REGION;
|
||||
if(argc >= 6 && valfromstring(argv[5], &refFindType, true))
|
||||
|
@ -1060,11 +1060,11 @@ bool cbRefStr(Capstone* disasm, BASIC_INSTRUCTION_INFO* basicinfo, REFINFO* refi
|
|||
{
|
||||
String TranslatedString;
|
||||
GuiReferenceInitialize(refinfo->name);
|
||||
TranslatedString = GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Address"));
|
||||
TranslatedString = GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Address"));
|
||||
GuiReferenceAddColumn(2 * sizeof(duint), TranslatedString.c_str());
|
||||
TranslatedString = GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Disassembly"));
|
||||
TranslatedString = GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Disassembly"));
|
||||
GuiReferenceAddColumn(64, TranslatedString.c_str());
|
||||
TranslatedString = GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "String"));
|
||||
TranslatedString = GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "String"));
|
||||
GuiReferenceAddColumn(500, TranslatedString.c_str());
|
||||
GuiReferenceSetSearchStartCol(2); //only search the strings
|
||||
GuiReferenceReloadData();
|
||||
|
@ -1119,7 +1119,7 @@ CMDRESULT cbInstrRefStr(int argc, char* argv[])
|
|||
if(refFindType != CURRENT_REGION && refFindType != CURRENT_MODULE && refFindType != ALL_MODULES)
|
||||
refFindType = CURRENT_REGION;
|
||||
|
||||
TranslatedString = GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Strings"));
|
||||
TranslatedString = GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Strings"));
|
||||
int found = RefFind(addr, size, cbRefStr, 0, false, TranslatedString.c_str(), (REFFINDTYPE)refFindType, false);
|
||||
dprintf(QT_TRANSLATE_NOOP("DBG", "%u string(s) in %ums\n"), found, GetTickCount() - ticks);
|
||||
varset("$result", found, false);
|
||||
|
@ -1336,7 +1336,7 @@ CMDRESULT cbInstrFindAll(int argc, char* argv[])
|
|||
if(len > 16)
|
||||
strcat_s(patternshort, "...");
|
||||
char patterntitle[256] = "";
|
||||
sprintf_s(patterntitle, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Pattern: %s")), patternshort);
|
||||
sprintf_s(patterntitle, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Pattern: %s")), patternshort);
|
||||
GuiReferenceInitialize(patterntitle);
|
||||
GuiReferenceAddColumn(2 * sizeof(duint), "Address");
|
||||
if(findData)
|
||||
|
@ -1455,7 +1455,7 @@ CMDRESULT cbInstrFindMemAll(int argc, char* argv[])
|
|||
if(len > 16)
|
||||
strcat_s(patternshort, "...");
|
||||
char patterntitle[256] = "";
|
||||
sprintf_s(patterntitle, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Pattern: %s")), patternshort);
|
||||
sprintf_s(patterntitle, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Pattern: %s")), patternshort);
|
||||
GuiReferenceInitialize(patterntitle);
|
||||
GuiReferenceAddColumn(2 * sizeof(duint), "Address");
|
||||
if(findData)
|
||||
|
@ -1715,15 +1715,15 @@ CMDRESULT cbInstrArgumentList(int argc, char* argv[])
|
|||
{
|
||||
//setup reference view
|
||||
String TranslatedString;
|
||||
TranslatedString = GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Arguments"));
|
||||
TranslatedString = GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Arguments"));
|
||||
GuiReferenceInitialize(TranslatedString.c_str());
|
||||
TranslatedString = GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Start"));
|
||||
TranslatedString = GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Start"));
|
||||
GuiReferenceAddColumn(2 * sizeof(duint), TranslatedString.c_str());
|
||||
TranslatedString = GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "End"));
|
||||
TranslatedString = GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "End"));
|
||||
GuiReferenceAddColumn(2 * sizeof(duint), TranslatedString.c_str());
|
||||
TranslatedString = GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Disassembly (Start)"));
|
||||
TranslatedString = GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Disassembly (Start)"));
|
||||
GuiReferenceAddColumn(64, TranslatedString.c_str());
|
||||
TranslatedString = GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Label/Comment"));
|
||||
TranslatedString = GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Label/Comment"));
|
||||
GuiReferenceAddColumn(10, TranslatedString.c_str());
|
||||
GuiReferenceReloadData();
|
||||
size_t cbsize;
|
||||
|
@ -1827,9 +1827,9 @@ static bool cbFindAsm(Capstone* disasm, BASIC_INSTRUCTION_INFO* basicinfo, REFIN
|
|||
{
|
||||
String TranslatedString;
|
||||
GuiReferenceInitialize(refinfo->name);
|
||||
TranslatedString = GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Address"));
|
||||
TranslatedString = GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Address"));
|
||||
GuiReferenceAddColumn(2 * sizeof(duint), TranslatedString.c_str());
|
||||
TranslatedString = GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Disassembly"));
|
||||
TranslatedString = GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Disassembly"));
|
||||
GuiReferenceAddColumn(0, TranslatedString.c_str());
|
||||
GuiReferenceReloadData();
|
||||
return true;
|
||||
|
@ -2141,11 +2141,11 @@ CMDRESULT cbInstrYara(int argc, char* argv[])
|
|||
fullName += ")"; //nanana, very ugly code (long live open source)
|
||||
GuiReferenceInitialize(fullName.c_str());
|
||||
String TranslatedString;
|
||||
TranslatedString = GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Address"));
|
||||
TranslatedString = GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Address"));
|
||||
GuiReferenceAddColumn(sizeof(duint) * 2, TranslatedString.c_str());
|
||||
TranslatedString = GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Rule"));
|
||||
TranslatedString = GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Rule"));
|
||||
GuiReferenceAddColumn(48, TranslatedString.c_str());
|
||||
TranslatedString = GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Data"));
|
||||
TranslatedString = GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Data"));
|
||||
GuiReferenceAddColumn(10, TranslatedString.c_str());
|
||||
GuiReferenceSetRowCount(0);
|
||||
GuiReferenceReloadData();
|
||||
|
|
|
@ -58,9 +58,9 @@ void MemUpdateMap()
|
|||
if(bReserved)
|
||||
{
|
||||
if(duint(curPage.mbi.BaseAddress) != allocationBase)
|
||||
sprintf_s(curPage.info, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Reserved (%p)")), allocationBase);
|
||||
sprintf_s(curPage.info, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Reserved (%p)")), allocationBase);
|
||||
else
|
||||
strcpy_s(curPage.info, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Reserved")));
|
||||
strcpy_s(curPage.info, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Reserved")));
|
||||
}
|
||||
else if(!ModNameFromAddr(pageStart, curPage.info, true))
|
||||
{
|
||||
|
@ -199,7 +199,7 @@ void MemUpdateMap()
|
|||
|
||||
if(pageBase == tebBase)
|
||||
{
|
||||
sprintf_s(page.info, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Thread %X TEB")), threadId);
|
||||
sprintf_s(page.info, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Thread %X TEB")), threadId);
|
||||
break;
|
||||
}
|
||||
else if(pageBase == tebBaseWow64)
|
||||
|
@ -207,7 +207,7 @@ void MemUpdateMap()
|
|||
#ifndef _WIN64
|
||||
if(pageSize == (3 * PAGE_SIZE))
|
||||
{
|
||||
sprintf_s(page.info, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Thread %X WoW64 TEB")), threadId);
|
||||
sprintf_s(page.info, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Thread %X WoW64 TEB")), threadId);
|
||||
break;
|
||||
}
|
||||
#endif // ndef _WIN64
|
||||
|
@ -224,7 +224,7 @@ void MemUpdateMap()
|
|||
duint stackAddr = (duint)tib.StackLimit;
|
||||
|
||||
if(stackAddr >= pageBase && stackAddr < (pageBase + pageSize))
|
||||
sprintf_s(page.info, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Thread %X Stack")), threadId);
|
||||
sprintf_s(page.info, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Thread %X Stack")), threadId);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -85,9 +85,9 @@ String MnemonicHelp::getUniversalMnemonic(const String & mnem)
|
|||
String MnemonicHelp::getDescription(const char* mnem, int depth)
|
||||
{
|
||||
if(mnem == nullptr)
|
||||
return GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Invalid mnemonic!"));
|
||||
return GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Invalid mnemonic!"));
|
||||
if(depth == 10)
|
||||
return GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Too many redirections..."));
|
||||
return GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Too many redirections..."));
|
||||
SHARED_ACQUIRE(LockMnemonicHelp);
|
||||
auto mnemuni = getUniversalMnemonic(mnem);
|
||||
auto found = MnemonicMap.find(mnemuni);
|
||||
|
@ -114,11 +114,11 @@ String MnemonicHelp::getDescription(const char* mnem, int depth)
|
|||
String MnemonicHelp::getBriefDescription(const char* mnem)
|
||||
{
|
||||
if(mnem == nullptr)
|
||||
return GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Invalid mnemonic!"));
|
||||
return GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Invalid mnemonic!"));
|
||||
SHARED_ACQUIRE(LockMnemonicHelp);
|
||||
auto mnemLower = StringUtils::ToLower(mnem);
|
||||
if(mnemLower == "???")
|
||||
return GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "invalid instruction"));
|
||||
return GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "invalid instruction"));
|
||||
auto found = MnemonicBriefMap.find(mnemLower);
|
||||
if(found == MnemonicBriefMap.end())
|
||||
{
|
||||
|
|
|
@ -185,7 +185,7 @@ int PatchFile(const PATCHINFO* List, int Count, const char* FileName, char* Erro
|
|||
{
|
||||
// Notify the user of the error
|
||||
if(Error)
|
||||
strcpy_s(Error, MAX_ERROR_SIZE, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "No patches to apply")));
|
||||
strcpy_s(Error, MAX_ERROR_SIZE, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "No patches to apply")));
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
@ -200,7 +200,7 @@ int PatchFile(const PATCHINFO* List, int Count, const char* FileName, char* Erro
|
|||
if(_stricmp(List[i].mod, moduleName))
|
||||
{
|
||||
if(Error)
|
||||
sprintf_s(Error, MAX_ERROR_SIZE, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Not all patches are in module %s")), moduleName);
|
||||
sprintf_s(Error, MAX_ERROR_SIZE, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Not all patches are in module %s")), moduleName);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
@ -212,7 +212,7 @@ int PatchFile(const PATCHINFO* List, int Count, const char* FileName, char* Erro
|
|||
if(!moduleBase)
|
||||
{
|
||||
if(Error)
|
||||
sprintf_s(Error, MAX_ERROR_SIZE, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Failed to get base of module %s")), moduleName);
|
||||
sprintf_s(Error, MAX_ERROR_SIZE, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Failed to get base of module %s")), moduleName);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
@ -222,7 +222,7 @@ int PatchFile(const PATCHINFO* List, int Count, const char* FileName, char* Erro
|
|||
if(!ModPathFromAddr(moduleBase, modPath, MAX_PATH))
|
||||
{
|
||||
if(Error)
|
||||
sprintf_s(Error, MAX_ERROR_SIZE, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Failed to get module path of module %s")), moduleName);
|
||||
sprintf_s(Error, MAX_ERROR_SIZE, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Failed to get module path of module %s")), moduleName);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
@ -234,7 +234,7 @@ int PatchFile(const PATCHINFO* List, int Count, const char* FileName, char* Erro
|
|||
if(!CopyFileW(srcPath.c_str(), dstPath.c_str(), false))
|
||||
{
|
||||
if(Error)
|
||||
strcpy_s(Error, MAX_ERROR_SIZE, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Failed to make a copy of the original file (patch target is in use?)")));
|
||||
strcpy_s(Error, MAX_ERROR_SIZE, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Failed to make a copy of the original file (patch target is in use?)")));
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
@ -245,7 +245,7 @@ int PatchFile(const PATCHINFO* List, int Count, const char* FileName, char* Erro
|
|||
if(fileAttrs == INVALID_FILE_ATTRIBUTES)
|
||||
{
|
||||
if(Error)
|
||||
strcpy_s(Error, MAX_ERROR_SIZE, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Unable to obtain attributes for copied file")));
|
||||
strcpy_s(Error, MAX_ERROR_SIZE, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Unable to obtain attributes for copied file")));
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
@ -260,7 +260,7 @@ int PatchFile(const PATCHINFO* List, int Count, const char* FileName, char* Erro
|
|||
if(!StaticFileLoadW(dstPath.c_str(), UE_ACCESS_ALL, false, &fileHandle, &loadedSize, &fileMap, &fileMapVa))
|
||||
{
|
||||
if(Error)
|
||||
strcpy_s(Error, MAX_ERROR_SIZE, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "StaticFileLoad failed")));
|
||||
strcpy_s(Error, MAX_ERROR_SIZE, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "StaticFileLoad failed")));
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
@ -285,7 +285,7 @@ int PatchFile(const PATCHINFO* List, int Count, const char* FileName, char* Erro
|
|||
if(!StaticFileUnloadW(dstPath.c_str(), true, fileHandle, loadedSize, fileMap, fileMapVa))
|
||||
{
|
||||
if(Error)
|
||||
strcpy_s(Error, MAX_ERROR_SIZE, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "StaticFileUnload failed")));
|
||||
strcpy_s(Error, MAX_ERROR_SIZE, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "StaticFileUnload failed")));
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
|
|
@ -47,9 +47,9 @@ int RefFind(duint Address, duint Size, CBREF Callback, void* UserData, bool Sile
|
|||
|
||||
// Determine the full module name
|
||||
if(ModNameFromAddr(scanStart, moduleName, true))
|
||||
sprintf_s(fullName, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "%s (Region %s)")), Name, moduleName);
|
||||
sprintf_s(fullName, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "%s (Region %s)")), Name, moduleName);
|
||||
else
|
||||
sprintf_s(fullName, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "%s (Region %p)")), Name, scanStart);
|
||||
sprintf_s(fullName, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "%s (Region %p)")), Name, scanStart);
|
||||
|
||||
// Initialize disassembler
|
||||
Capstone cp;
|
||||
|
@ -61,7 +61,7 @@ int RefFind(duint Address, duint Size, CBREF Callback, void* UserData, bool Sile
|
|||
|
||||
RefFindInRange(scanStart, scanSize, Callback, UserData, Silent, refInfo, cp, true, [](int percent)
|
||||
{
|
||||
GuiReferenceSetCurrentTaskProgress(percent, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Region Search")));
|
||||
GuiReferenceSetCurrentTaskProgress(percent, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Region Search")));
|
||||
GuiReferenceSetProgress(percent);
|
||||
}, disasmText);
|
||||
}
|
||||
|
@ -102,7 +102,7 @@ int RefFind(duint Address, duint Size, CBREF Callback, void* UserData, bool Sile
|
|||
|
||||
RefFindInRange(scanStart, scanSize, Callback, UserData, Silent, refInfo, cp, true, [](int percent)
|
||||
{
|
||||
GuiReferenceSetCurrentTaskProgress(percent, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Module Search")));
|
||||
GuiReferenceSetCurrentTaskProgress(percent, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Module Search")));
|
||||
GuiReferenceSetProgress(percent);
|
||||
}, disasmText);
|
||||
}
|
||||
|
@ -124,7 +124,7 @@ int RefFind(duint Address, duint Size, CBREF Callback, void* UserData, bool Sile
|
|||
Capstone cp;
|
||||
|
||||
// Determine the full module
|
||||
sprintf_s(fullName, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "All Modules (%s)")), Name);
|
||||
sprintf_s(fullName, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "All Modules (%s)")), Name);
|
||||
|
||||
// Allow an "initialization" notice
|
||||
refInfo.refcount = 0;
|
||||
|
|
|
@ -79,7 +79,7 @@ static bool scriptcreatelinemap(const char* filename)
|
|||
String filedata;
|
||||
if(!FileHelper::ReadAllText(filename, filedata))
|
||||
{
|
||||
String TranslatedString = GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "FileHelper::ReadAllText failed..."));
|
||||
String TranslatedString = GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "FileHelper::ReadAllText failed..."));
|
||||
GuiScriptError(0, TranslatedString.c_str());
|
||||
return false;
|
||||
}
|
||||
|
@ -306,7 +306,7 @@ static CMDRESULT scriptinternalcmdexec(const char* cmd)
|
|||
{
|
||||
if(!scriptstack.size()) //nothing on the stack
|
||||
{
|
||||
String TranslatedString = GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Script finished!"));
|
||||
String TranslatedString = GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Script finished!"));
|
||||
GuiScriptMessage(TranslatedString.c_str());
|
||||
return STATUS_EXIT;
|
||||
}
|
||||
|
|
|
@ -30,9 +30,9 @@ void stackupdateseh()
|
|||
for(duint i = 0; i < count; i++)
|
||||
{
|
||||
if(i + 1 != count)
|
||||
sprintf_s(comment.comment, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Pointer to SEH_Record[%d]")), i + 1);
|
||||
sprintf_s(comment.comment, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Pointer to SEH_Record[%d]")), i + 1);
|
||||
else
|
||||
sprintf_s(comment.comment, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "End of SEH Chain")));
|
||||
sprintf_s(comment.comment, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "End of SEH Chain")));
|
||||
newcache.insert({ SEHList[i], comment });
|
||||
}
|
||||
}
|
||||
|
@ -100,10 +100,10 @@ bool stackcommentget(duint addr, STACK_COMMENT* comment)
|
|||
if(!*label)
|
||||
sprintf(label, "%p", data);
|
||||
strcat_s(returnFromAddr, label);
|
||||
sprintf_s(comment->comment, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "return to %s from %s")), returnToAddr, returnFromAddr);
|
||||
sprintf_s(comment->comment, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "return to %s from %s")), returnToAddr, returnFromAddr);
|
||||
}
|
||||
else
|
||||
sprintf_s(comment->comment, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "return to %s from ???")), returnToAddr);
|
||||
sprintf_s(comment->comment, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "return to %s from ???")), returnToAddr);
|
||||
strcpy_s(comment->color, "!rtnclr"); // Special token for return address color;
|
||||
return true;
|
||||
}
|
||||
|
@ -187,9 +187,9 @@ void StackEntryFromFrame(CALLSTACKENTRY* Entry, duint Address, duint From, duint
|
|||
strncpy_s(returnToAddr, getSymAddrName(Entry->to).c_str(), _TRUNCATE);
|
||||
|
||||
if(Entry->from)
|
||||
sprintf_s(Entry->comment, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "return to %s from %s")), returnToAddr, getSymAddrName(Entry->from).c_str());
|
||||
sprintf_s(Entry->comment, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "return to %s from %s")), returnToAddr, getSymAddrName(Entry->from).c_str());
|
||||
else
|
||||
sprintf_s(Entry->comment, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "return to %s from ???")), returnToAddr);
|
||||
sprintf_s(Entry->comment, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "return to %s from ???")), returnToAddr);
|
||||
}
|
||||
|
||||
#define MAX_CALLSTACK_CACHE 20
|
||||
|
|
|
@ -136,7 +136,7 @@ static String handleFormatString(const String & formatString, const FormatValueV
|
|||
auto argnum = getArgNumType(formatString, type);
|
||||
if(type != ValueType::Unknown && argnum < values.size())
|
||||
return printValue(values.at(argnum), type);
|
||||
return GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "[Formatting Error]"));
|
||||
return GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "[Formatting Error]"));
|
||||
}
|
||||
|
||||
String stringformat(String format, const FormatValueVector & values)
|
||||
|
@ -194,7 +194,7 @@ static String handleFormatStringInline(const String & formatString)
|
|||
auto value = getArgExpressionType(formatString, type);
|
||||
if(value && *value)
|
||||
return printValue(value, type);
|
||||
return GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "[Formatting Error]"));
|
||||
return GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "[Formatting Error]"));
|
||||
}
|
||||
|
||||
String stringformatinline(String format)
|
||||
|
|
|
@ -35,7 +35,7 @@ void ThreadCreate(CREATE_THREAD_DEBUG_INFO* CreateThread)
|
|||
|
||||
// The first thread (#0) is always the main program thread
|
||||
if(curInfo.ThreadNumber <= 0)
|
||||
strcpy_s(curInfo.threadName, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Main Thread")));
|
||||
strcpy_s(curInfo.threadName, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Main Thread")));
|
||||
|
||||
// Modify global thread list
|
||||
EXCLUSIVE_ACQUIRE(LockThreads);
|
||||
|
|
|
@ -122,7 +122,7 @@ unsigned int WatchAddExprUnlocked(const char* expr, WATCHVARTYPE type)
|
|||
{
|
||||
unsigned int newid = InterlockedExchangeAdd(&idCounter, 1);
|
||||
char DefaultName[MAX_WATCH_NAME_SIZE];
|
||||
sprintf_s(DefaultName, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Watch %u")), newid);
|
||||
sprintf_s(DefaultName, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Watch %u")), newid);
|
||||
WatchExpr* newWatch = new WatchExpr(DefaultName, expr, type);
|
||||
auto temp = watchexpr.emplace(std::make_pair(newid, newWatch));
|
||||
if(temp.second)
|
||||
|
|
|
@ -523,7 +523,7 @@ extern "C" DLL_EXPORT const char* _dbg_dbginit()
|
|||
|
||||
if(strstr(szSymbolCachePath, "http://") || strstr(szSymbolCachePath, "https://"))
|
||||
{
|
||||
if(Script::Gui::MessageYesNo(GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "It is strongly discouraged to use symbol servers in your path directly (use the store option instead).\n\nDo you want me to fix this?"))))
|
||||
if(Script::Gui::MessageYesNo(GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "It is strongly discouraged to use symbol servers in your path directly (use the store option instead).\n\nDo you want me to fix this?"))))
|
||||
{
|
||||
strcpy_s(szSymbolCachePath, szLocalSymbolPath);
|
||||
BridgeSettingSet("Symbols", "CachePath", ".\\symbols");
|
||||
|
@ -544,13 +544,13 @@ extern "C" DLL_EXPORT const char* _dbg_dbginit()
|
|||
ExpressionFunctions::Init();
|
||||
dputs(QT_TRANSLATE_NOOP("DBG", "Registering expression functions..."));
|
||||
SCRIPTTYPEINFO info;
|
||||
strcpy_s(info.name, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Default")));
|
||||
strcpy_s(info.name, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Default")));
|
||||
info.id = 0;
|
||||
info.execute = DbgCmdExec;
|
||||
info.completeCommand = nullptr;
|
||||
GuiRegisterScriptLanguage(&info);
|
||||
dputs(QT_TRANSLATE_NOOP("DBG", "Registering Script DLL command handler..."));
|
||||
strcpy_s(info.name, GuiTranslateDbg(QT_TRANSLATE_NOOP("DBG", "Script DLL")));
|
||||
strcpy_s(info.name, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Script DLL")));
|
||||
info.execute = DbgScriptDllExec;
|
||||
GuiRegisterScriptLanguage(&info);
|
||||
dputs(QT_TRANSLATE_NOOP("DBG", "Starting command loop..."));
|
||||
|
|
|
@ -664,17 +664,18 @@ __declspec(dllexport) void* _gui_sendmessage(GUIMSG type, void* param1, void* pa
|
|||
return Bridge::getBridge()->processMessage(type, param1, param2);
|
||||
}
|
||||
|
||||
static char translateBuffer[4096] = {0};
|
||||
|
||||
__declspec(dllexport) const char* _gui_translate_dbg(const char* source)
|
||||
__declspec(dllexport) const char* _gui_translate_text(const char* source)
|
||||
{
|
||||
if(translationsReady)
|
||||
if(TLS_TranslatedStringMap)
|
||||
{
|
||||
QByteArray translatedUtf8 = QCoreApplication::translate("DBG", source).toUtf8();
|
||||
translateBuffer[translatedUtf8.size()] = 0; // Set the string terminator first.
|
||||
memcpy(translateBuffer, translatedUtf8.constData(), std::min((size_t)translatedUtf8.size(), sizeof(translateBuffer) - 1)); // Then copy the string safely.
|
||||
return translateBuffer; // Don't need to free this memory. But this pointer should be used immediately to reduce race condition.
|
||||
//Use a thread-local buffer is probably better.
|
||||
// Boom... VS does not support "thread_local"... and cannot use "__declspec(thread)" in a DLL... https://blogs.msdn.microsoft.com/oldnewthing/20101122-00/?p=12233
|
||||
// Simulating Thread Local Storage with a map...
|
||||
DWORD ThreadId = GetCurrentThreadId();
|
||||
TranslatedStringStorage & TranslatedString = (*TLS_TranslatedStringMap)[ThreadId];
|
||||
TranslatedString.Data[translatedUtf8.size()] = 0; // Set the string terminator first.
|
||||
memcpy(TranslatedString.Data, translatedUtf8.constData(), std::min((size_t)translatedUtf8.size(), sizeof(TranslatedString.Data) - 1)); // Then copy the string safely.
|
||||
return TranslatedString.Data; // Don't need to free this memory. But this pointer should be used immediately to reduce race condition.
|
||||
}
|
||||
else // Translators are not initialized yet.
|
||||
return source;
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
#ifdef BUILD_LIB
|
||||
extern "C" __declspec(dllexport) int _gui_guiinit(int argc, char* argv[]);
|
||||
extern "C" __declspec(dllexport) void* _gui_sendmessage(GUIMSG type, void* param1, void* param2);
|
||||
extern "C" __declspec(dllexport) const char* _gui_translate_dbg(const char* source);
|
||||
extern "C" __declspec(dllexport) const char* _gui_translate_text(const char* source);
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
@ -51,7 +51,9 @@ bool MyApplication::notify(QObject* receiver, QEvent* event)
|
|||
|
||||
static Configuration* mConfiguration;
|
||||
char currentLocale[MAX_SETTING_SIZE] = "";
|
||||
bool translationsReady = false;
|
||||
// Boom... VS does not support "thread_local"... and cannot use "__declspec(thread)" in a DLL... https://blogs.msdn.microsoft.com/oldnewthing/20101122-00/?p=12233
|
||||
// Simulating Thread Local Storage with a map...
|
||||
std::map<DWORD, TranslatedStringStorage>* TLS_TranslatedStringMap; //key = Thread Id, value = Translate Buffer
|
||||
|
||||
static bool isValidLocale(const QString & locale)
|
||||
{
|
||||
|
@ -105,7 +107,7 @@ int main(int argc, char* argv[])
|
|||
if(x64dbg_dbg_Translator.load(QString("x64dbg_dbg_%1").arg(currentLocale), path))
|
||||
application.installTranslator(&x64dbg_dbg_Translator);
|
||||
|
||||
translationsReady = true;
|
||||
TLS_TranslatedStringMap = new std::map<DWORD, TranslatedStringStorage>();
|
||||
|
||||
// initialize capstone
|
||||
Capstone::GlobalInitialize();
|
||||
|
@ -158,6 +160,12 @@ int main(int argc, char* argv[])
|
|||
#endif
|
||||
delete mainWindow;
|
||||
mConfiguration->save(); //save config on exit
|
||||
{
|
||||
//delete tls
|
||||
auto temp = TLS_TranslatedStringMap;
|
||||
TLS_TranslatedStringMap = nullptr;
|
||||
delete temp;
|
||||
}
|
||||
|
||||
//TODO free capstone/config/bridge and prevent use after free.
|
||||
|
||||
|
|
|
@ -22,7 +22,12 @@ public:
|
|||
|
||||
int main(int argc, char* argv[]);
|
||||
extern char currentLocale[MAX_SETTING_SIZE];
|
||||
extern bool translationsReady;
|
||||
|
||||
struct TranslatedStringStorage
|
||||
{
|
||||
char Data[4096];
|
||||
};
|
||||
extern std::map<DWORD, TranslatedStringStorage>* TLS_TranslatedStringMap;
|
||||
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
|
||||
class x64GlobalFilter : public QAbstractNativeEventFilter
|
||||
|
|
Loading…
Reference in New Issue