From e6297423f9f455904f58d7022a28fe8501101f0e Mon Sep 17 00:00:00 2001 From: torusrxxx Date: Sun, 5 Nov 2017 21:37:19 +0800 Subject: [PATCH] Add NTSTATUS fmt;show str in locals tab;fix div by 0 in data copy dlg. --- src/dbg/formatfunctions.cpp | 50 ++++++++++++++++++++++++++++-- src/gui/Src/Gui/CPUInfoBox.cpp | 43 ++----------------------- src/gui/Src/Gui/CPUInfoBox.h | 1 - src/gui/Src/Gui/DataCopyDialog.cpp | 22 ++++++------- src/gui/Src/Gui/DataCopyDialog.ui | 9 ++++-- src/gui/Src/Gui/LocalVarsView.cpp | 2 +- src/gui/Src/Utils/MiscUtil.cpp | 37 ++++++++++++++++++++++ src/gui/Src/Utils/MiscUtil.h | 1 + 8 files changed, 107 insertions(+), 58 deletions(-) diff --git a/src/dbg/formatfunctions.cpp b/src/dbg/formatfunctions.cpp index da77143c..4def890d 100644 --- a/src/dbg/formatfunctions.cpp +++ b/src/dbg/formatfunctions.cpp @@ -38,11 +38,10 @@ void FormatFunctions::Init() { std::vector helpMessage(destCount); String errName = ErrorCodeToName((unsigned int)code); - if(errName.size() == 0) - errName = StringUtils::sprintf("%08X", DWORD(code)); #ifdef _WIN64 if((code >> 32) != 0) //Data in high part: not an error code { + errName = StringUtils::sprintf("%p", code); if(destCount < errName.size() + 1) return FORMAT_BUFFER_TOO_SMALL; else @@ -52,11 +51,56 @@ void FormatFunctions::Init() } } #endif //_WIN64 + if(errName.size() == 0) + errName = StringUtils::sprintf("%08X", DWORD(code)); DWORD success = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, DWORD(code), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), helpMessage.data(), DWORD(destCount), NULL); if(success > 0) { String UTF8ErrorMessage = StringUtils::Utf16ToUtf8(helpMessage.data()); - if(destCount < errName.size() + 2 + UTF8ErrorMessage.size()) + if(destCount < errName.size() + 3 + UTF8ErrorMessage.size()) + return FORMAT_BUFFER_TOO_SMALL; + else + { + sprintf_s(dest, destCount, "%s: %s", errName.c_str(), UTF8ErrorMessage.c_str()); + return FORMAT_SUCCESS; + } + } + else + { + if(destCount < errName.size() + 1) + return FORMAT_BUFFER_TOO_SMALL; + else + { + memcpy(dest, errName.c_str(), errName.size() + 1); + return FORMAT_SUCCESS; + } + } + }); + + Register("ntstatus", [](char* dest, size_t destCount, int argc, char* argv[], duint code, void* userdata) + { + std::vector helpMessage(destCount); + String errName = ErrorCodeToName((unsigned int)code); +#ifdef _WIN64 + if((code >> 32) != 0) //Data in high part: not an error code + { + errName = StringUtils::sprintf("%p", code); + if(destCount < errName.size() + 1) + return FORMAT_BUFFER_TOO_SMALL; + else + { + memcpy(dest, errName.c_str(), errName.size() + 1); + return FORMAT_SUCCESS; + } + } +#endif //_WIN64 + if(errName.size() == 0) + errName = StringUtils::sprintf("%08X", DWORD(code)); + DWORD success = FormatMessageW(FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS, GetModuleHandleW(L"ntdll.dll"), DWORD(code), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), helpMessage.data(), DWORD(destCount), NULL); + if(success > 0) + { + String UTF8ErrorMessage = StringUtils::Utf16ToUtf8(helpMessage.data()); + if(destCount < errName.size() + 3 + UTF8ErrorMessage.size()) return FORMAT_BUFFER_TOO_SMALL; else { diff --git a/src/gui/Src/Gui/CPUInfoBox.cpp b/src/gui/Src/Gui/CPUInfoBox.cpp index 6a1f86c6..bdc85ab7 100644 --- a/src/gui/Src/Gui/CPUInfoBox.cpp +++ b/src/gui/Src/Gui/CPUInfoBox.cpp @@ -81,43 +81,6 @@ void CPUInfoBox::clear() setInfoLine(3, ""); } -QString CPUInfoBox::getSymbolicName(dsint addr) -{ - char labelText[MAX_LABEL_SIZE] = ""; - char moduleText[MAX_MODULE_SIZE] = ""; - char string[MAX_STRING_SIZE] = ""; - bool bHasString = DbgGetStringAt(addr, string); - bool bHasLabel = DbgGetLabelAt(addr, SEG_DEFAULT, labelText); - bool bHasModule = (DbgGetModuleAt(addr, moduleText) && !QString(labelText).startsWith("JMP.&")); - QString addrText = DbgMemIsValidReadPtr(addr) ? ToPtrString(addr) : ToHexString(addr); - QString finalText; - if(bHasString) - finalText = addrText + " " + QString(string); - else if(bHasLabel && bHasModule) // - finalText = QString("<%1.%2>").arg(moduleText).arg(labelText); - else if(bHasModule) //module.addr - finalText = QString("%1.%2").arg(moduleText).arg(addrText); - else if(bHasLabel) //