pcsxr-1.9.92
[pcsx_rearmed.git] / win32 / gui / CheatDlg.c
1 /*  Cheat Support for PCSX-Reloaded\r
2  *  Copyright (C) 2009, Wei Mingzhi <whistler_wmz@users.sf.net>.\r
3  *\r
4  *  This program is free software; you can redistribute it and/or modify\r
5  *  it under the terms of the GNU General Public License as published by\r
6  *  the Free Software Foundation; either version 2 of the License, or\r
7  *  (at your option) any later version.\r
8  *\r
9  *  This program is distributed in the hope that it will be useful,\r
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of\r
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
12  *  GNU General Public License for more details.\r
13  *\r
14  *  You should have received a copy of the GNU General Public License\r
15  *  along with this program; if not, write to the Free Software\r
16  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA\r
17  */\r
18 \r
19 #include <windows.h>\r
20 #include <windowsx.h>\r
21 #ifndef _WIN32_IE\r
22 #define _WIN32_IE 0x0400\r
23 #endif\r
24 #include <commctrl.h>\r
25 #include <stdio.h>\r
26 #include "psxcommon.h"\r
27 #include "psxmem.h"\r
28 #include "cheat.h"\r
29 #include "resource.h"\r
30 #include "Win32.h"\r
31 \r
32 static void UpdateCheatDlg(HWND hW) {\r
33     HWND                List;\r
34     LV_ITEM             item;\r
35         int                     i;\r
36 \r
37         List = GetDlgItem(hW, IDC_CODELIST);\r
38 \r
39         ListView_DeleteAllItems(List);\r
40 \r
41         for (i = 0; i < NumCheats; i++) {\r
42                 memset(&item, 0, sizeof(item));\r
43 \r
44                 item.mask               = LVIF_TEXT;\r
45                 item.iItem              = i;\r
46                 item.pszText    = Cheats[i].Descr;\r
47                 item.iSubItem   = 0;\r
48 \r
49                 SendMessage(List, LVM_INSERTITEM, 0, (LPARAM)&item);\r
50 \r
51                 item.pszText    = (Cheats[i].Enabled ? _("Yes") : _("No"));\r
52                 item.iSubItem   = 1;\r
53 \r
54                 SendMessage(List, LVM_SETITEM, 0, (LPARAM)&item);\r
55         }\r
56 }\r
57 \r
58 static int              iEditItem = -1;\r
59 static char             szDescr[256], szCode[1024];\r
60 \r
61 static LRESULT WINAPI CheatEditDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {\r
62         int             i;\r
63 \r
64         switch (uMsg) {\r
65                 case WM_INITDIALOG:\r
66                         SetWindowText(hW, _("Edit Cheat"));\r
67                         Static_SetText(GetDlgItem(hW, IDC_LABEL_DESCR), _("Description:"));\r
68                         Static_SetText(GetDlgItem(hW, IDC_LABEL_CODE), _("Cheat Code:"));\r
69                         Button_SetText(GetDlgItem(hW, IDOK), _("OK"));\r
70                         Button_SetText(GetDlgItem(hW, IDCANCEL), _("Cancel"));\r
71 \r
72                         assert(iEditItem != -1 && iEditItem < NumCheats);\r
73 \r
74                         Edit_SetText(GetDlgItem(hW, IDC_DESCR), Cheats[iEditItem].Descr);\r
75 \r
76                         szCode[0] = '\0';\r
77                         for (i = Cheats[iEditItem].First; i < Cheats[iEditItem].First + Cheats[iEditItem].n; i++) {\r
78                                 sprintf(szDescr, "%.8X %.4X\r\n", CheatCodes[i].Addr, CheatCodes[i].Val);\r
79                                 strcat(szCode, szDescr);\r
80                         }\r
81                         Edit_SetText(GetDlgItem(hW, IDC_CODE), szCode);\r
82                         break;\r
83 \r
84                 case WM_COMMAND:\r
85                         switch (LOWORD(wParam)) {\r
86                                 case IDOK:\r
87                                         Edit_GetText(GetDlgItem(hW, IDC_DESCR), szDescr, 256);\r
88                                         Edit_GetText(GetDlgItem(hW, IDC_CODE), szCode, 1024);\r
89 \r
90                                         if (EditCheat(iEditItem, szDescr, szCode) != 0) {\r
91                                                 SysMessage(_("Invalid cheat code!"));\r
92                                         }\r
93                                         else {\r
94                         EndDialog(hW, TRUE);\r
95                         return TRUE;\r
96                                         }\r
97                                         break;\r
98 \r
99                                 case IDCANCEL:\r
100                                         EndDialog(hW, FALSE);\r
101                                         return TRUE;\r
102                         }\r
103                         break;\r
104 \r
105                 case WM_CLOSE:\r
106                         EndDialog(hW, FALSE);\r
107                         return TRUE;\r
108         }\r
109 \r
110         return FALSE;\r
111 }\r
112 \r
113 static LRESULT WINAPI CheatAddDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {\r
114         switch (uMsg) {\r
115                 case WM_INITDIALOG:\r
116                         SetWindowText(hW, _("Add New Cheat"));\r
117                         Static_SetText(GetDlgItem(hW, IDC_LABEL_DESCR), _("Description:"));\r
118                         Static_SetText(GetDlgItem(hW, IDC_LABEL_CODE), _("Cheat Code:"));\r
119                         Button_SetText(GetDlgItem(hW, IDOK), _("OK"));\r
120                         Button_SetText(GetDlgItem(hW, IDCANCEL), _("Cancel"));\r
121                         Edit_SetText(GetDlgItem(hW, IDC_DESCR), szDescr);\r
122                         Edit_SetText(GetDlgItem(hW, IDC_CODE), szCode);\r
123                         break;\r
124 \r
125                 case WM_COMMAND:\r
126                         switch (LOWORD(wParam)) {\r
127                                 case IDOK:\r
128                                         Edit_GetText(GetDlgItem(hW, IDC_DESCR), szDescr, 256);\r
129                                         Edit_GetText(GetDlgItem(hW, IDC_CODE), szCode, 1024);\r
130 \r
131                                         if (AddCheat(szDescr, szCode) != 0) {\r
132                                                 SysMessage(_("Invalid cheat code!"));\r
133                                         }\r
134                                         else {\r
135                         EndDialog(hW, TRUE);\r
136                         return TRUE;\r
137                                         }\r
138                                         break;\r
139 \r
140                                 case IDCANCEL:\r
141                                         EndDialog(hW, FALSE);\r
142                                         return TRUE;\r
143                         }\r
144                         break;\r
145 \r
146                 case WM_CLOSE:\r
147                         EndDialog(hW, FALSE);\r
148                         return TRUE;\r
149         }\r
150 \r
151         return FALSE;\r
152 }\r
153 \r
154 LRESULT WINAPI CheatDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {\r
155         HWND                    List;\r
156         LV_COLUMN               col;\r
157         LV_ITEM                 item;\r
158         int                             i;\r
159         OPENFILENAME    ofn;\r
160         char                    szFileName[256];\r
161         char                    szFileTitle[256];\r
162         char                    szFilter[256];\r
163 \r
164         switch (uMsg) {\r
165                 case WM_INITDIALOG:\r
166                         SetWindowText(hW, _("Edit Cheat Codes"));\r
167 \r
168                         Button_SetText(GetDlgItem(hW, IDC_ADDCODE), _("&Add Code"));\r
169                         Button_SetText(GetDlgItem(hW, IDC_EDITCODE), _("&Edit Code"));\r
170                         Button_SetText(GetDlgItem(hW, IDC_REMOVECODE), _("&Remove Code"));\r
171                         Button_SetText(GetDlgItem(hW, IDC_TOGGLECODE), _("&Enable/Disable"));\r
172                         Button_SetText(GetDlgItem(hW, IDC_LOADCODE), _("&Load..."));\r
173                         Button_SetText(GetDlgItem(hW, IDC_SAVECODE), _("&Save As..."));\r
174                         Button_SetText(GetDlgItem(hW, IDCANCEL), _("&Close"));\r
175 \r
176                         List = GetDlgItem(hW, IDC_CODELIST);\r
177 \r
178             SendMessage(List, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT);\r
179 \r
180                         memset(&col, 0, sizeof(col));\r
181 \r
182                         col.mask        = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;\r
183                         col.fmt         = LVCFMT_LEFT;\r
184 \r
185                         col.pszText             = _("Description");\r
186                         col.cx                  = 400;\r
187 \r
188                         SendMessage(List, LVM_INSERTCOLUMN, 0, (LPARAM)&col);\r
189 \r
190                         col.pszText             = _("Enabled");\r
191                         col.cx                  = 55;\r
192 \r
193                         SendMessage(List, LVM_INSERTCOLUMN, 1, (LPARAM)&col);\r
194 \r
195                         UpdateCheatDlg(hW);\r
196                         break;\r
197 \r
198                 case WM_COMMAND:\r
199                         switch (LOWORD(wParam)) {\r
200                                 case IDCANCEL:\r
201                                         EndDialog(hW, FALSE);\r
202                                         return TRUE;\r
203 \r
204                                 case IDC_ADDCODE:\r
205                                         i = NumCheats;\r
206                                         szDescr[0] = '\0';\r
207                                         szCode[0] = '\0';\r
208 \r
209                                         DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATEDIT), hW, (DLGPROC)CheatAddDlgProc);\r
210 \r
211                                         if (NumCheats > i) {\r
212                                                 // new cheat added\r
213                                                 List = GetDlgItem(hW, IDC_CODELIST);\r
214                                                 memset(&item, 0, sizeof(item));\r
215 \r
216                                                 item.mask               = LVIF_TEXT;\r
217                                                 item.iItem              = i;\r
218                                                 item.pszText    = Cheats[i].Descr;\r
219                                                 item.iSubItem   = 0;\r
220 \r
221                                                 SendMessage(List, LVM_INSERTITEM, 0, (LPARAM)&item);\r
222 \r
223                                                 item.pszText    = (Cheats[i].Enabled ? _("Yes") : _("No"));\r
224                                                 item.iSubItem   = 1;\r
225 \r
226                                                 SendMessage(List, LVM_SETITEM, 0, (LPARAM)&item);\r
227                                         }\r
228                                         break;\r
229 \r
230                                 case IDC_EDITCODE:\r
231                                         List = GetDlgItem(hW, IDC_CODELIST);\r
232                                         iEditItem = ListView_GetSelectionMark(List);\r
233 \r
234                                         if (iEditItem != -1) {\r
235                                                 DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATEDIT), hW, (DLGPROC)CheatEditDlgProc);\r
236 \r
237                                                 memset(&item, 0, sizeof(item));\r
238 \r
239                                                 item.mask               = LVIF_TEXT;\r
240                                                 item.iItem              = iEditItem;\r
241                                                 item.pszText    = Cheats[iEditItem].Descr;\r
242                                                 item.iSubItem   = 0;\r
243 \r
244                                                 SendMessage(List, LVM_SETITEM, 0, (LPARAM)&item);\r
245                                         }\r
246                                         break;\r
247 \r
248                                 case IDC_REMOVECODE:\r
249                                         List = GetDlgItem(hW, IDC_CODELIST);\r
250                                         i = ListView_GetSelectionMark(List);\r
251 \r
252                                         if (i != -1) {\r
253                                                 RemoveCheat(i);\r
254                                                 ListView_DeleteItem(List, i);\r
255                                                 ListView_SetSelectionMark(List, -1);\r
256                                         }\r
257                                         break;\r
258 \r
259                                 case IDC_TOGGLECODE:\r
260                                         List = GetDlgItem(hW, IDC_CODELIST);\r
261                                         i = ListView_GetSelectionMark(List);\r
262 \r
263                                         if (i != -1) {\r
264                                                 Cheats[i].Enabled ^= 1;\r
265 \r
266                                                 memset(&item, 0, sizeof(item));\r
267 \r
268                                                 item.mask               = LVIF_TEXT;\r
269                                                 item.iItem              = i;\r
270                                                 item.pszText    = (Cheats[i].Enabled ? _("Yes") : _("No"));\r
271                                                 item.iSubItem   = 1;\r
272 \r
273                                                 SendMessage(List, LVM_SETITEM, 0, (LPARAM)&item);\r
274                                         }\r
275                                         break;\r
276 \r
277                                 case IDC_LOADCODE:\r
278                                         memset(&szFileName,  0, sizeof(szFileName));\r
279                                         memset(&szFileTitle, 0, sizeof(szFileTitle));\r
280                                         memset(&szFilter,    0, sizeof(szFilter));\r
281 \r
282                                         strcpy(szFilter, _("PCSX Cheat Code Files"));\r
283                                         strcatz(szFilter, "*.*");\r
284 \r
285                                         ofn.lStructSize                 = sizeof(OPENFILENAME);\r
286                                         ofn.hwndOwner                   = hW;\r
287                                         ofn.lpstrFilter                 = szFilter;\r
288                                         ofn.lpstrCustomFilter   = NULL;\r
289                                         ofn.nMaxCustFilter              = 0;\r
290                                         ofn.nFilterIndex                = 1;\r
291                                         ofn.lpstrFile                   = szFileName;\r
292                                         ofn.nMaxFile                    = 256;\r
293                                         ofn.lpstrInitialDir             = ".\\Cheats";\r
294                                         ofn.lpstrFileTitle              = szFileTitle;\r
295                                         ofn.nMaxFileTitle               = 256;\r
296                                         ofn.lpstrTitle                  = NULL;\r
297                                         ofn.lpstrDefExt                 = "CHT";\r
298                                         ofn.Flags                               = OFN_HIDEREADONLY | OFN_NOCHANGEDIR;\r
299 \r
300                                         if (GetOpenFileName((LPOPENFILENAME)&ofn)) {\r
301                                                 LoadCheats(szFileName);\r
302                                                 UpdateCheatDlg(hW);\r
303                                         }\r
304                                         break;\r
305 \r
306                                 case IDC_SAVECODE:\r
307                                         memset(&szFileName,  0, sizeof(szFileName));\r
308                                         memset(&szFileTitle, 0, sizeof(szFileTitle));\r
309                                         memset(&szFilter,    0, sizeof(szFilter));\r
310 \r
311                                         strcpy(szFilter, _("PCSX Cheat Code Files"));\r
312                                         strcatz(szFilter, "*.*");\r
313 \r
314                                         ofn.lStructSize                 = sizeof(OPENFILENAME);\r
315                                         ofn.hwndOwner                   = hW;\r
316                                         ofn.lpstrFilter                 = szFilter;\r
317                                         ofn.lpstrCustomFilter   = NULL;\r
318                                         ofn.nMaxCustFilter              = 0;\r
319                                         ofn.nFilterIndex                = 1;\r
320                                         ofn.lpstrFile                   = szFileName;\r
321                                         ofn.nMaxFile                    = 256;\r
322                                         ofn.lpstrInitialDir             = ".\\Cheats";\r
323                                         ofn.lpstrFileTitle              = szFileTitle;\r
324                                         ofn.nMaxFileTitle               = 256;\r
325                                         ofn.lpstrTitle                  = NULL;\r
326                                         ofn.lpstrDefExt                 = "CHT";\r
327                                         ofn.Flags                               = OFN_HIDEREADONLY | OFN_NOCHANGEDIR | OFN_OVERWRITEPROMPT;\r
328 \r
329                                         if (GetOpenFileName((LPOPENFILENAME)&ofn)) {\r
330                                                 SaveCheats(szFileName);\r
331                                         }\r
332                                         break;\r
333                         }\r
334                         break;\r
335 \r
336                 case WM_NOTIFY:\r
337                         switch (LOWORD(wParam)) {\r
338                                 case IDC_CODELIST:\r
339                                         List = GetDlgItem(hW, IDC_CODELIST);\r
340                                         i = ListView_GetSelectionMark(List);\r
341 \r
342                                         if (i != -1) {\r
343                                                 Button_Enable(GetDlgItem(hW, IDC_EDITCODE), TRUE);\r
344                                                 Button_Enable(GetDlgItem(hW, IDC_REMOVECODE), TRUE);\r
345                                                 Button_Enable(GetDlgItem(hW, IDC_TOGGLECODE), TRUE);\r
346                                         }\r
347                                         else {\r
348                                                 Button_Enable(GetDlgItem(hW, IDC_EDITCODE), FALSE);\r
349                                                 Button_Enable(GetDlgItem(hW, IDC_REMOVECODE), FALSE);\r
350                                                 Button_Enable(GetDlgItem(hW, IDC_TOGGLECODE), FALSE);\r
351                                         }\r
352 \r
353                                         Button_Enable(GetDlgItem(hW, IDC_SAVECODE), (NumCheats > 0));\r
354                                         break;\r
355                         }\r
356                         break;\r
357 \r
358                 case WM_CLOSE:\r
359                         EndDialog(hW, FALSE);\r
360                         return TRUE;\r
361         }\r
362 \r
363         return FALSE;\r
364 }\r
365 \r
366 ///////////////////////////////////////////////////////////////////////////////\r
367 \r
368 #define SEARCH_EQUALVAL                         0\r
369 #define SEARCH_NOTEQUALVAL                      1\r
370 #define SEARCH_RANGE                            2\r
371 #define SEARCH_INCBY                            3\r
372 #define SEARCH_DECBY                            4\r
373 #define SEARCH_INC                                      5\r
374 #define SEARCH_DEC                                      6\r
375 #define SEARCH_DIFFERENT                        7\r
376 #define SEARCH_NOCHANGE                         8\r
377 \r
378 #define SEARCHTYPE_8BIT                         0\r
379 #define SEARCHTYPE_16BIT                        1\r
380 #define SEARCHTYPE_32BIT                        2\r
381 \r
382 #define SEARCHBASE_DEC                          0\r
383 #define SEARCHBASE_HEX                          1\r
384 \r
385 static char current_search                      = SEARCH_EQUALVAL;\r
386 static char current_searchtype          = SEARCHTYPE_8BIT;\r
387 static char current_searchbase          = SEARCHBASE_DEC;\r
388 static uint32_t current_valuefrom       = 0;\r
389 static uint32_t current_valueto         = 0;\r
390 \r
391 static void UpdateCheatSearchDlg(HWND hW) {\r
392         char            buf[256];\r
393         int                     i;\r
394 \r
395         SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_RESETCONTENT, 0, 0);\r
396         SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_RESETCONTENT, 0, 0);\r
397 \r
398         Button_Enable(GetDlgItem(hW, IDC_FREEZE), FALSE);\r
399         Button_Enable(GetDlgItem(hW, IDC_MODIFY), FALSE);\r
400         Button_Enable(GetDlgItem(hW, IDC_COPY), FALSE);\r
401 \r
402         SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Equal Value"));\r
403         SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Not Equal Value"));\r
404         SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Range"));\r
405 \r
406         if (prevM != NULL) {\r
407                 SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Increased By"));\r
408                 SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Decreased By"));\r
409                 SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Increased"));\r
410                 SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Decreased"));\r
411                 SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Different"));\r
412                 SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("No Change"));\r
413 \r
414                 ComboBox_Enable(GetDlgItem(hW, IDC_DATATYPE), FALSE);\r
415         }\r
416         else {\r
417                 ComboBox_Enable(GetDlgItem(hW, IDC_DATATYPE), TRUE);\r
418         }\r
419 \r
420         SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_SETCURSEL, (WPARAM)current_search, 0);\r
421 \r
422         if (current_search == SEARCH_RANGE) {\r
423                 ShowWindow(GetDlgItem(hW, IDC_LABEL_TO), SW_SHOW);\r
424                 ShowWindow(GetDlgItem(hW, IDC_VALUETO), SW_SHOW);\r
425         }\r
426         else {\r
427                 ShowWindow(GetDlgItem(hW, IDC_LABEL_TO), SW_HIDE);\r
428                 ShowWindow(GetDlgItem(hW, IDC_VALUETO), SW_HIDE);\r
429         }\r
430 \r
431         SendMessage(GetDlgItem(hW, IDC_DATATYPE), CB_SETCURSEL, (WPARAM)current_searchtype, 0);\r
432         SendMessage(GetDlgItem(hW, IDC_DATABASE), CB_SETCURSEL, (WPARAM)current_searchbase, 0);\r
433 \r
434         if (current_searchbase == SEARCHBASE_HEX) {\r
435                 sprintf(buf, "%X", current_valuefrom);\r
436                 SetWindowText(GetDlgItem(hW, IDC_VALUEFROM), buf);\r
437                 sprintf(buf, "%X", current_valueto);\r
438                 SetWindowText(GetDlgItem(hW, IDC_VALUETO), buf);\r
439         }\r
440         else {\r
441                 sprintf(buf, "%u", current_valuefrom);\r
442                 SetWindowText(GetDlgItem(hW, IDC_VALUEFROM), buf);\r
443                 sprintf(buf, "%u", current_valueto);\r
444                 SetWindowText(GetDlgItem(hW, IDC_VALUETO), buf);\r
445         }\r
446 \r
447         if (prevM == NULL) {\r
448                 SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_ADDSTRING, (WPARAM)0, (LPARAM)_("Enter the values and start your search."));\r
449                 EnableWindow(GetDlgItem(hW, IDC_RESLIST), FALSE);\r
450         }\r
451         else {\r
452                 if (NumSearchResults == 0) {\r
453                         SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_ADDSTRING, (WPARAM)0, (LPARAM)_("No addresses found."));\r
454                         EnableWindow(GetDlgItem(hW, IDC_RESLIST), FALSE);\r
455                 }\r
456                 else if (NumSearchResults > 100) {\r
457                         SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_ADDSTRING, (WPARAM)0, (LPARAM)_("Too many addresses found."));\r
458                         EnableWindow(GetDlgItem(hW, IDC_RESLIST), FALSE);\r
459                 }\r
460                 else {\r
461                         for (i = 0; i < NumSearchResults; i++) {\r
462                                 u32 addr = SearchResults[i];\r
463 \r
464                                 switch (current_searchtype) {\r
465                                         case SEARCHTYPE_8BIT:\r
466                                                 sprintf(buf, _("%.8X    Current: %u (%.2X), Previous: %u (%.2X)"),\r
467                                                         addr, PSXMu8(addr), PSXMu8(addr), PrevMu8(addr), PrevMu8(addr));\r
468                                                 break;\r
469 \r
470                                         case SEARCHTYPE_16BIT:\r
471                                                 sprintf(buf, _("%.8X    Current: %u (%.4X), Previous: %u (%.4X)"),\r
472                                                         addr, PSXMu16(addr), PSXMu16(addr), PrevMu16(addr), PrevMu16(addr));\r
473                                                 break;\r
474 \r
475                                         case SEARCHTYPE_32BIT:\r
476                                                 sprintf(buf, _("%.8X    Current: %u (%.8X), Previous: %u (%.8X)"),\r
477                                                         addr, PSXMu32(addr), PSXMu32(addr), PrevMu32(addr), PrevMu32(addr));\r
478                                                 break;\r
479 \r
480                                         default:\r
481                                                 assert(FALSE); // impossible\r
482                                                 break;\r
483                                 }\r
484 \r
485                                 SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_ADDSTRING, (WPARAM)0, (LPARAM)buf);\r
486                                 SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_SETITEMDATA, i, (LPARAM)i);\r
487                         }\r
488                         EnableWindow(GetDlgItem(hW, IDC_RESLIST), TRUE);\r
489                 }\r
490         }\r
491 \r
492         sprintf(buf, _("Founded Addresses: %d"), NumSearchResults);\r
493         Static_SetText(GetDlgItem(hW, IDC_LABEL_RESULTSFOUND), buf);\r
494 }\r
495 \r
496 static int iCurItem = 0;\r
497 \r
498 static LRESULT WINAPI CheatFreezeProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {\r
499         u32                     val;\r
500         char            buf[256];\r
501 \r
502         switch (uMsg) {\r
503                 case WM_INITDIALOG:\r
504                         SetWindowText(hW, _("Freeze"));\r
505                         Static_SetText(GetDlgItem(hW, IDC_LABEL_ADDRESS), _("Address:"));\r
506                         Static_SetText(GetDlgItem(hW, IDC_LABEL_VALUE), _("Value:"));\r
507 \r
508                         sprintf(buf, "%.8X", SearchResults[iCurItem]);\r
509                         SetWindowText(GetDlgItem(hW, IDC_ADDRESS), buf);\r
510 \r
511                         switch (current_searchtype) {\r
512                                 case SEARCHTYPE_8BIT:\r
513                                         val = PSXMu8(SearchResults[iCurItem]);\r
514                                         break;\r
515 \r
516                                 case SEARCHTYPE_16BIT:\r
517                                         val = PSXMu16(SearchResults[iCurItem]);\r
518                                         break;\r
519 \r
520                                 case SEARCHTYPE_32BIT:\r
521                                         val = PSXMu32(SearchResults[iCurItem]);\r
522                                         break;\r
523 \r
524                                 default:\r
525                                         assert(FALSE); // should not reach here\r
526                                         break;\r
527                         }\r
528 \r
529                         sprintf(buf, "%u", val);\r
530                         SetWindowText(GetDlgItem(hW, IDC_VALUE), buf);\r
531                         break;\r
532 \r
533                 case WM_COMMAND:\r
534                         switch (LOWORD(wParam)) {\r
535                                 case IDOK:\r
536                                         val = 0;\r
537                                         GetWindowText(GetDlgItem(hW, IDC_VALUE), buf, 255);\r
538                                         sscanf(buf, "%u", &val);\r
539 \r
540                                         switch (current_searchtype) {\r
541                                                 case SEARCHTYPE_8BIT:\r
542                                                         if (val > (u32)0xFF) {\r
543                                                                 val = 0xFF;\r
544                                                         }\r
545                                                         sprintf(szCode, "%.8X %.4X", (SearchResults[iCurItem] & 0x1FFFFF) | (CHEAT_CONST8 << 24), val);\r
546                                                         break;\r
547 \r
548                                                 case SEARCHTYPE_16BIT:\r
549                                                         if (val > (u32)0xFFFF) {\r
550                                                                 val = 0xFFFF;\r
551                                                         }\r
552                                                         sprintf(szCode, "%.8X %.4X", (SearchResults[iCurItem] & 0x1FFFFF) | (CHEAT_CONST16 << 24), val);\r
553                                                         break;\r
554 \r
555                                                 case SEARCHTYPE_32BIT:\r
556                                                         sprintf(szCode, "%.8X %.4X\n%.8X %.4X",\r
557                                                                 (SearchResults[iCurItem] & 0x1FFFFF) | (CHEAT_CONST16 << 24), val & 0xFFFF,\r
558                                                                 ((SearchResults[iCurItem] + 2) & 0x1FFFFF) | (CHEAT_CONST16 << 24), ((val & 0xFFFF0000) >> 16) & 0xFFFF);\r
559                                                         break;\r
560 \r
561                                                 default:\r
562                                                         assert(FALSE); // should not reach here\r
563                                                         break;\r
564                                         }\r
565 \r
566                                         sprintf(szDescr, _("Freeze %.8X"), SearchResults[iCurItem]);\r
567 \r
568                                         if (DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATEDIT), hW, (DLGPROC)CheatAddDlgProc)) {\r
569                                                 Cheats[NumCheats - 1].Enabled = 1;\r
570                                                 EndDialog(hW, TRUE);\r
571                                                 return TRUE;\r
572                                         }\r
573                                         break;\r
574 \r
575                                 case IDCANCEL:\r
576                                         EndDialog(hW, FALSE);\r
577                                         return TRUE;\r
578                         }\r
579                         break;\r
580 \r
581                 case WM_CLOSE:\r
582                         EndDialog(hW, FALSE);\r
583                         return TRUE;\r
584         }\r
585 \r
586         return FALSE;\r
587 }\r
588 \r
589 static LRESULT WINAPI CheatModifyProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {\r
590         u32                     val;\r
591         char            buf[256];\r
592 \r
593         switch (uMsg) {\r
594                 case WM_INITDIALOG:\r
595                         SetWindowText(hW, _("Modify"));\r
596                         Static_SetText(GetDlgItem(hW, IDC_LABEL_ADDRESS), _("Address:"));\r
597                         Static_SetText(GetDlgItem(hW, IDC_LABEL_VALUE), _("Value:"));\r
598 \r
599                         sprintf(buf, "%.8X", SearchResults[iCurItem]);\r
600                         SetWindowText(GetDlgItem(hW, IDC_ADDRESS), buf);\r
601 \r
602                         switch (current_searchtype) {\r
603                                 case SEARCHTYPE_8BIT:\r
604                                         val = PSXMu8(SearchResults[iCurItem]);\r
605                                         break;\r
606 \r
607                                 case SEARCHTYPE_16BIT:\r
608                                         val = PSXMu16(SearchResults[iCurItem]);\r
609                                         break;\r
610 \r
611                                 case SEARCHTYPE_32BIT:\r
612                                         val = PSXMu32(SearchResults[iCurItem]);\r
613                                         break;\r
614 \r
615                                 default:\r
616                                         assert(FALSE); // should not reach here\r
617                                         break;\r
618                         }\r
619 \r
620                         sprintf(buf, "%u", val);\r
621                         SetWindowText(GetDlgItem(hW, IDC_VALUE), buf);\r
622                         break;\r
623 \r
624                 case WM_COMMAND:\r
625                         switch (LOWORD(wParam)) {\r
626                                 case IDOK:\r
627                                         val = 0;\r
628                                         GetWindowText(GetDlgItem(hW, IDC_VALUE), buf, 255);\r
629                                         sscanf(buf, "%u", &val);\r
630 \r
631                                         switch (current_searchtype) {\r
632                                                 case SEARCHTYPE_8BIT:\r
633                                                         if (val > 0xFF) {\r
634                                                                 val = 0xFF;\r
635                                                         }\r
636                                                         psxMemWrite8(SearchResults[iCurItem], (u8)val);\r
637                                                         break;\r
638 \r
639                                                 case SEARCHTYPE_16BIT:\r
640                                                         if (val > 0xFFFF) {\r
641                                                                 val = 0xFFFF;\r
642                                                         }\r
643                                                         psxMemWrite16(SearchResults[iCurItem], (u16)val);\r
644                                                         break;\r
645 \r
646                                                 case SEARCHTYPE_32BIT:\r
647                                                         psxMemWrite32(SearchResults[iCurItem], (u32)val);\r
648                                                         break;\r
649 \r
650                                                 default:\r
651                                                         assert(FALSE); // should not reach here\r
652                                                         break;\r
653                                         }\r
654 \r
655                                         EndDialog(hW, TRUE);\r
656                                         return TRUE;\r
657 \r
658                                 case IDCANCEL:\r
659                                         EndDialog(hW, TRUE);\r
660                                         return FALSE;\r
661                         }\r
662                         break;\r
663 \r
664                 case WM_CLOSE:\r
665                         EndDialog(hW, TRUE);\r
666                         return FALSE;\r
667         }\r
668 \r
669         return FALSE;\r
670 }\r
671 \r
672 LRESULT WINAPI CheatSearchDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {\r
673         char                    buf[256];\r
674         uint32_t                i;\r
675 \r
676         switch (uMsg) {\r
677                 case WM_INITDIALOG:\r
678                         SetWindowText(hW, _("Cheat Search"));\r
679 \r
680                         Static_SetText(GetDlgItem(hW, IDC_LABEL_SEARCHFOR), _("Search For:"));\r
681                         Static_SetText(GetDlgItem(hW, IDC_LABEL_DATATYPE), _("Data Type:"));\r
682                         Static_SetText(GetDlgItem(hW, IDC_LABEL_VALUE), _("Value:"));\r
683                         Static_SetText(GetDlgItem(hW, IDC_LABEL_DATABASE), _("Data Base:"));\r
684                         Static_SetText(GetDlgItem(hW, IDC_LABEL_TO), _("To:"));\r
685                         Button_SetText(GetDlgItem(hW, IDC_FREEZE), _("&Freeze"));\r
686                         Button_SetText(GetDlgItem(hW, IDC_MODIFY), _("&Modify"));\r
687                         Button_SetText(GetDlgItem(hW, IDC_COPY), _("&Copy"));\r
688                         Button_SetText(GetDlgItem(hW, IDC_SEARCH), _("&Search"));\r
689                         Button_SetText(GetDlgItem(hW, IDC_NEWSEARCH), _("&New Search"));\r
690                         Button_SetText(GetDlgItem(hW, IDCANCEL), _("C&lose"));\r
691 \r
692                         SendMessage(GetDlgItem(hW, IDC_DATATYPE), CB_ADDSTRING, 0, (LPARAM)_("8-bit"));\r
693                         SendMessage(GetDlgItem(hW, IDC_DATATYPE), CB_ADDSTRING, 0, (LPARAM)_("16-bit"));\r
694                         SendMessage(GetDlgItem(hW, IDC_DATATYPE), CB_ADDSTRING, 0, (LPARAM)_("32-bit"));\r
695                         SendMessage(GetDlgItem(hW, IDC_DATABASE), CB_ADDSTRING, 0, (LPARAM)_("Decimal"));\r
696                         SendMessage(GetDlgItem(hW, IDC_DATABASE), CB_ADDSTRING, 0, (LPARAM)_("Hexadecimal"));\r
697 \r
698                         UpdateCheatSearchDlg(hW);\r
699                         break;\r
700 \r
701                 case WM_COMMAND:\r
702                         switch (LOWORD(wParam)) {\r
703                                 case IDCANCEL:\r
704                                         EndDialog(hW, FALSE);\r
705                                         return TRUE;\r
706 \r
707                                 case IDC_FREEZE:\r
708                                         iCurItem = SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_GETCURSEL, 0, 0);\r
709                                         DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATVALEDIT), hW, (DLGPROC)CheatFreezeProc);\r
710                                         break;\r
711 \r
712                                 case IDC_MODIFY:\r
713                                         iCurItem = SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_GETCURSEL, 0, 0);\r
714                                         DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATVALEDIT), hW, (DLGPROC)CheatModifyProc);\r
715                                         UpdateCheatSearchDlg(hW);\r
716                                         break;\r
717 \r
718                                 case IDC_COPY:\r
719                                         i = SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_GETCURSEL, 0, 0);\r
720                                         sprintf(buf, "%.8X", SearchResults[i]);\r
721 \r
722                                         if (OpenClipboard(gApp.hWnd)) {\r
723                                                 HGLOBAL hglbCopy = GlobalAlloc(GHND, 256);\r
724                                                 char *p;\r
725 \r
726                                                 if (hglbCopy != NULL) {\r
727                                                         p = (char *)GlobalLock(hglbCopy);\r
728                                                         strcpy(p, buf);\r
729                                                         GlobalUnlock(p);\r
730 \r
731                                                         EmptyClipboard();\r
732                                                         SetClipboardData(CF_TEXT, (HANDLE)hglbCopy);\r
733                                                 }\r
734 \r
735                                                 CloseClipboard();\r
736                                         }\r
737                                         break;\r
738 \r
739                                 case IDC_SEARCH:\r
740                                         current_search = SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_GETCURSEL, 0, 0);\r
741                                         current_searchtype = SendMessage(GetDlgItem(hW, IDC_DATATYPE), CB_GETCURSEL, 0, 0);\r
742                                         current_searchbase = SendMessage(GetDlgItem(hW, IDC_DATABASE), CB_GETCURSEL, 0, 0);\r
743                                         current_valuefrom = 0;\r
744                                         current_valueto = 0;\r
745 \r
746                                         if (current_searchbase == SEARCHBASE_DEC) {\r
747                                                 GetWindowText(GetDlgItem(hW, IDC_VALUEFROM), (LPTSTR)buf, 255);\r
748                                                 sscanf(buf, "%u", &current_valuefrom);\r
749                                                 GetWindowText(GetDlgItem(hW, IDC_VALUETO), (LPTSTR)buf, 255);\r
750                                                 sscanf(buf, "%u", &current_valueto);\r
751                                         }\r
752                                         else {\r
753                                                 GetWindowText(GetDlgItem(hW, IDC_VALUEFROM), (LPTSTR)buf, 255);\r
754                                                 sscanf(buf, "%x", &current_valuefrom);\r
755                                                 GetWindowText(GetDlgItem(hW, IDC_VALUETO), (LPTSTR)buf, 255);\r
756                                                 sscanf(buf, "%x", &current_valueto);\r
757                                         }\r
758 \r
759                                         switch (current_searchtype) {\r
760                                                 case SEARCHTYPE_8BIT:\r
761                                                         if (current_valuefrom > (u32)0xFF) {\r
762                                                                 current_valuefrom = 0xFF;\r
763                                                         }\r
764                                                         if (current_valueto > (u32)0xFF) {\r
765                                                                 current_valueto = 0xFF;\r
766                                                         }\r
767                                                         break;\r
768 \r
769                                                 case SEARCHTYPE_16BIT:\r
770                                                         if (current_valuefrom > (u32)0xFFFF) {\r
771                                                                 current_valuefrom = 0xFFFF;\r
772                                                         }\r
773                                                         if (current_valueto > (u32)0xFFFF) {\r
774                                                                 current_valueto = 0xFFFF;\r
775                                                         }\r
776                                                 break;\r
777                                         }\r
778 \r
779                                         if (current_search == SEARCH_RANGE && current_valuefrom > current_valueto) {\r
780                                                 u32 t = current_valuefrom;\r
781                                                 current_valuefrom = current_valueto;\r
782                                                 current_valueto = t;\r
783                                         }\r
784 \r
785                                         switch (current_search) {\r
786                                                 case SEARCH_EQUALVAL:\r
787                                                         switch (current_searchtype) {\r
788                                                                 case SEARCHTYPE_8BIT:\r
789                                                                         CheatSearchEqual8((u8)current_valuefrom);\r
790                                                                         break;\r
791 \r
792                                                                 case SEARCHTYPE_16BIT:\r
793                                                                         CheatSearchEqual16((u16)current_valuefrom);\r
794                                                                         break;\r
795 \r
796                                                                 case SEARCHTYPE_32BIT:\r
797                                                                         CheatSearchEqual32((u32)current_valuefrom);\r
798                                                                         break;\r
799                                                         }\r
800                                                         break;\r
801 \r
802                                                 case SEARCH_NOTEQUALVAL:\r
803                                                         switch (current_searchtype) {\r
804                                                                 case SEARCHTYPE_8BIT:\r
805                                                                         CheatSearchNotEqual8((u8)current_valuefrom);\r
806                                                                         break;\r
807 \r
808                                                                 case SEARCHTYPE_16BIT:\r
809                                                                         CheatSearchNotEqual16((u16)current_valuefrom);\r
810                                                                         break;\r
811 \r
812                                                                 case SEARCHTYPE_32BIT:\r
813                                                                         CheatSearchNotEqual32((u32)current_valuefrom);\r
814                                                                         break;\r
815                                                         }\r
816                                                         break;\r
817 \r
818                                                 case SEARCH_RANGE:\r
819                                                         switch (current_searchtype) {\r
820                                                                 case SEARCHTYPE_8BIT:\r
821                                                                         CheatSearchRange8((u8)current_valuefrom, (u8)current_valueto);\r
822                                                                         break;\r
823 \r
824                                                                 case SEARCHTYPE_16BIT:\r
825                                                                         CheatSearchRange16((u16)current_valuefrom, (u16)current_valueto);\r
826                                                                         break;\r
827 \r
828                                                                 case SEARCHTYPE_32BIT:\r
829                                                                         CheatSearchRange32((u32)current_valuefrom, (u32)current_valueto);\r
830                                                                         break;\r
831                                                         }\r
832                                                         break;\r
833 \r
834                                                 case SEARCH_INCBY:\r
835                                                         switch (current_searchtype) {\r
836                                                                 case SEARCHTYPE_8BIT:\r
837                                                                         CheatSearchIncreasedBy8((u8)current_valuefrom);\r
838                                                                         break;\r
839 \r
840                                                                 case SEARCHTYPE_16BIT:\r
841                                                                         CheatSearchIncreasedBy16((u16)current_valuefrom);\r
842                                                                         break;\r
843 \r
844                                                                 case SEARCHTYPE_32BIT:\r
845                                                                         CheatSearchIncreasedBy32((u32)current_valuefrom);\r
846                                                                         break;\r
847                                                         }\r
848                                                         break;\r
849 \r
850                                                 case SEARCH_DECBY:\r
851                                                         switch (current_searchtype) {\r
852                                                                 case SEARCHTYPE_8BIT:\r
853                                                                         CheatSearchDecreasedBy8((u8)current_valuefrom);\r
854                                                                         break;\r
855 \r
856                                                                 case SEARCHTYPE_16BIT:\r
857                                                                         CheatSearchDecreasedBy16((u16)current_valuefrom);\r
858                                                                         break;\r
859 \r
860                                                                 case SEARCHTYPE_32BIT:\r
861                                                                         CheatSearchDecreasedBy32((u32)current_valuefrom);\r
862                                                                         break;\r
863                                                         }\r
864                                                         break;\r
865 \r
866                                                 case SEARCH_INC:\r
867                                                         switch (current_searchtype) {\r
868                                                                 case SEARCHTYPE_8BIT:\r
869                                                                         CheatSearchIncreased8();\r
870                                                                         break;\r
871 \r
872                                                                 case SEARCHTYPE_16BIT:\r
873                                                                         CheatSearchIncreased16();\r
874                                                                         break;\r
875 \r
876                                                                 case SEARCHTYPE_32BIT:\r
877                                                                         CheatSearchIncreased32();\r
878                                                                         break;\r
879                                                         }\r
880                                                         break;\r
881 \r
882                                                 case SEARCH_DEC:\r
883                                                         switch (current_searchtype) {\r
884                                                                 case SEARCHTYPE_8BIT:\r
885                                                                         CheatSearchDecreased8();\r
886                                                                         break;\r
887 \r
888                                                                 case SEARCHTYPE_16BIT:\r
889                                                                         CheatSearchDecreased16();\r
890                                                                         break;\r
891 \r
892                                                                 case SEARCHTYPE_32BIT:\r
893                                                                         CheatSearchDecreased32();\r
894                                                                         break;\r
895                                                         }\r
896                                                         break;\r
897 \r
898                                                 case SEARCH_DIFFERENT:\r
899                                                         switch (current_searchtype) {\r
900                                                                 case SEARCHTYPE_8BIT:\r
901                                                                         CheatSearchDifferent8();\r
902                                                                         break;\r
903 \r
904                                                                 case SEARCHTYPE_16BIT:\r
905                                                                         CheatSearchDifferent16();\r
906                                                                         break;\r
907 \r
908                                                                 case SEARCHTYPE_32BIT:\r
909                                                                         CheatSearchDifferent32();\r
910                                                                         break;\r
911                                                         }\r
912                                                         break;\r
913 \r
914                                                 case SEARCH_NOCHANGE:\r
915                                                         switch (current_searchtype) {\r
916                                                                 case SEARCHTYPE_8BIT:\r
917                                                                         CheatSearchNoChange8();\r
918                                                                         break;\r
919 \r
920                                                                 case SEARCHTYPE_16BIT:\r
921                                                                         CheatSearchNoChange16();\r
922                                                                         break;\r
923 \r
924                                                                 case SEARCHTYPE_32BIT:\r
925                                                                         CheatSearchNoChange32();\r
926                                                                         break;\r
927                                                         }\r
928                                                         break;\r
929 \r
930                                                 default:\r
931                                                         assert(FALSE); // not possible\r
932                                                         break;\r
933                                         }\r
934 \r
935                                         UpdateCheatSearchDlg(hW);\r
936                                         break;\r
937 \r
938                                 case IDC_NEWSEARCH:\r
939                                         FreeCheatSearchMem();\r
940                                         FreeCheatSearchResults();\r
941 \r
942                                         current_search = SEARCH_EQUALVAL;\r
943                                         current_searchtype = SEARCHTYPE_8BIT;\r
944                                         current_searchbase = SEARCHBASE_DEC;\r
945                                         current_valuefrom = 0;\r
946                                         current_valueto = 0;\r
947 \r
948                                         UpdateCheatSearchDlg(hW);\r
949                                         EnableWindow(GetDlgItem(hW, IDC_VALUEFROM), TRUE);\r
950                                         break;\r
951 \r
952                                 case IDC_SEARCHFOR:\r
953                                         EnableWindow(GetDlgItem(hW, IDC_VALUEFROM), TRUE);\r
954 \r
955                                         if (SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_GETCURSEL, 0, 0) == SEARCH_RANGE) {\r
956                                                 ShowWindow(GetDlgItem(hW, IDC_LABEL_TO), SW_SHOW);\r
957                                                 ShowWindow(GetDlgItem(hW, IDC_VALUETO), SW_SHOW);\r
958                                         }\r
959                                         else {\r
960                                                 ShowWindow(GetDlgItem(hW, IDC_LABEL_TO), SW_HIDE);\r
961                                                 ShowWindow(GetDlgItem(hW, IDC_VALUETO), SW_HIDE);\r
962 \r
963                                                 if (SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_GETCURSEL, 0, 0) >= SEARCH_INC) {\r
964                                                         EnableWindow(GetDlgItem(hW, IDC_VALUEFROM), FALSE);\r
965                                                 }\r
966                                         }\r
967                                         break;\r
968 \r
969                                 case IDC_DATABASE:\r
970                                         if (SendMessage(GetDlgItem(hW, IDC_DATABASE), CB_GETCURSEL, 0, 0) == SEARCHBASE_DEC) {\r
971                                                 if (current_searchbase == SEARCHBASE_HEX) {\r
972                                                         GetWindowText(GetDlgItem(hW, IDC_VALUEFROM), (LPTSTR)buf, 255);\r
973                                                         sscanf(buf, "%x", &i);\r
974                                                         sprintf(buf, "%u", i);\r
975                                                         SetWindowText(GetDlgItem(hW, IDC_VALUEFROM), (LPCTSTR)buf);\r
976 \r
977                                                         GetWindowText(GetDlgItem(hW, IDC_VALUETO), (LPTSTR)buf, 255);\r
978                                                         sscanf(buf, "%x", &i);\r
979                                                         sprintf(buf, "%u", i);\r
980                                                         SetWindowText(GetDlgItem(hW, IDC_VALUETO), (LPCTSTR)buf);\r
981                                                 }\r
982                                         }\r
983                                         else if (current_searchbase == SEARCHBASE_DEC){\r
984                                                 GetWindowText(GetDlgItem(hW, IDC_VALUEFROM), (LPTSTR)buf, 255);\r
985                                                 sscanf(buf, "%u", &i);\r
986                                                 sprintf(buf, "%X", i);\r
987                                                 SetWindowText(GetDlgItem(hW, IDC_VALUEFROM), (LPCTSTR)buf);\r
988 \r
989                                                 GetWindowText(GetDlgItem(hW, IDC_VALUETO), (LPTSTR)buf, 255);\r
990                                                 sscanf(buf, "%u", &i);\r
991                                                 sprintf(buf, "%X", i);\r
992                                                 SetWindowText(GetDlgItem(hW, IDC_VALUETO), (LPCTSTR)buf);\r
993                                         }\r
994                                         current_searchbase = SendMessage(GetDlgItem(hW, IDC_DATABASE), CB_GETCURSEL, 0, 0);\r
995                                         break;\r
996 \r
997                                 case IDC_RESLIST:\r
998                                         switch (HIWORD(wParam)) {\r
999                                                 case LBN_SELCHANGE:\r
1000                                                         Button_Enable(GetDlgItem(hW, IDC_FREEZE), TRUE);\r
1001                                                         Button_Enable(GetDlgItem(hW, IDC_MODIFY), TRUE);\r
1002                                                         Button_Enable(GetDlgItem(hW, IDC_COPY), TRUE);\r
1003                                                         break;\r
1004 \r
1005                                                 case LBN_SELCANCEL:\r
1006                                                         Button_Enable(GetDlgItem(hW, IDC_FREEZE), FALSE);\r
1007                                                         Button_Enable(GetDlgItem(hW, IDC_MODIFY), FALSE);\r
1008                                                         Button_Enable(GetDlgItem(hW, IDC_COPY), FALSE);\r
1009                                                         break;\r
1010                                         }\r
1011                                         break;\r
1012                         }\r
1013                         break;\r
1014 \r
1015                 case WM_CLOSE:\r
1016                         EndDialog(hW, FALSE);\r
1017                         return TRUE;\r
1018         }\r
1019 \r
1020         return FALSE;\r
1021 }\r