CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
hrydgard

CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!

GitHub Repository: hrydgard/ppsspp
Path: blob/master/Windows/Debugger/EditSymbolsWindow.cpp
Views: 1401
1
#include "EditSymbolsWindow.h"
2
#include "../resource.h"
3
4
5
bool EditSymbolsWindow::GetCheckState(HWND hwnd, int dlgItem) {
6
return SendMessage(GetDlgItem(hwnd, dlgItem), BM_GETCHECK, 0, 0) != 0;
7
}
8
9
bool EditSymbolsWindow::fetchDialogData(HWND hwnd)
10
{
11
char str[256], errorMessage[512];
12
PostfixExpression exp;
13
14
scan_ = GetCheckState(hwnd, IDC_EDITSYMBOLS_SCAN);
15
16
// Parse the address
17
GetWindowTextA(GetDlgItem(hwnd, IDC_EDITSYMBOLS_ADDRESS), str, 256);
18
19
if (cpu->initExpression(str, exp) == false)
20
{
21
snprintf(errorMessage, sizeof(errorMessage), "Invalid expression \"%s\": %s", str, getExpressionError());
22
MessageBoxA(hwnd, errorMessage, "Error", MB_OK);
23
return false;
24
}
25
if (cpu->parseExpression(exp, address_) == false)
26
{
27
snprintf(errorMessage, sizeof(errorMessage), "Invalid expression \"%s\": %s", str, getExpressionError());
28
MessageBoxA(hwnd, errorMessage, "Error", MB_OK);
29
return false;
30
}
31
32
// Parse the size
33
GetWindowTextA(GetDlgItem(hwnd, IDC_EDITSYMBOLS_SIZE), str, 256);
34
35
if (cpu->initExpression(str, exp) == false)
36
{
37
snprintf(errorMessage, sizeof(errorMessage), "Invalid expression \"%s\": %s", str, getExpressionError());
38
MessageBoxA(hwnd, errorMessage, "Error", MB_OK);
39
return false;
40
}
41
if (cpu->parseExpression(exp, size_) == false)
42
{
43
snprintf(errorMessage, sizeof(errorMessage), "Invalid expression \"%s\": %s", str, getExpressionError());
44
MessageBoxA(hwnd, errorMessage, "Error", MB_OK);
45
return false;
46
}
47
48
// Now let's validate the range
49
if (!Memory::IsValidRange(address_, size_)) {
50
MessageBoxA(hwnd, "Invalid range", "Error", MB_OK);
51
return false;
52
}
53
54
return true;
55
}
56
57
INT_PTR CALLBACK EditSymbolsWindow::StaticDlgFunc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam) {
58
EditSymbolsWindow *thiz;
59
if (iMsg == WM_INITDIALOG) {
60
SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)lParam);
61
thiz = (EditSymbolsWindow *)lParam;
62
}
63
else {
64
thiz = (EditSymbolsWindow *)GetWindowLongPtr(hWnd, GWLP_USERDATA);
65
}
66
67
if (!thiz)
68
return FALSE;
69
return thiz->DlgFunc(hWnd, iMsg, wParam, lParam);
70
}
71
72
INT_PTR EditSymbolsWindow::DlgFunc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
73
{
74
char str[128];
75
76
switch (iMsg)
77
{
78
case WM_INITDIALOG:
79
80
// Set the radiobutton values
81
SendMessage(GetDlgItem(hwnd, IDC_EDITSYMBOLS_SCAN), BM_SETCHECK, scan_ ? BST_CHECKED : BST_UNCHECKED, 0);
82
SendMessage(GetDlgItem(hwnd, IDC_EDITSYMBOLS_REMOVE), BM_SETCHECK, scan_ ? BST_UNCHECKED : BST_CHECKED, 0);
83
84
// Set the text in the textboxes
85
if (address_ != -1) {
86
snprintf(str, sizeof(str), "0x%08X", address_);
87
SetWindowTextA(GetDlgItem(hwnd, IDC_EDITSYMBOLS_ADDRESS), str);
88
}
89
snprintf(str, sizeof(str), "0x%08X", size_);
90
SetWindowTextA(GetDlgItem(hwnd, IDC_EDITSYMBOLS_SIZE), str);
91
92
return TRUE;
93
case WM_COMMAND:
94
switch (LOWORD(wParam))
95
{
96
case IDC_EDITSYMBOLS_SCAN:
97
switch (HIWORD(wParam))
98
{
99
case BN_CLICKED:
100
scan_ = true;
101
break;
102
}
103
break;
104
case IDC_EDITSYMBOLS_REMOVE:
105
switch (HIWORD(wParam))
106
{
107
case BN_CLICKED:
108
scan_ = false;
109
break;
110
}
111
break;
112
case IDC_EDITSYMBOLS_OK:
113
switch (HIWORD(wParam))
114
{
115
case BN_CLICKED:
116
if (fetchDialogData(hwnd)) {
117
EndDialog(hwnd, true);
118
}
119
break;
120
};
121
break;
122
case IDC_EDITSYMBOLS_CANCEL:
123
switch (HIWORD(wParam))
124
{
125
case BN_CLICKED:
126
EndDialog(hwnd, false);
127
break;
128
};
129
break;
130
case IDOK:
131
if (fetchDialogData(hwnd)) {
132
EndDialog(hwnd, true);
133
}
134
break;
135
case IDCANCEL:
136
EndDialog(hwnd, false);
137
break;
138
}
139
}
140
141
return FALSE;
142
}
143
144
bool EditSymbolsWindow::exec() {
145
return DialogBoxParam(GetModuleHandle(0), MAKEINTRESOURCE(IDD_EDITSYMBOLS), parentHwnd, StaticDlgFunc, (LPARAM)this) != 0;
146
}
147
148
void EditSymbolsWindow::Scan() {
149
bool insertSymbols = MIPSAnalyst::ScanForFunctions(address_, address_ + size_ - 1, true);
150
MIPSAnalyst::FinalizeScan(insertSymbols);
151
}
152
153
void EditSymbolsWindow::Remove() {
154
u32 func_address = g_symbolMap->GetFunctionStart(address_);
155
if (func_address == SymbolMap::INVALID_ADDRESS) {
156
func_address = g_symbolMap->GetNextSymbolAddress(address_, SymbolType::ST_FUNCTION);
157
}
158
159
u32 counter = 0;
160
while (func_address < address_ + size_ && func_address != SymbolMap::INVALID_ADDRESS) {
161
g_symbolMap->RemoveFunction(func_address, true);
162
++counter;
163
func_address = g_symbolMap->GetNextSymbolAddress(address_, SymbolType::ST_FUNCTION);
164
}
165
166
if (counter) {
167
MIPSAnalyst::ForgetFunctions(address_, address_ + size_ - 1);
168
169
// The following was copied from hle.func.remove:
170
g_symbolMap->SortSymbols();
171
172
MIPSAnalyst::UpdateHashMap();
173
MIPSAnalyst::ApplyHashMap();
174
175
if (g_Config.bFuncReplacements) {
176
MIPSAnalyst::ReplaceFunctions();
177
}
178
179
// Clear cache for branch lines and such.
180
DisassemblyManager manager;
181
manager.clear();
182
}
183
}
184
185
void EditSymbolsWindow::eval() {
186
if (scan_) {
187
Scan();
188
}
189
else {
190
Remove();
191
}
192
}
193
194