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/Debugger_MemoryDlg.cpp
Views: 1401
#include "Windows/stdafx.h"1#include <windowsx.h>2#include <commctrl.h>3#include "..\resource.h"45#include "Common/Data/Encoding/Utf8.h"6#include "Common/System/Display.h"78#include "Core/Debugger/MemBlockInfo.h"9#include "Core/Debugger/SymbolMap.h"10#include "Core/MIPS/MIPSDebugInterface.h"1112#include "Debugger_MemoryDlg.h"13#include "CtrlMemView.h"14#include "DebuggerShared.h"15#include "Common/Log.h"16#include "winnt.h"17#include <WindowsX.h>18#include <algorithm>192021RECT CMemoryDlg::slRect; //sym list rect2223FAR WNDPROC DefAddressEditProc;24HWND AddressEditParentHwnd = 0;2526LRESULT CALLBACK AddressEditProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)27{28switch(message)29{30case WM_KEYDOWN:31if( wParam == VK_RETURN )32{33if (AddressEditParentHwnd != 0)34SendMessage(AddressEditParentHwnd,WM_DEB_GOTOADDRESSEDIT,0,0);35return 0;36}37break;38case WM_KEYUP:39if( wParam == VK_RETURN ) return 0;40break;41case WM_CHAR:42if( wParam == VK_RETURN ) return 0;43break;44case WM_GETDLGCODE:45if (lParam && ((MSG*)lParam)->message == WM_KEYDOWN)46{47if (wParam == VK_RETURN) return DLGC_WANTMESSAGE;48}49break;50};5152return (LRESULT)CallWindowProc((WNDPROC)DefAddressEditProc,hDlg,message,wParam,lParam);53}545556CMemoryDlg::CMemoryDlg(HINSTANCE _hInstance, HWND _hParent, DebugInterface *_cpu) : Dialog((LPCSTR)IDD_MEMORY, _hInstance,_hParent)57{58cpu = _cpu;59wchar_t temp[256];60wsprintf(temp,L"Memory Viewer - %S",cpu->GetName());61SetWindowText(m_hDlg,temp);6263ShowWindow(m_hDlg,SW_HIDE);6465memViewHdl = GetDlgItem(m_hDlg, IDC_MEMVIEW);66symListHdl = GetDlgItem(m_hDlg, IDC_SYMBOLS);67searchBoxHdl = GetDlgItem(m_hDlg, IDC_SEARCH_BOX);68srcListHdl = GetDlgItem(m_hDlg, IDC_SEARCH_RESULTS);6970layerDropdown_ = GetDlgItem(m_hDlg, IDC_REGIONS);71ComboBox_ResetContent(layerDropdown_);72ComboBox_AddString(layerDropdown_, L"Show allocations");73ComboBox_SetItemData(layerDropdown_, 0, MemBlockFlags::ALLOC);74ComboBox_AddString(layerDropdown_, L"Show sub allocations");75ComboBox_SetItemData(layerDropdown_, 1, MemBlockFlags::SUB_ALLOC);76ComboBox_AddString(layerDropdown_, L"Show writes");77ComboBox_SetItemData(layerDropdown_, 2, MemBlockFlags::WRITE);78ComboBox_AddString(layerDropdown_, L"Show textures");79ComboBox_SetItemData(layerDropdown_, 3, MemBlockFlags::TEXTURE);80ComboBox_SetCurSel(layerDropdown_, 0);8182status_ = GetDlgItem(m_hDlg, IDC_MEMVIEW_STATUS);8384memView = CtrlMemView::getFrom(memViewHdl);85memView->setDebugger(_cpu);8687Button_SetCheck(GetDlgItem(m_hDlg,IDC_RAM), TRUE);88Button_SetCheck(GetDlgItem(m_hDlg,IDC_MODESYMBOLS), TRUE);8990GetWindowRect(symListHdl, &slRect);91GetWindowRect(srcListHdl, &srRect);929394// subclass the edit box95editWnd = GetDlgItem(m_hDlg,IDC_ADDRESS);96DefAddressEditProc = (WNDPROC)GetWindowLongPtr(editWnd,GWLP_WNDPROC);97SetWindowLongPtr(editWnd,GWLP_WNDPROC,(LONG_PTR)AddressEditProc);98AddressEditParentHwnd = m_hDlg;99100Size();101}102103104CMemoryDlg::~CMemoryDlg(void)105{106}107108void CMemoryDlg::Update(void)109{110if (m_hDlg != NULL)111{112if (memView != NULL)113memView->redraw();114}115}116117void CMemoryDlg::searchBoxRedraw(const std::vector<u32> &results) {118wchar_t temp[256]{};119SendMessage(srcListHdl, WM_SETREDRAW, FALSE, 0);120ListBox_ResetContent(srcListHdl);121SendMessage(srcListHdl, LB_INITSTORAGE, (WPARAM)results.size(), (LPARAM)results.size() * 22);122for (size_t i = 0; i < results.size(); i++) {123wsprintf(temp, L"0x%08X", results[i]);124int index = (int)ListBox_AddString(srcListHdl, temp);125ListBox_SetItemData(srcListHdl, index, results[i]);126}127SendMessage(srcListHdl, WM_SETREDRAW, TRUE, 0);128RedrawWindow(srcListHdl, NULL, NULL, RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);129}130131132void CMemoryDlg::NotifyMapLoaded() {133if (m_hDlg && g_symbolMap)134g_symbolMap->FillSymbolListBox(symListHdl, ST_DATA);135else136mapLoadPending_ = true;137Update();138}139140BOOL CMemoryDlg::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) {141wchar_t temp[256]{};142int n;143144switch (message) {145case WM_COMMAND: {146HWND lb = GetDlgItem(m_hDlg, LOWORD(wParam));147switch (LOWORD(wParam)) {148case IDC_REGIONS:149switch (HIWORD(wParam)) {150case CBN_SELENDOK:151n = ComboBox_GetCurSel(lb);152if (n != CB_ERR) {153MemBlockFlags flags = (MemBlockFlags)ComboBox_GetItemData(lb, n);154memView->setHighlightType(MemBlockFlags(flags));155}156break;157}158break;159case IDC_SYMBOLS:160switch (HIWORD(wParam)) {161case LBN_DBLCLK:162n = ListBox_GetCurSel(lb);163if (n != -1) {164unsigned int addr = (unsigned int)ListBox_GetItemData(lb,n);165memView->gotoAddr(addr);166}167break;168}169break;170case IDC_SEARCH_RESULTS:171switch (HIWORD(wParam)) {172case LBN_DBLCLK:173n = ListBox_GetCurSel(lb);174if (n != -1) {175unsigned int addr = (unsigned int)ListBox_GetItemData(lb, n);176memView->gotoAddr(addr);177}178break;179}180break;181case IDC_SHOWOFFSETS:182switch (HIWORD(wParam)) {183case BN_CLICKED:184if (SendDlgItemMessage(m_hDlg, IDC_SHOWOFFSETS, BM_GETCHECK, 0, 0))185memView->toggleOffsetScale(On);186else187memView->toggleOffsetScale(Off);188break;189}190break;191case IDC_BUTTON_SEARCH:192switch (HIWORD(wParam)) {193case BN_CLICKED:194GetWindowText(searchBoxHdl, temp, 255);195std::vector<u32> results = memView->searchString(ConvertWStringToUTF8(temp));196if (results.size() > 0){197searchBoxRedraw(results);198}199break;200}201break;202}203}204break;205case WM_DEB_MAPLOADED:206NotifyMapLoaded();207break;208case WM_DEB_GOTOADDRESSEDIT: {209u32 addr;210GetWindowText(editWnd,temp,255);211212if (parseExpression(ConvertWStringToUTF8(temp).c_str(),cpu,addr) == false) {213displayExpressionError(m_hDlg);214} else {215memView->gotoAddr(addr);216SetFocus(memViewHdl);217}218break;219}220221case WM_DEB_UPDATE:222if (mapLoadPending_ && m_hDlg && g_symbolMap) {223g_symbolMap->FillSymbolListBox(symListHdl, ST_DATA);224mapLoadPending_ = false;225}226Update();227return TRUE;228229case WM_DEB_SETSTATUSBARTEXT:230SendMessage(status_, SB_SETTEXT, 0, (LPARAM)ConvertUTF8ToWString((const char *)lParam).c_str());231break;232233case WM_INITDIALOG:234return TRUE;235236case WM_SIZE:237Size();238break;239case WM_CLOSE:240Show(false);241break;242}243244return FALSE;245}246247void CMemoryDlg::Goto(u32 addr)248{249Show(true);250memView->gotoAddr(addr);251SetFocus(memViewHdl);252}253254255void CMemoryDlg::Size()256{257const float fontScale = 1.0f / g_display.dpi_scale_real_y;258259GetClientRect(m_hDlg,&winRect);260int dlg_w = winRect.right - winRect.left;261int dlg_h = winRect.bottom - winRect.top;262263int wf = slRect.right-slRect.left;264int w = dlg_w - 3 * fontScale - wf*2;265int top = 40 * fontScale;266int bottom = 24 * fontScale;267int height = dlg_h - top - bottom;268//HWND, X, Y, width, height, repaint269MoveWindow(symListHdl, 0 ,top, wf, height, TRUE);270MoveWindow(memViewHdl, wf+4 ,top, w, height, TRUE);271MoveWindow(srcListHdl, wf + 4 + w+ 4, top, wf-4, height, TRUE);272}273274275