1
0
Fork 0

Thread Safe

This commit is contained in:
torusrxxx 2016-08-23 10:46:25 +08:00
parent 2324106748
commit 740684100c
23 changed files with 116 additions and 105 deletions

View File

@ -2,7 +2,7 @@
GUIGUIINIT _gui_guiinit;
GUISENDMESSAGE _gui_sendmessage;
GUITRANSLATEDBG _gui_translate_dbg;
GUITRANSLATETEXT _gui_translate_text;
DBGDBGINIT _dbg_dbginit;
DBGMEMFINDBASEADDR _dbg_memfindbaseaddr;

View File

@ -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)();

View File

@ -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)

View File

@ -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);

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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

View File

@ -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[])

View File

@ -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();

View File

@ -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);
}
}

View File

@ -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())
{

View File

@ -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;
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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

View File

@ -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)

View File

@ -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);

View File

@ -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)

View File

@ -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..."));

View File

@ -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;

View File

@ -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

View File

@ -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.

View File

@ -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