CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
Path: blob/master/Windows/Debugger/EditSymbolsWindow.cpp
Views: 1401
#include "EditSymbolsWindow.h"1#include "../resource.h"234bool EditSymbolsWindow::GetCheckState(HWND hwnd, int dlgItem) {5return SendMessage(GetDlgItem(hwnd, dlgItem), BM_GETCHECK, 0, 0) != 0;6}78bool EditSymbolsWindow::fetchDialogData(HWND hwnd)9{10char str[256], errorMessage[512];11PostfixExpression exp;1213scan_ = GetCheckState(hwnd, IDC_EDITSYMBOLS_SCAN);1415// Parse the address16GetWindowTextA(GetDlgItem(hwnd, IDC_EDITSYMBOLS_ADDRESS), str, 256);1718if (cpu->initExpression(str, exp) == false)19{20snprintf(errorMessage, sizeof(errorMessage), "Invalid expression \"%s\": %s", str, getExpressionError());21MessageBoxA(hwnd, errorMessage, "Error", MB_OK);22return false;23}24if (cpu->parseExpression(exp, address_) == false)25{26snprintf(errorMessage, sizeof(errorMessage), "Invalid expression \"%s\": %s", str, getExpressionError());27MessageBoxA(hwnd, errorMessage, "Error", MB_OK);28return false;29}3031// Parse the size32GetWindowTextA(GetDlgItem(hwnd, IDC_EDITSYMBOLS_SIZE), str, 256);3334if (cpu->initExpression(str, exp) == false)35{36snprintf(errorMessage, sizeof(errorMessage), "Invalid expression \"%s\": %s", str, getExpressionError());37MessageBoxA(hwnd, errorMessage, "Error", MB_OK);38return false;39}40if (cpu->parseExpression(exp, size_) == false)41{42snprintf(errorMessage, sizeof(errorMessage), "Invalid expression \"%s\": %s", str, getExpressionError());43MessageBoxA(hwnd, errorMessage, "Error", MB_OK);44return false;45}4647// Now let's validate the range48if (!Memory::IsValidRange(address_, size_)) {49MessageBoxA(hwnd, "Invalid range", "Error", MB_OK);50return false;51}5253return true;54}5556INT_PTR CALLBACK EditSymbolsWindow::StaticDlgFunc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam) {57EditSymbolsWindow *thiz;58if (iMsg == WM_INITDIALOG) {59SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)lParam);60thiz = (EditSymbolsWindow *)lParam;61}62else {63thiz = (EditSymbolsWindow *)GetWindowLongPtr(hWnd, GWLP_USERDATA);64}6566if (!thiz)67return FALSE;68return thiz->DlgFunc(hWnd, iMsg, wParam, lParam);69}7071INT_PTR EditSymbolsWindow::DlgFunc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)72{73char str[128];7475switch (iMsg)76{77case WM_INITDIALOG:7879// Set the radiobutton values80SendMessage(GetDlgItem(hwnd, IDC_EDITSYMBOLS_SCAN), BM_SETCHECK, scan_ ? BST_CHECKED : BST_UNCHECKED, 0);81SendMessage(GetDlgItem(hwnd, IDC_EDITSYMBOLS_REMOVE), BM_SETCHECK, scan_ ? BST_UNCHECKED : BST_CHECKED, 0);8283// Set the text in the textboxes84if (address_ != -1) {85snprintf(str, sizeof(str), "0x%08X", address_);86SetWindowTextA(GetDlgItem(hwnd, IDC_EDITSYMBOLS_ADDRESS), str);87}88snprintf(str, sizeof(str), "0x%08X", size_);89SetWindowTextA(GetDlgItem(hwnd, IDC_EDITSYMBOLS_SIZE), str);9091return TRUE;92case WM_COMMAND:93switch (LOWORD(wParam))94{95case IDC_EDITSYMBOLS_SCAN:96switch (HIWORD(wParam))97{98case BN_CLICKED:99scan_ = true;100break;101}102break;103case IDC_EDITSYMBOLS_REMOVE:104switch (HIWORD(wParam))105{106case BN_CLICKED:107scan_ = false;108break;109}110break;111case IDC_EDITSYMBOLS_OK:112switch (HIWORD(wParam))113{114case BN_CLICKED:115if (fetchDialogData(hwnd)) {116EndDialog(hwnd, true);117}118break;119};120break;121case IDC_EDITSYMBOLS_CANCEL:122switch (HIWORD(wParam))123{124case BN_CLICKED:125EndDialog(hwnd, false);126break;127};128break;129case IDOK:130if (fetchDialogData(hwnd)) {131EndDialog(hwnd, true);132}133break;134case IDCANCEL:135EndDialog(hwnd, false);136break;137}138}139140return FALSE;141}142143bool EditSymbolsWindow::exec() {144return DialogBoxParam(GetModuleHandle(0), MAKEINTRESOURCE(IDD_EDITSYMBOLS), parentHwnd, StaticDlgFunc, (LPARAM)this) != 0;145}146147void EditSymbolsWindow::Scan() {148bool insertSymbols = MIPSAnalyst::ScanForFunctions(address_, address_ + size_ - 1, true);149MIPSAnalyst::FinalizeScan(insertSymbols);150}151152void EditSymbolsWindow::Remove() {153u32 func_address = g_symbolMap->GetFunctionStart(address_);154if (func_address == SymbolMap::INVALID_ADDRESS) {155func_address = g_symbolMap->GetNextSymbolAddress(address_, SymbolType::ST_FUNCTION);156}157158u32 counter = 0;159while (func_address < address_ + size_ && func_address != SymbolMap::INVALID_ADDRESS) {160g_symbolMap->RemoveFunction(func_address, true);161++counter;162func_address = g_symbolMap->GetNextSymbolAddress(address_, SymbolType::ST_FUNCTION);163}164165if (counter) {166MIPSAnalyst::ForgetFunctions(address_, address_ + size_ - 1);167168// The following was copied from hle.func.remove:169g_symbolMap->SortSymbols();170171MIPSAnalyst::UpdateHashMap();172MIPSAnalyst::ApplyHashMap();173174if (g_Config.bFuncReplacements) {175MIPSAnalyst::ReplaceFunctions();176}177178// Clear cache for branch lines and such.179DisassemblyManager manager;180manager.clear();181}182}183184void EditSymbolsWindow::eval() {185if (scan_) {186Scan();187}188else {189Remove();190}191}192193194