Path: blob/master/Windows/Debugger/EditSymbolsWindow.cpp
3186 views
#include "EditSymbolsWindow.h"1#include "../resource.h"23#include "Core/MIPS/MIPSDebugInterface.h"45bool EditSymbolsWindow::GetCheckState(HWND hwnd, int dlgItem) {6return SendMessage(GetDlgItem(hwnd, dlgItem), BM_GETCHECK, 0, 0) != 0;7}89bool EditSymbolsWindow::fetchDialogData(HWND hwnd)10{11char str[256], errorMessage[512];12PostfixExpression exp;1314scan_ = GetCheckState(hwnd, IDC_EDITSYMBOLS_SCAN);1516// Parse the address17GetWindowTextA(GetDlgItem(hwnd, IDC_EDITSYMBOLS_ADDRESS), str, 256);1819if (initExpression(cpu, str, exp) == false)20{21snprintf(errorMessage, sizeof(errorMessage), "Invalid expression \"%s\": %s", str, getExpressionError());22MessageBoxA(hwnd, errorMessage, "Error", MB_OK);23return false;24}25if (parseExpression(cpu, exp, address_) == false)26{27snprintf(errorMessage, sizeof(errorMessage), "Invalid expression \"%s\": %s", str, getExpressionError());28MessageBoxA(hwnd, errorMessage, "Error", MB_OK);29return false;30}3132// Parse the size33GetWindowTextA(GetDlgItem(hwnd, IDC_EDITSYMBOLS_SIZE), str, 256);3435if (initExpression(cpu, str, exp) == false)36{37snprintf(errorMessage, sizeof(errorMessage), "Invalid expression \"%s\": %s", str, getExpressionError());38MessageBoxA(hwnd, errorMessage, "Error", MB_OK);39return false;40}41if (parseExpression(cpu, exp, size_) == false)42{43snprintf(errorMessage, sizeof(errorMessage), "Invalid expression \"%s\": %s", str, getExpressionError());44MessageBoxA(hwnd, errorMessage, "Error", MB_OK);45return false;46}4748// Now let's validate the range49if (!Memory::IsValidRange(address_, size_)) {50MessageBoxA(hwnd, "Invalid range", "Error", MB_OK);51return false;52}5354return true;55}5657INT_PTR CALLBACK EditSymbolsWindow::StaticDlgFunc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam) {58EditSymbolsWindow *thiz;59if (iMsg == WM_INITDIALOG) {60SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)lParam);61thiz = (EditSymbolsWindow *)lParam;62}63else {64thiz = (EditSymbolsWindow *)GetWindowLongPtr(hWnd, GWLP_USERDATA);65}6667if (!thiz)68return FALSE;69return thiz->DlgFunc(hWnd, iMsg, wParam, lParam);70}7172INT_PTR EditSymbolsWindow::DlgFunc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)73{74char str[128];7576switch (iMsg)77{78case WM_INITDIALOG:7980// Set the radiobutton values81SendMessage(GetDlgItem(hwnd, IDC_EDITSYMBOLS_SCAN), BM_SETCHECK, scan_ ? BST_CHECKED : BST_UNCHECKED, 0);82SendMessage(GetDlgItem(hwnd, IDC_EDITSYMBOLS_REMOVE), BM_SETCHECK, scan_ ? BST_UNCHECKED : BST_CHECKED, 0);8384// Set the text in the textboxes85if (address_ != -1) {86snprintf(str, sizeof(str), "0x%08X", address_);87SetWindowTextA(GetDlgItem(hwnd, IDC_EDITSYMBOLS_ADDRESS), str);88}89snprintf(str, sizeof(str), "0x%08X", size_);90SetWindowTextA(GetDlgItem(hwnd, IDC_EDITSYMBOLS_SIZE), str);9192return TRUE;93case WM_COMMAND:94switch (LOWORD(wParam))95{96case IDC_EDITSYMBOLS_SCAN:97switch (HIWORD(wParam))98{99case BN_CLICKED:100scan_ = true;101break;102}103break;104case IDC_EDITSYMBOLS_REMOVE:105switch (HIWORD(wParam))106{107case BN_CLICKED:108scan_ = false;109break;110}111break;112case IDC_EDITSYMBOLS_OK:113switch (HIWORD(wParam))114{115case BN_CLICKED:116if (fetchDialogData(hwnd)) {117EndDialog(hwnd, true);118}119break;120};121break;122case IDC_EDITSYMBOLS_CANCEL:123switch (HIWORD(wParam))124{125case BN_CLICKED:126EndDialog(hwnd, false);127break;128};129break;130case IDOK:131if (fetchDialogData(hwnd)) {132EndDialog(hwnd, true);133}134break;135case IDCANCEL:136EndDialog(hwnd, false);137break;138}139}140141return FALSE;142}143144bool EditSymbolsWindow::exec() {145return DialogBoxParam(GetModuleHandle(0), MAKEINTRESOURCE(IDD_EDITSYMBOLS), parentHwnd, StaticDlgFunc, (LPARAM)this) != 0;146}147148void EditSymbolsWindow::Scan() {149bool insertSymbols = MIPSAnalyst::ScanForFunctions(address_, address_ + size_ - 1, true);150MIPSAnalyst::FinalizeScan(insertSymbols);151}152153void EditSymbolsWindow::Remove() {154u32 func_address = g_symbolMap->GetFunctionStart(address_);155if (func_address == SymbolMap::INVALID_ADDRESS) {156func_address = g_symbolMap->GetNextSymbolAddress(address_, SymbolType::ST_FUNCTION);157}158159u32 counter = 0;160while (func_address < address_ + size_ && func_address != SymbolMap::INVALID_ADDRESS) {161g_symbolMap->RemoveFunction(func_address, true);162++counter;163func_address = g_symbolMap->GetNextSymbolAddress(address_, SymbolType::ST_FUNCTION);164}165166if (counter) {167MIPSAnalyst::ForgetFunctions(address_, address_ + size_ - 1);168169// The following was copied from hle.func.remove:170g_symbolMap->SortSymbols();171172MIPSAnalyst::UpdateHashMap();173MIPSAnalyst::ApplyHashMap();174175if (g_Config.bFuncReplacements) {176MIPSAnalyst::ReplaceFunctions();177}178179// Clear cache for branch lines and such.180g_disassemblyManager.clear();181}182}183184void EditSymbolsWindow::eval() {185if (scan_) {186Scan();187}188else {189Remove();190}191}192193194