360 lines
15 KiB
C++
360 lines
15 KiB
C++
/****************************************************************************
|
|
* *
|
|
* Project64 - A Nintendo 64 emulator. *
|
|
* http://www.pj64-emu.com/ *
|
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
|
* *
|
|
* License: *
|
|
* GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html *
|
|
* *
|
|
****************************************************************************/
|
|
#pragma once
|
|
|
|
#include "MemoryScanner.h"
|
|
#include "Debugger-AddSymbol.h"
|
|
|
|
class CEditMixed :
|
|
public CWindowImpl<CEditMixed, CEdit>,
|
|
public CMixed
|
|
{
|
|
private:
|
|
ValueType m_Type;
|
|
DisplayFormat m_DisplayFormat;
|
|
wchar_t *m_String;
|
|
int m_StringLength;
|
|
void ReloadString(void);
|
|
|
|
//void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
|
|
|
|
public:
|
|
CEditMixed(void);
|
|
~CEditMixed(void);
|
|
|
|
BOOL Attach(HWND hWndNew);
|
|
|
|
DisplayFormat GetDisplayFormat(void);
|
|
void SetDisplayFormat(DisplayFormat fmt);
|
|
|
|
bool GetValue(uint8_t& value);
|
|
bool GetValue(int8_t& value);
|
|
bool GetValue(uint16_t& value);
|
|
bool GetValue(int16_t& value);
|
|
bool GetValue(uint32_t& value);
|
|
bool GetValue(int32_t& value);
|
|
bool GetValue(uint64_t& value);
|
|
bool GetValue(int64_t& value);
|
|
bool GetValue(float& value);
|
|
bool GetValue(double& value);
|
|
bool GetValueString(const wchar_t*& value, int& length);
|
|
bool GetValueHexString(const wchar_t*& value, int& length);
|
|
|
|
BEGIN_MSG_MAP_EX(CEditMixed)
|
|
//MSG_WM_CHAR(OnChar)
|
|
END_MSG_MAP()
|
|
};
|
|
|
|
//////////////
|
|
|
|
class CSetValueDlg : public CDialogImpl<CSetValueDlg>
|
|
{
|
|
public:
|
|
enum { IDD = IDD_Debugger_Search_SetValue };
|
|
|
|
typedef struct
|
|
{
|
|
const char* str;
|
|
DWORD_PTR data;
|
|
} ComboItem;
|
|
|
|
INT_PTR DoModal(const char* caption, const char* label, const char* initialText);
|
|
INT_PTR DoModal(const char* caption, const char* label, DWORD_PTR initialData, const ComboItem items[]);
|
|
wchar_t* GetEnteredString(void);
|
|
DWORD_PTR GetEnteredData(void);
|
|
|
|
CSetValueDlg(void);
|
|
virtual ~CSetValueDlg(void);
|
|
|
|
private:
|
|
enum Mode
|
|
{
|
|
Mode_TextBox,
|
|
Mode_ComboBox
|
|
};
|
|
|
|
Mode m_Mode;
|
|
|
|
const char* m_Caption;
|
|
const char* m_Label;
|
|
const ComboItem* m_ComboItems;
|
|
|
|
const char* m_InitialText;
|
|
wchar_t *m_EnteredString;
|
|
|
|
DWORD_PTR m_InitialData;
|
|
DWORD_PTR m_EnteredData;
|
|
|
|
CStatic m_Prompt;
|
|
CEdit m_Value;
|
|
CComboBox m_CmbValue;
|
|
|
|
LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
|
|
LRESULT OnDestroy(void);
|
|
LRESULT OnOK(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnCancel(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
|
|
BEGIN_MSG_MAP_EX(CSetValueDlg)
|
|
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
|
|
COMMAND_HANDLER(IDOK, BN_CLICKED, OnOK)
|
|
COMMAND_HANDLER(IDCANCEL, BN_CLICKED, OnCancel)
|
|
MSG_WM_DESTROY(OnDestroy)
|
|
END_MSG_MAP()
|
|
};
|
|
|
|
//////////////
|
|
|
|
|
|
|
|
class CDebugMemorySearch :
|
|
public CDebugDialog<CDebugMemorySearch>,
|
|
public CDialogResize<CDebugMemorySearch>
|
|
{
|
|
public:
|
|
enum { IDD = IDD_Debugger_Search };
|
|
|
|
CDebugMemorySearch(CDebuggerUI * debugger);
|
|
virtual ~CDebugMemorySearch(void);
|
|
|
|
void GameReset(void);
|
|
|
|
private:
|
|
enum
|
|
{
|
|
WM_GAMERESET = WM_USER + 1
|
|
};
|
|
|
|
enum {
|
|
TIMER_ID_AUTO_REFRESH
|
|
};
|
|
|
|
enum
|
|
{
|
|
GS_LINE_LEN = (sizeof("00000000 0000\n") - 1),
|
|
GS_TWOBYTE = 0x01000000
|
|
};
|
|
|
|
enum {
|
|
WatchListCtrl_Col_Lock,
|
|
WatchListCtrl_Col_BP,
|
|
WatchListCtrl_Col_Address,
|
|
WatchListCtrl_Col_Description,
|
|
WatchListCtrl_Col_Type,
|
|
WatchListCtrl_Col_Value,
|
|
WatchListCtrl_Num_Columns
|
|
};
|
|
|
|
enum {
|
|
ResultsListCtrl_Col_Address,
|
|
ResultsListCtrl_Col_Value,
|
|
ResultsListCtrl_Col_Previous
|
|
};
|
|
|
|
CDebugMemorySearch(void); // Disable default constructor
|
|
CDebugMemorySearch(const CDebugMemorySearch&); // Disable copy constructor
|
|
CDebugMemorySearch& operator=(const CDebugMemorySearch&); // Disable assignment
|
|
|
|
static LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam);
|
|
static CDebugMemorySearch* _this;
|
|
static HHOOK hWinMessageHook;
|
|
|
|
static const CSetValueDlg::ComboItem ModalChangeTypeItems[];
|
|
|
|
LRESULT OnSetFont(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
|
|
LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
|
|
LRESULT OnDestroy(void);
|
|
LRESULT OnGameReset(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
|
|
void OnExitSizeMove(void);
|
|
void OnSizing(UINT fwSide, LPRECT pRect);
|
|
void OnTimer(UINT_PTR nIDEvent);
|
|
LRESULT OnScroll(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
|
|
LRESULT OnMouseDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
|
|
LRESULT OnMouseUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
|
|
void OnInterceptMouseWheel(WPARAM wParam, LPARAM lParam);
|
|
void OnInterceptMouseMove(WPARAM wParam, LPARAM lParam);
|
|
LRESULT OnMeasureItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
|
|
LRESULT OnCancel(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnHexCheckbox(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnSearchButton(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnResetButton(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnRdramButton(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnRomButton(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnSpmemButton(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnScanTypeChanged(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnValueTypeChanged(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnResultsCustomDraw(LPNMHDR lpnmh);
|
|
LRESULT OnResultsDblClick(LPNMHDR lpnmh);
|
|
LRESULT OnResultsRClick(LPNMHDR lpnmh);
|
|
LRESULT OnResultsPopupViewMemory(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnResultsPopupAddToWatchList(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnResultsPopupAddAllToWatchList(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnResultsPopupSetValue(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnResultsPopupRemove(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnWatchListItemChanged(LPNMHDR lpnmh);
|
|
LRESULT OnWatchListCustomDraw(LPNMHDR lpnmh);
|
|
LRESULT OnWatchListRClick(LPNMHDR lpnmh);
|
|
LRESULT OnWatchListDblClick(LPNMHDR lpnmh);
|
|
LRESULT OnWatchListPopupLock(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnWatchListPopupReadBP(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnWatchListPopupWriteBP(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnWatchListPopupViewMemory(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnWatchListPopupAddSymbol(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnWatchListPopupHexadecimal(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnWatchListPopupChangeValue(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnWatchListPopupChangeDescription(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnWatchListPopupChangeType(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnWatchListPopupChangeAddress(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnWatchListPopupChangeAddressBy(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnWatchListPopupRemove(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnWatchListPopupRemoveAll(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnWatchListPopupCopyGamesharkCode(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
LRESULT OnWatchListPopupCopyAddressAndDescription(WORD wNotifyCode, WORD wID, HWND hwnd, BOOL& bHandled);
|
|
|
|
CScanResult* GetFirstSelectedScanResult(void);
|
|
CScanResult* GetFirstSelectedWatchListResult(void);
|
|
|
|
void ResetResults(void);
|
|
void Search(void);
|
|
void UpdateOptions(void);
|
|
void UpdateResultsList(bool bUpdateScrollbar = false, bool bResetScrollPos = true);
|
|
void UpdateWatchList(bool bUpdateScrollbar = false);
|
|
void RefreshResultsListValues(void);
|
|
void RefreshWatchListValues(void);
|
|
void RemoveWatchListItem(int index);
|
|
void ClearWatchList(void);
|
|
void ReloadWatchList(void);
|
|
void FlushWatchList(void);
|
|
void LoadWatchList(void);
|
|
void RemoveSelectedWatchListItems(void);
|
|
void AddResultToWatchList(int resultIndex);
|
|
|
|
void SeparatorMoveCtrl(WORD ctrlId, int yChange, bool bResize);
|
|
|
|
CPath GetWatchListPath(void);
|
|
|
|
/* generic ui util */
|
|
void FixListHeader(CListViewCtrl& listCtrl);
|
|
void SetComboBoxSelByData(CComboBox& cb, DWORD_PTR data);
|
|
bool MouseHovering(WORD ctrlId, int hMargin = 0, int vMargin = 0);
|
|
int GetNumVisibleRows(CListViewCtrl& list);
|
|
/*******************/
|
|
|
|
bool m_bJalSelected;
|
|
bool m_bJalHexWasChecked;
|
|
bool m_bJalUnsignedWasChecked;
|
|
|
|
stdstr m_StrGame;
|
|
DWORD m_ThreadId;
|
|
CFile m_WatchListFile;
|
|
|
|
CSetValueDlg m_SetValueDlg;
|
|
CAddSymbolDlg m_AddSymbolDlg;
|
|
|
|
CEditMixed m_SearchValue;
|
|
CEditNumber32 m_AddrStart, m_AddrEnd;
|
|
CComboBox m_SearchTypeOptions, m_ValueTypeOptions;
|
|
CListViewCtrl m_ResultsListCtrl, m_WatchListCtrl;
|
|
CScrollBar m_ResultsScrollbar, m_WatchListScrollbar;
|
|
CButton m_PhysicalCheckbox, m_HexCheckbox;
|
|
CButton m_UnsignedCheckbox, m_IgnoreCaseCheckbox, m_UnkEncodingCheckbox;
|
|
|
|
CMemoryScanner m_MemoryScanner;
|
|
std::vector<CScanResult> m_WatchList;
|
|
|
|
bool m_bDraggingSeparator;
|
|
CRect m_InitialSeparatorRect, m_LastSeparatorRect;
|
|
|
|
int m_ListCtrlRowHeight;
|
|
|
|
HCURSOR m_hCursorSizeNS;
|
|
|
|
BEGIN_MSG_MAP_EX(CDebugMemorySearch)
|
|
MESSAGE_HANDLER(WM_GAMERESET, OnGameReset)
|
|
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
|
|
MSG_WM_DESTROY(OnDestroy)
|
|
MSG_WM_EXITSIZEMOVE(OnExitSizeMove)
|
|
MSG_WM_SIZING(OnSizing)
|
|
MSG_WM_TIMER(OnTimer)
|
|
COMMAND_HANDLER(IDCANCEL, BN_CLICKED, OnCancel)
|
|
MESSAGE_HANDLER(WM_VSCROLL, OnScroll)
|
|
MESSAGE_HANDLER(WM_LBUTTONDOWN, OnMouseDown)
|
|
MESSAGE_HANDLER(WM_LBUTTONUP, OnMouseUp)
|
|
MESSAGE_HANDLER(WM_MEASUREITEM, OnMeasureItem)
|
|
MESSAGE_HANDLER(WM_SETFONT, OnSetFont)
|
|
COMMAND_HANDLER(IDC_CHK_HEX, BN_CLICKED, OnHexCheckbox)
|
|
COMMAND_HANDLER(IDC_BTN_SEARCH, BN_CLICKED, OnSearchButton)
|
|
COMMAND_HANDLER(IDC_BTN_RESET, BN_CLICKED, OnResetButton)
|
|
COMMAND_HANDLER(IDC_CMB_SCANTYPE, CBN_SELCHANGE, OnScanTypeChanged)
|
|
COMMAND_HANDLER(IDC_CMB_VALUETYPE, CBN_SELCHANGE, OnValueTypeChanged)
|
|
COMMAND_HANDLER(IDC_BTN_RDRAM, BN_CLICKED, OnRdramButton)
|
|
COMMAND_HANDLER(IDC_BTN_ROM, BN_CLICKED, OnRomButton)
|
|
COMMAND_HANDLER(IDC_BTN_SPMEM, BN_CLICKED, OnSpmemButton)
|
|
NOTIFY_HANDLER_EX(IDC_LST_RESULTS, NM_CUSTOMDRAW, OnResultsCustomDraw)
|
|
NOTIFY_HANDLER_EX(IDC_LST_RESULTS, NM_DBLCLK, OnResultsDblClick)
|
|
NOTIFY_HANDLER_EX(IDC_LST_RESULTS, NM_RCLICK, OnResultsRClick)
|
|
COMMAND_HANDLER(ID_RESULTS_VIEWMEMORY, BN_CLICKED, OnResultsPopupViewMemory)
|
|
COMMAND_HANDLER(ID_RESULTS_ADDTOWATCHLIST, BN_CLICKED, OnResultsPopupAddToWatchList)
|
|
COMMAND_HANDLER(ID_RESULTS_ADDALLTOWATCHLIST, BN_CLICKED, OnResultsPopupAddAllToWatchList)
|
|
COMMAND_HANDLER(ID_RESULTS_CHANGEVALUE, BN_CLICKED, OnResultsPopupSetValue)
|
|
COMMAND_HANDLER(ID_RESULTS_REMOVE, BN_CLICKED, OnResultsPopupRemove)
|
|
NOTIFY_HANDLER_EX(IDC_LST_WATCHLIST, LVN_ITEMCHANGED, OnWatchListItemChanged)
|
|
NOTIFY_HANDLER_EX(IDC_LST_WATCHLIST, NM_CUSTOMDRAW, OnWatchListCustomDraw)
|
|
NOTIFY_HANDLER_EX(IDC_LST_WATCHLIST, NM_DBLCLK, OnWatchListDblClick)
|
|
NOTIFY_HANDLER_EX(IDC_LST_WATCHLIST, NM_RCLICK, OnWatchListRClick)
|
|
COMMAND_HANDLER(ID_WATCHLIST_VIEWMEMORY, BN_CLICKED, OnWatchListPopupViewMemory)
|
|
COMMAND_HANDLER(ID_WATCHLIST_LOCKVALUE, BN_CLICKED, OnWatchListPopupLock)
|
|
COMMAND_HANDLER(ID_WATCHLIST_READBP, BN_CLICKED, OnWatchListPopupReadBP)
|
|
COMMAND_HANDLER(ID_WATCHLIST_WRITEBP, BN_CLICKED, OnWatchListPopupWriteBP)
|
|
COMMAND_HANDLER(ID_WATCHLIST_ADDSYMBOL, BN_CLICKED, OnWatchListPopupAddSymbol)
|
|
COMMAND_HANDLER(ID_WATCHLIST_HEXADECIMAL, BN_CLICKED, OnWatchListPopupHexadecimal)
|
|
COMMAND_HANDLER(ID_WATCHLIST_CHANGE_VALUE, BN_CLICKED, OnWatchListPopupChangeValue)
|
|
COMMAND_HANDLER(ID_WATCHLIST_CHANGE_DESCRIPTION, BN_CLICKED, OnWatchListPopupChangeDescription)
|
|
COMMAND_HANDLER(ID_WATCHLIST_CHANGE_TYPE, BN_CLICKED, OnWatchListPopupChangeType)
|
|
COMMAND_HANDLER(ID_WATCHLIST_CHANGE_ADDRESS, BN_CLICKED, OnWatchListPopupChangeAddress)
|
|
COMMAND_HANDLER(ID_WATCHLIST_CHANGE_ADDRESSBY, BN_CLICKED, OnWatchListPopupChangeAddressBy)
|
|
COMMAND_HANDLER(ID_WATCHLIST_REMOVE, BN_CLICKED, OnWatchListPopupRemove)
|
|
COMMAND_HANDLER(ID_WATCHLIST_REMOVEALL, BN_CLICKED, OnWatchListPopupRemoveAll)
|
|
COMMAND_HANDLER(ID_WATCHLIST_COPY_GSCODE, BN_CLICKED, OnWatchListPopupCopyGamesharkCode)
|
|
COMMAND_HANDLER(ID_WATCHLIST_COPY_ADDRDESC, BN_CLICKED, OnWatchListPopupCopyAddressAndDescription)
|
|
CHAIN_MSG_MAP(CDialogResize<CDebugMemorySearch>)
|
|
END_MSG_MAP()
|
|
|
|
BEGIN_DLGRESIZE_MAP(CDebugMemorySearch)
|
|
DLGRESIZE_CONTROL(IDC_LST_WATCHLIST, DLSZ_SIZE_X | DLSZ_SIZE_Y)
|
|
DLGRESIZE_CONTROL(IDC_SCRL_WATCHLIST, DLSZ_MOVE_X | DLSZ_SIZE_Y)
|
|
DLGRESIZE_CONTROL(IDC_NUM_RESULTS, DLSZ_SIZE_X)
|
|
DLGRESIZE_CONTROL(IDC_LST_RESULTS, DLSZ_SIZE_X)
|
|
DLGRESIZE_CONTROL(IDC_SCRL_RESULTS, DLSZ_MOVE_X)
|
|
DLGRESIZE_CONTROL(IDC_SEPARATOR, DLSZ_SIZE_X)
|
|
DLGRESIZE_CONTROL(IDC_BTN_SEARCH, DLSZ_MOVE_X)
|
|
DLGRESIZE_CONTROL(IDC_BTN_RESET, DLSZ_MOVE_X)
|
|
DLGRESIZE_CONTROL(IDC_GRP_SEARCH, DLSZ_MOVE_X)
|
|
DLGRESIZE_CONTROL(IDC_CHK_HEX, DLSZ_MOVE_X)
|
|
DLGRESIZE_CONTROL(IDC_CHK_UNSIGNED, DLSZ_MOVE_X)
|
|
DLGRESIZE_CONTROL(IDC_CHK_IGNORECASE, DLSZ_MOVE_X)
|
|
DLGRESIZE_CONTROL(IDC_CHK_UNKENCODING, DLSZ_MOVE_X)
|
|
DLGRESIZE_CONTROL(IDC_SEARCH_VALUE, DLSZ_MOVE_X)
|
|
DLGRESIZE_CONTROL(IDC_LBL_SCANTYPE, DLSZ_MOVE_X)
|
|
DLGRESIZE_CONTROL(IDC_LBL_VALUETYPE, DLSZ_MOVE_X)
|
|
DLGRESIZE_CONTROL(IDC_CMB_SCANTYPE, DLSZ_MOVE_X)
|
|
DLGRESIZE_CONTROL(IDC_CMB_VALUETYPE, DLSZ_MOVE_X)
|
|
DLGRESIZE_CONTROL(IDC_LBL_ADDRSTART, DLSZ_MOVE_X)
|
|
DLGRESIZE_CONTROL(IDC_LBL_ADDREND, DLSZ_MOVE_X)
|
|
DLGRESIZE_CONTROL(IDC_ADDR_START, DLSZ_MOVE_X)
|
|
DLGRESIZE_CONTROL(IDC_ADDR_END, DLSZ_MOVE_X)
|
|
DLGRESIZE_CONTROL(IDC_CHK_PHYSICAL, DLSZ_MOVE_X)
|
|
DLGRESIZE_CONTROL(IDC_BTN_RDRAM, DLSZ_MOVE_X)
|
|
DLGRESIZE_CONTROL(IDC_BTN_ROM, DLSZ_MOVE_X)
|
|
DLGRESIZE_CONTROL(IDC_BTN_SPMEM, DLSZ_MOVE_X)
|
|
DLGRESIZE_CONTROL(IDC_GRP_ADDR, DLSZ_MOVE_X)
|
|
END_DLGRESIZE_MAP()
|
|
};
|