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