ReactOS 0.4.15-dev-6656-gbbb33a6
find.c
Go to the documentation of this file.
1/*
2 * Regedit find dialog
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19#include "regedit.h"
20
21#define RSF_WHOLESTRING 0x00000001
22#define RSF_LOOKATKEYS 0x00000002
23#define RSF_LOOKATVALUES 0x00000004
24#define RSF_LOOKATDATA 0x00000008
25#define RSF_MATCHCASE 0x00010000
26
27static WCHAR s_szFindWhat[256];
28static const WCHAR s_szFindFlags[] = L"FindFlags";
29static const WCHAR s_szFindFlagsR[] = L"FindFlagsReactOS";
32
36static const WCHAR s_empty[] = L"";
37static const WCHAR s_backslash[] = L"\\";
38
39extern VOID SetValueName(HWND hwndLV, LPCWSTR pszValueName);
40
42{
43 MSG msg;
44 if (PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE))
45 {
46 if (msg.message == WM_QUIT)
47 s_bAbort = TRUE;
49 {
52 }
53 }
54 return s_bAbort;
55}
56
57static LPWSTR lstrstri(LPCWSTR psz1, LPCWSTR psz2)
58{
59 INT i, cch1, cch2;
60
61 cch1 = wcslen(psz1);
62 cch2 = wcslen(psz2);
63 for(i = 0; i <= cch1 - cch2; i++)
64 {
66 psz1 + i, cch2, psz2, cch2) == 2)
67 return (LPWSTR) (psz1 + i);
68 }
69 return NULL;
70}
71
72static BOOL CompareName(LPCWSTR pszName1, LPCWSTR pszName2)
73{
75 {
77 return wcscmp(pszName1, pszName2) == 0;
78 else
79 return _wcsicmp(pszName1, pszName2) == 0;
80 }
81 else
82 {
84 return wcsstr(pszName1, pszName2) != NULL;
85 else
86 return lstrstri(pszName1, pszName2) != NULL;
87 }
88}
89
90/* Do not assume that pch1 is terminated with UNICODE_NULL */
91static BOOL MatchString(LPCWCH pch1, INT cch1, LPCWCH pch2, INT cch2)
92{
93 INT i;
94 DWORD dwNorm = ((s_dwFlags & RSF_MATCHCASE) ? NORM_IGNORECASE : 0);
95
97 return 2 == CompareStringW(LOCALE_SYSTEM_DEFAULT, dwNorm, pch1, cch1, pch2, cch2);
98
99 if (cch1 < cch2)
100 return FALSE;
101
102 for (i = 0; i <= cch1 - cch2; i++)
103 {
104 if (2 == CompareStringW(LOCALE_SYSTEM_DEFAULT, dwNorm, pch1 + i, cch2, pch2, cch2))
105 return TRUE;
106 }
107
108 return FALSE;
109}
110
111static BOOL MatchData(DWORD dwType, LPCVOID pv1, DWORD cb1)
112{
113 if (dwType == REG_SZ || dwType == REG_EXPAND_SZ || dwType == REG_MULTI_SZ)
114 return MatchString(pv1, (INT)(cb1 / sizeof(WCHAR)), s_szFindWhat, lstrlenW(s_szFindWhat));
115
116 return FALSE;
117}
118
119int compare(const void *x, const void *y)
120{
121 const LPCWSTR *a = (const LPCWSTR *)x;
122 const LPCWSTR *b = (const LPCWSTR *)y;
123 return _wcsicmp(*a, *b);
124}
125
127 HKEY hKey,
128 LPCWSTR pszSubKey,
129 LPCWSTR pszValueName,
130 LPWSTR *ppszFoundSubKey,
131 LPWSTR *ppszFoundValueName)
132{
133 HKEY hSubKey;
134 LONG lResult;
135 WCHAR szSubKey[MAX_PATH];
136 DWORD i, c, cb, type;
137 BOOL fPast;
138 LPWSTR *ppszNames = NULL;
139 LPBYTE pb = NULL;
140
141 if (DoEvents())
142 return FALSE;
143
144 if(wcslen(pszSubKey) >= _countof(szSubKey))
145 return FALSE;
146
147 wcscpy(szSubKey, pszSubKey);
148 hSubKey = NULL;
149
150 lResult = RegOpenKeyExW(hKey, szSubKey, 0, KEY_ALL_ACCESS, &hSubKey);
151 if (lResult != ERROR_SUCCESS)
152 return FALSE;
153
154 lResult = RegQueryInfoKeyW(hSubKey, NULL, NULL, NULL, NULL, NULL, NULL,
155 &c, NULL, NULL, NULL, NULL);
156 if (lResult != ERROR_SUCCESS)
157 goto err;
158 ppszNames = (LPWSTR *) malloc(c * sizeof(LPWSTR));
159 if (ppszNames == NULL)
160 goto err;
161 ZeroMemory(ppszNames, c * sizeof(LPWSTR));
162
163 /* Retrieve the value names associated with the current key */
164 for(i = 0; i < c; i++)
165 {
166 if (DoEvents())
167 goto err;
168
170 lResult = RegEnumValueW(hSubKey, i, s_szName, &s_cchName, NULL, NULL,
171 NULL, &cb);
172 if (lResult == ERROR_NO_MORE_ITEMS)
173 {
174 c = i;
175 break;
176 }
177 if (lResult != ERROR_SUCCESS)
178 goto err;
180 continue;
181
182 ppszNames[i] = _wcsdup(s_szName);
183 }
184
185 qsort(ppszNames, c, sizeof(LPWSTR), compare);
186
187 /* If pszValueName is NULL, the function will search for all values within the key */
188 fPast = (pszValueName == NULL);
189
190 /* Search within the values */
191 for (i = 0; i < c; i++)
192 {
193 if (DoEvents())
194 goto err;
195
196 if (!fPast && _wcsicmp(ppszNames[i], pszValueName) == 0)
197 {
198 fPast = TRUE;
199 continue;
200 }
201 if (!fPast)
202 continue;
203
204 if ((s_dwFlags & RSF_LOOKATVALUES) &&
205 CompareName(ppszNames[i], s_szFindWhat))
206 {
207 *ppszFoundSubKey = _wcsdup(szSubKey);
208 *ppszFoundValueName = _wcsdup(ppszNames[i]);
209 goto success;
210 }
211
212 lResult = RegQueryValueExW(hSubKey, ppszNames[i], NULL, &type,
213 NULL, &cb);
214 if (lResult != ERROR_SUCCESS)
215 goto err;
216 pb = malloc(cb);
217 if (pb == NULL)
218 goto err;
219 lResult = RegQueryValueExW(hSubKey, ppszNames[i], NULL, &type,
220 pb, &cb);
221 if (lResult != ERROR_SUCCESS)
222 goto err;
223
224 if ((s_dwFlags & RSF_LOOKATDATA) && MatchData(type, pb, cb))
225 {
226 *ppszFoundSubKey = _wcsdup(szSubKey);
227 *ppszFoundValueName = _wcsdup(ppszNames[i]);
228 goto success;
229 }
230 free(pb);
231 pb = NULL;
232 }
233
234 if (ppszNames != NULL)
235 {
236 for(i = 0; i < c; i++)
237 free(ppszNames[i]);
238 free(ppszNames);
239 }
240 ppszNames = NULL;
241
242 /* Retrieve the number of sub-keys */
243 lResult = RegQueryInfoKeyW(hSubKey, NULL, NULL, NULL, &c, NULL, NULL,
244 NULL, NULL, NULL, NULL, NULL);
245 if (lResult != ERROR_SUCCESS)
246 goto err;
247 ppszNames = (LPWSTR *) malloc(c * sizeof(LPWSTR));
248 if (ppszNames == NULL)
249 goto err;
250 ZeroMemory(ppszNames, c * sizeof(LPWSTR));
251
252 /* Retrieve the names of the sub-keys */
253 for(i = 0; i < c; i++)
254 {
255 if (DoEvents())
256 goto err;
257
259 lResult = RegEnumKeyExW(hSubKey, i, s_szName, &s_cchName, NULL, NULL,
260 NULL, NULL);
261 if (lResult == ERROR_NO_MORE_ITEMS)
262 {
263 c = i;
264 break;
265 }
266 if (lResult != ERROR_SUCCESS)
267 goto err;
269 continue;
270
271 ppszNames[i] = _wcsdup(s_szName);
272 }
273
274 qsort(ppszNames, c, sizeof(LPWSTR), compare);
275
276 /* Search within the sub-keys */
277 for(i = 0; i < c; i++)
278 {
279 if (DoEvents())
280 goto err;
281
282 if ((s_dwFlags & RSF_LOOKATKEYS) &&
283 CompareName(ppszNames[i], s_szFindWhat))
284 {
285 *ppszFoundSubKey = malloc(
286 (wcslen(szSubKey) + wcslen(ppszNames[i]) + 2) *
287 sizeof(WCHAR));
288 if (*ppszFoundSubKey == NULL)
289 goto err;
290 if (szSubKey[0])
291 {
292 wcscpy(*ppszFoundSubKey, szSubKey);
293 wcscat(*ppszFoundSubKey, s_backslash);
294 }
295 else
296 **ppszFoundSubKey = 0;
297 wcscat(*ppszFoundSubKey, ppszNames[i]);
298 *ppszFoundValueName = NULL;
299 goto success;
300 }
301
302 /* Search within the value entries of the sub-key */
303 if (RegFindRecurse(hSubKey, ppszNames[i], NULL, ppszFoundSubKey,
304 ppszFoundValueName))
305 {
306 LPWSTR psz = *ppszFoundSubKey;
307 *ppszFoundSubKey = malloc(
308 (wcslen(szSubKey) + wcslen(psz) + 2) * sizeof(WCHAR));
309 if (*ppszFoundSubKey == NULL)
310 goto err;
311 if (szSubKey[0])
312 {
313 wcscpy(*ppszFoundSubKey, szSubKey);
314 wcscat(*ppszFoundSubKey, s_backslash);
315 }
316 else
317 **ppszFoundSubKey = 0;
318 wcscat(*ppszFoundSubKey, psz);
319 free(psz);
320 goto success;
321 }
322 }
323
324err:
325 if (ppszNames != NULL)
326 {
327 for(i = 0; i < c; i++)
328 free(ppszNames[i]);
329 free(ppszNames);
330 }
331 free(pb);
332 RegCloseKey(hSubKey);
333 return FALSE;
334
335success:
336 if (ppszNames != NULL)
337 {
338 for(i = 0; i < c; i++)
339 free(ppszNames[i]);
340 free(ppszNames);
341 }
342 RegCloseKey(hSubKey);
343 return TRUE;
344}
345
347 HKEY * phKey,
348 LPCWSTR pszSubKey,
349 LPCWSTR pszValueName,
350 LPWSTR *ppszFoundSubKey,
351 LPWSTR *ppszFoundValueName)
352{
353 LONG lResult;
354 DWORD i, c;
355 HKEY hBaseKey, hSubKey;
356 WCHAR szKeyName[MAX_PATH];
357 WCHAR szSubKey[MAX_PATH];
358 LPWSTR pch;
359 BOOL fPast, fKeyMatched;
360 LPWSTR *ppszNames = NULL;
361
362 hBaseKey = *phKey;
363
364 if (wcslen(pszSubKey) >= _countof(szSubKey))
365 return FALSE;
366
367 if (RegFindRecurse(hBaseKey, pszSubKey, pszValueName, ppszFoundSubKey,
368 ppszFoundValueName))
369 return TRUE;
370
371 wcscpy(szSubKey, pszSubKey);
372 while(szSubKey[0] != 0)
373 {
374 if (DoEvents())
375 return FALSE;
376
377 pch = wcsrchr(szSubKey, L'\\');
378 if (pch == NULL)
379 {
380 wcscpy(szKeyName, szSubKey);
381 szSubKey[0] = 0;
382 hSubKey = hBaseKey;
383 }
384 else
385 {
386 lstrcpynW(szKeyName, pch + 1, MAX_PATH);
387 *pch = 0;
388 lResult = RegOpenKeyExW(hBaseKey, szSubKey, 0, KEY_ALL_ACCESS,
389 &hSubKey);
390 if (lResult != ERROR_SUCCESS)
391 return FALSE;
392 }
393
394 lResult = RegQueryInfoKeyW(hSubKey, NULL, NULL, NULL, &c, NULL, NULL,
395 NULL, NULL, NULL, NULL, NULL);
396 if (lResult != ERROR_SUCCESS)
397 goto err;
398
399 ppszNames = (LPWSTR *) malloc(c * sizeof(LPWSTR));
400 if (ppszNames == NULL)
401 goto err;
402 ZeroMemory(ppszNames, c * sizeof(LPWSTR));
403
404 for(i = 0; i < c; i++)
405 {
406 if (DoEvents())
407 goto err;
408
410 lResult = RegEnumKeyExW(hSubKey, i, s_szName, &s_cchName,
411 NULL, NULL, NULL, NULL);
412 if (lResult == ERROR_NO_MORE_ITEMS)
413 {
414 c = i;
415 break;
416 }
417 if (lResult != ERROR_SUCCESS)
418 break;
419 ppszNames[i] = _wcsdup(s_szName);
420 }
421
422 qsort(ppszNames, c, sizeof(LPWSTR), compare);
423
424 fPast = FALSE;
425 for(i = 0; i < c; i++)
426 {
427 if (DoEvents())
428 goto err;
429
430 if (!fPast && _wcsicmp(ppszNames[i], szKeyName) == 0)
431 {
432 fPast = TRUE;
433 continue;
434 }
435 if (!fPast)
436 continue;
437
438 if ((s_dwFlags & RSF_LOOKATKEYS) &&
439 CompareName(ppszNames[i], s_szFindWhat))
440 {
441 *ppszFoundSubKey = malloc(
442 (wcslen(szSubKey) + wcslen(ppszNames[i]) + 2) *
443 sizeof(WCHAR));
444 if (*ppszFoundSubKey == NULL)
445 goto err;
446 if (szSubKey[0])
447 {
448 wcscpy(*ppszFoundSubKey, szSubKey);
449 wcscat(*ppszFoundSubKey, s_backslash);
450 }
451 else
452 **ppszFoundSubKey = 0;
453 wcscat(*ppszFoundSubKey, ppszNames[i]);
454 *ppszFoundValueName = NULL;
455 goto success;
456 }
457
458 fKeyMatched = (_wcsicmp(ppszNames[i], szKeyName) == 0);
459 if (RegFindRecurse(hSubKey, ppszNames[i], (fKeyMatched ? pszValueName : NULL),
460 ppszFoundSubKey, ppszFoundValueName))
461 {
462 LPWSTR psz = *ppszFoundSubKey;
463 *ppszFoundSubKey = malloc(
464 (wcslen(szSubKey) + wcslen(psz) + 2) *
465 sizeof(WCHAR));
466 if (*ppszFoundSubKey == NULL)
467 goto err;
468 if (szSubKey[0])
469 {
470 wcscpy(*ppszFoundSubKey, szSubKey);
471 wcscat(*ppszFoundSubKey, s_backslash);
472 }
473 else
474 **ppszFoundSubKey = 0;
475 wcscat(*ppszFoundSubKey, psz);
476 free(psz);
477 goto success;
478 }
479 }
480 if (ppszNames != NULL)
481 {
482 for(i = 0; i < c; i++)
483 free(ppszNames[i]);
484 free(ppszNames);
485 }
486 ppszNames = NULL;
487
488 if (hBaseKey != hSubKey)
489 RegCloseKey(hSubKey);
490 }
491
492 if (*phKey == HKEY_CLASSES_ROOT)
493 {
494 *phKey = HKEY_CURRENT_USER;
495 if (RegFindRecurse(*phKey, s_empty, NULL, ppszFoundSubKey,
496 ppszFoundValueName))
497 return TRUE;
498 }
499
500 if (*phKey == HKEY_CURRENT_USER)
501 {
502 *phKey = HKEY_LOCAL_MACHINE;
503 if (RegFindRecurse(*phKey, s_empty, NULL, ppszFoundSubKey,
504 ppszFoundValueName))
505 goto success;
506 }
507
508 if (*phKey == HKEY_LOCAL_MACHINE)
509 {
510 *phKey = HKEY_USERS;
511 if (RegFindRecurse(*phKey, s_empty, NULL, ppszFoundSubKey,
512 ppszFoundValueName))
513 goto success;
514 }
515
516 if (*phKey == HKEY_USERS)
517 {
518 *phKey = HKEY_CURRENT_CONFIG;
519 if (RegFindRecurse(*phKey, s_empty, NULL, ppszFoundSubKey,
520 ppszFoundValueName))
521 goto success;
522 }
523
524err:
525 if (ppszNames != NULL)
526 {
527 for(i = 0; i < c; i++)
528 free(ppszNames[i]);
529 free(ppszNames);
530 }
531 if (hBaseKey != hSubKey)
532 RegCloseKey(hSubKey);
533 return FALSE;
534
535success:
536 if (ppszNames != NULL)
537 {
538 for(i = 0; i < c; i++)
539 free(ppszNames[i]);
540 free(ppszNames);
541 }
542 if (hBaseKey != hSubKey)
543 RegCloseKey(hSubKey);
544 return TRUE;
545}
546
547
548static DWORD GetFindFlags(void)
549{
550 HKEY hKey;
551 DWORD dwType, dwValue, cbData;
553
555 {
556 /* Retrieve flags from registry key */
557 cbData = sizeof(dwValue);
558 if (RegQueryValueExW(hKey, s_szFindFlags, NULL, &dwType, (LPBYTE) &dwValue, &cbData) == ERROR_SUCCESS)
559 {
560 if (dwType == REG_DWORD)
561 dwFlags = (dwFlags & ~0x0000FFFF) | ((dwValue & 0x0000FFFF) << 0);
562 }
563
564 /* Retrieve ReactOS Regedit specific flags from registry key */
565 cbData = sizeof(dwValue);
566 if (RegQueryValueExW(hKey, s_szFindFlagsR, NULL, &dwType, (LPBYTE) &dwValue, &cbData) == ERROR_SUCCESS)
567 {
568 if (dwType == REG_DWORD)
569 dwFlags = (dwFlags & ~0xFFFF0000) | ((dwValue & 0x0000FFFF) << 16);
570 }
571
573 }
574 return dwFlags;
575}
576
578{
579 HKEY hKey;
580 DWORD dwDisposition;
582
584 {
585 dwData = (dwFlags >> 0) & 0x0000FFFF;
586 RegSetValueExW(hKey, s_szFindFlags, 0, REG_DWORD, (const BYTE *) &dwData, sizeof(dwData));
587
588 dwData = (dwFlags >> 16) & 0x0000FFFF;
589 RegSetValueExW(hKey, s_szFindFlagsR, 0, REG_DWORD, (const BYTE *) &dwData, sizeof(dwData));
590
592 }
593}
594
596{
599
600 switch(uMsg)
601 {
602 case WM_CLOSE:
603 s_bAbort = TRUE;
604 break;
605
606 case WM_COMMAND:
607 switch(HIWORD(wParam))
608 {
609 case BN_CLICKED:
610 switch(LOWORD(wParam))
611 {
612 case IDCANCEL:
613 s_bAbort = TRUE;
614 break;
615 }
616 break;
617 }
618 break;
619 }
620 return 0;
621}
622
624{
625 HKEY hKeyRoot;
626 LPCWSTR pszKeyPath;
627 BOOL fSuccess;
628 WCHAR szFullKey[512];
629 LPCWSTR pszValueName;
630 LPWSTR pszFoundSubKey, pszFoundValueName;
631
632 if (wcslen(s_szFindWhat) == 0)
633 {
635 return TRUE;
636 }
637
639
640 pszKeyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot);
641 if (pszKeyPath == NULL)
642 {
643 hKeyRoot = HKEY_CLASSES_ROOT;
644 pszKeyPath = s_empty;
645 }
646
647 /* Create abort find dialog */
651 {
654 }
655 s_bAbort = FALSE;
656
657 pszValueName = GetValueName(g_pChildWnd->hListWnd, -1);
658
663
664 fSuccess = RegFindWalk(&hKeyRoot, pszKeyPath, pszValueName,
665 &pszFoundSubKey, &pszFoundValueName);
666
671
673 {
676 }
677
678 if (fSuccess)
679 {
680 GetKeyName(szFullKey, ARRAY_SIZE(szFullKey), hKeyRoot, pszFoundSubKey);
681 SelectNode(g_pChildWnd->hTreeWnd, szFullKey);
682 free(pszFoundSubKey);
683
684 if (pszFoundValueName != NULL)
685 {
686 SetValueName(g_pChildWnd->hListWnd, pszFoundValueName);
687 free(pszFoundValueName);
689 }
690 else
691 {
693 }
694 }
695 return fSuccess || s_bAbort;
696}
697
699{
700 INT_PTR iResult = 0;
701 HWND hControl;
702 LONG lStyle;
704 static WCHAR s_szSavedFindValue[256];
705
706 switch(uMsg)
707 {
708 case WM_INITDIALOG:
710
711 hControl = GetDlgItem(hDlg, IDC_LOOKAT_KEYS);
712 if (hControl)
714
715 hControl = GetDlgItem(hDlg, IDC_LOOKAT_VALUES);
716 if (hControl)
718
719 hControl = GetDlgItem(hDlg, IDC_LOOKAT_DATA);
720 if (hControl)
722
723 /* Match whole string */
724 hControl = GetDlgItem(hDlg, IDC_MATCHSTRING);
725 if (hControl)
727
728 /* Case sensitivity */
729 hControl = GetDlgItem(hDlg, IDC_MATCHCASE);
730 if (hControl)
732
733 hControl = GetDlgItem(hDlg, IDC_FINDWHAT);
734 if (hControl)
735 {
736 SetWindowTextW(hControl, s_szSavedFindValue);
737 SetFocus(hControl);
738 SendMessageW(hControl, EM_SETSEL, 0, -1);
739 }
740 break;
741
742 case WM_CLOSE:
743 EndDialog(hDlg, 0);
744 break;
745
746 case WM_COMMAND:
747 switch(HIWORD(wParam))
748 {
749 case BN_CLICKED:
750 switch(LOWORD(wParam))
751 {
752 case IDOK:
753 dwFlags = 0;
754
755 hControl = GetDlgItem(hDlg, IDC_LOOKAT_KEYS);
756 if (hControl && (SendMessageW(hControl, BM_GETCHECK, 0, 0) == BST_CHECKED))
758
759 hControl = GetDlgItem(hDlg, IDC_LOOKAT_VALUES);
760 if (hControl && (SendMessageW(hControl, BM_GETCHECK, 0, 0) == BST_CHECKED))
762
763 hControl = GetDlgItem(hDlg, IDC_LOOKAT_DATA);
764 if (hControl && (SendMessageW(hControl, BM_GETCHECK, 0, 0) == BST_CHECKED))
766
767 hControl = GetDlgItem(hDlg, IDC_MATCHSTRING);
768 if (hControl && (SendMessageW(hControl, BM_GETCHECK, 0, 0) == BST_CHECKED))
770
771 hControl = GetDlgItem(hDlg, IDC_MATCHCASE);
772 if (hControl && (SendMessageW(hControl, BM_GETCHECK, 0, 0) == BST_CHECKED))
774
776
777 hControl = GetDlgItem(hDlg, IDC_FINDWHAT);
778 if (hControl)
780 EndDialog(hDlg, 1);
781 break;
782
783 case IDCANCEL:
784 EndDialog(hDlg, 0);
785 break;
786 }
787 break;
788
789 case EN_CHANGE:
790 switch(LOWORD(wParam))
791 {
792 case IDC_FINDWHAT:
793 GetWindowTextW((HWND) lParam, s_szSavedFindValue, ARRAY_SIZE(s_szSavedFindValue));
794 hControl = GetDlgItem(hDlg, IDOK);
795 if (hControl)
796 {
797 lStyle = GetWindowLongPtr(hControl, GWL_STYLE);
798 if (s_szSavedFindValue[0])
799 lStyle &= ~WS_DISABLED;
800 else
801 lStyle |= WS_DISABLED;
802 SetWindowLongPtr(hControl, GWL_STYLE, lStyle);
804 }
805 break;
806 }
807 }
808 break;
809 }
810 return iResult;
811}
812
814{
815 if (!FindNext(hWnd))
816 {
817 WCHAR msg[128], caption[128];
818
820 LoadStringW(hInst, IDS_APP_TITLE, caption, ARRAY_SIZE(caption));
822 }
823}
824
826{
828 hWnd, FindDialogProc, 0) != 0)
829 {
831 }
832}
#define compare
#define msg(x)
Definition: auth_time.c:54
const TCHAR g_szGeneralRegKey[]
Definition: settings.c:16
HWND hWnd
Definition: settings.c:17
#define IDS_APP_TITLE
Definition: resource.h:10
ChildWnd * g_pChildWnd
Definition: childwnd.c:23
BOOL GetKeyName(LPWSTR pszDest, size_t iDestLength, HKEY hRootKey, LPCWSTR lpSubKey)
Definition: edit.c:1588
BOOL RegFindRecurse(HKEY hKey, LPCWSTR pszSubKey, LPCWSTR pszValueName, LPWSTR *ppszFoundSubKey, LPWSTR *ppszFoundValueName)
Definition: find.c:126
static WCHAR s_szName[MAX_PATH]
Definition: find.c:34
static BOOL CompareName(LPCWSTR pszName1, LPCWSTR pszName2)
Definition: find.c:72
void FindNextMessageBox(HWND hWnd)
Definition: find.c:813
VOID SetValueName(HWND hwndLV, LPCWSTR pszValueName)
Definition: listview.c:84
#define RSF_MATCHCASE
Definition: find.c:25
BOOL RegFindWalk(HKEY *phKey, LPCWSTR pszSubKey, LPCWSTR pszValueName, LPWSTR *ppszFoundSubKey, LPWSTR *ppszFoundValueName)
Definition: find.c:346
static BOOL s_bAbort
Definition: find.c:31
static INT_PTR CALLBACK FindDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: find.c:698
static DWORD s_cchName
Definition: find.c:35
#define RSF_WHOLESTRING
Definition: find.c:21
static void SetFindFlags(DWORD dwFlags)
Definition: find.c:577
#define RSF_LOOKATVALUES
Definition: find.c:23
static HWND s_hwndAbortDialog
Definition: find.c:30
#define RSF_LOOKATDATA
Definition: find.c:24
static const WCHAR s_szFindFlagsR[]
Definition: find.c:29
static const WCHAR s_empty[]
Definition: find.c:36
static INT_PTR CALLBACK AbortFindDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: find.c:595
static BOOL MatchString(LPCWCH pch1, INT cch1, LPCWCH pch2, INT cch2)
Definition: find.c:91
void FindDialog(HWND hWnd)
Definition: find.c:825
static LPWSTR lstrstri(LPCWSTR psz1, LPCWSTR psz2)
Definition: find.c:57
static DWORD GetFindFlags(void)
Definition: find.c:548
BOOL FindNext(HWND hWnd)
Definition: find.c:623
static WCHAR s_szFindWhat[256]
Definition: find.c:27
static const WCHAR s_szFindFlags[]
Definition: find.c:28
static DWORD s_dwFlags
Definition: find.c:33
BOOL DoEvents(VOID)
Definition: find.c:41
static const WCHAR s_backslash[]
Definition: find.c:37
#define RSF_LOOKATKEYS
Definition: find.c:22
WCHAR * GetValueName(HWND hwndLV, int iStartAt)
Definition: listview.c:55
HWND hFrameWnd
Definition: main.c:35
BOOL SelectNode(HWND hwndTV, LPCWSTR keyPath)
Definition: treeview.c:785
#define ARRAY_SIZE(A)
Definition: main.h:33
LPCWSTR GetItemPath(HWND hwndTV, HTREEITEM hItem, HKEY *phRootKey)
Definition: treeview.c:88
#define IDC_LOOKAT_DATA
Definition: resource.h:283
#define IDS_FINISHEDFIND
Definition: resource.h:201
#define IDD_FINDING
Definition: resource.h:49
#define IDC_LOOKAT_VALUES
Definition: resource.h:282
#define IDC_FINDWHAT
Definition: resource.h:280
#define IDD_FIND
Definition: resource.h:48
#define IDC_MATCHSTRING
Definition: resource.h:284
#define IDC_LOOKAT_KEYS
Definition: resource.h:281
#define IDC_MATCHCASE
Definition: resource.h:285
#define RegCloseKey(hKey)
Definition: registry.h:47
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1091
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3353
LONG WINAPI RegEnumKeyExW(_In_ HKEY hKey, _In_ DWORD dwIndex, _Out_ LPWSTR lpName, _Inout_ LPDWORD lpcbName, _Reserved_ LPDWORD lpReserved, _Out_opt_ LPWSTR lpClass, _Inout_opt_ LPDWORD lpcbClass, _Out_opt_ PFILETIME lpftLastWriteTime)
Definition: reg.c:2524
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:3288
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4897
LONG WINAPI RegEnumValueW(_In_ HKEY hKey, _In_ DWORD index, _Out_ LPWSTR value, _Inout_ PDWORD val_count, _Reserved_ PDWORD reserved, _Out_opt_ PDWORD type, _Out_opt_ LPBYTE data, _Inout_opt_ PDWORD count)
Definition: reg.c:2850
LONG WINAPI RegQueryInfoKeyW(HKEY hKey, LPWSTR lpClass, LPDWORD lpcClass, LPDWORD lpReserved, LPDWORD lpcSubKeys, LPDWORD lpcMaxSubKeyLen, LPDWORD lpcMaxClassLen, LPDWORD lpcValues, LPDWORD lpcMaxValueNameLen, LPDWORD lpcMaxValueLen, LPDWORD lpcbSecurityDescriptor, PFILETIME lpftLastWriteTime)
Definition: reg.c:3687
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4118
#define wcsrchr
Definition: compat.h:16
#define ERROR_NO_MORE_ITEMS
Definition: compat.h:105
#define MAX_PATH
Definition: compat.h:34
#define CALLBACK
Definition: compat.h:35
#define lstrcpynW
Definition: compat.h:738
#define lstrlenW
Definition: compat.h:750
HINSTANCE hInst
Definition: dxdiag.c:13
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
const GLubyte * c
Definition: glext.h:8905
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
_CONST_RETURN wchar_t *__cdecl wcsstr(_In_z_ const wchar_t *_Str, _In_z_ const wchar_t *_SubStr)
#define c
Definition: ke_i.h:80
INT WINAPI CompareStringW(LCID lcid, DWORD flags, LPCWSTR str1, INT len1, LPCWSTR str2, INT len2)
Definition: lang.c:2671
#define REG_SZ
Definition: layer.c:22
#define pch(ap)
Definition: match.c:418
static HANDLE ULONG_PTR dwData
Definition: file.c:35
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
unsigned int UINT
Definition: ndis.h:50
#define KEY_ALL_ACCESS
Definition: nt_native.h:1041
#define REG_OPTION_NON_VOLATILE
Definition: nt_native.h:1057
#define REG_MULTI_SZ
Definition: nt_native.h:1501
#define REG_EXPAND_SZ
Definition: nt_native.h:1494
#define LOCALE_SYSTEM_DEFAULT
CONST WCHAR * LPCWCH
Definition: ntbasedef.h:411
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:317
#define L(x)
Definition: ntvdm.h:50
#define LOWORD(l)
Definition: pedump.c:82
long LONG
Definition: pedump.c:60
#define WS_DISABLED
Definition: pedump.c:621
#define err(...)
#define REG_DWORD
Definition: sdbapi.c:596
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
_Check_return_ _CRTIMP wchar_t *__cdecl _wcsdup(_In_z_ const wchar_t *_Str)
_CRTIMP wchar_t *__cdecl wcscat(_Inout_updates_z_(_String_length_(_Dest)+_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
void __cdecl qsort(_Inout_updates_bytes_(_NumOfElements *_SizeOfElements) void *_Base, _In_ size_t _NumOfElements, _In_ size_t _SizeOfElements, _In_ int(__cdecl *_PtFuncCompare)(const void *, const void *))
#define _countof(array)
Definition: sndvol32.h:68
HWND hTreeWnd
Definition: main.h:63
HWND hListWnd
Definition: main.h:64
HWND hAddressBarWnd
Definition: main.h:65
Definition: bug.cpp:8
#define GetWindowLongPtr
Definition: treelist.c:73
#define SetWindowLongPtr
Definition: treelist.c:70
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
int32_t INT_PTR
Definition: typedefs.h:64
unsigned char * LPBYTE
Definition: typedefs.h:53
int32_t INT
Definition: typedefs.h:58
#define HIWORD(l)
Definition: typedefs.h:247
int WINAPI GetWindowTextW(HWND hWnd, LPWSTR lpString, int nMaxCount)
Definition: window.c:1412
#define success(from, fromstr, to, tostr)
#define ZeroMemory
Definition: winbase.h:1700
#define GetModuleHandle
Definition: winbase.h:3752
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
LONG_PTR LPARAM
Definition: windef.h:208
UINT_PTR WPARAM
Definition: windef.h:207
CONST void * LPCVOID
Definition: windef.h:191
#define NORM_IGNORECASE
Definition: winnls.h:176
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define HKEY_CURRENT_CONFIG
Definition: winreg.h:15
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
#define HKEY_USERS
Definition: winreg.h:13
#define WM_CLOSE
Definition: winuser.h:1611
BOOL WINAPI RedrawWindow(_In_opt_ HWND, _In_opt_ LPCRECT, _In_opt_ HRGN, _In_ UINT)
#define WM_QUIT
Definition: winuser.h:1613
BOOL WINAPI TranslateMessage(_In_ const MSG *)
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
BOOL WINAPI IsDialogMessageW(_In_ HWND, _In_ LPMSG)
#define IDCANCEL
Definition: winuser.h:825
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
#define WM_COMMAND
Definition: winuser.h:1730
#define WM_INITDIALOG
Definition: winuser.h:1729
int WINAPI MessageBoxW(_In_opt_ HWND hWnd, _In_opt_ LPCWSTR lpText, _In_opt_ LPCWSTR lpCaption, _In_ UINT uType)
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define IDOK
Definition: winuser.h:824
#define BM_SETCHECK
Definition: winuser.h:1911
BOOL WINAPI SetWindowTextW(_In_ HWND, _In_opt_ LPCWSTR)
HWND WINAPI SetFocus(_In_opt_ HWND)
BOOL WINAPI PeekMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT, _In_ UINT)
#define PM_REMOVE
Definition: winuser.h:1186
BOOL WINAPI UpdateWindow(_In_ HWND)
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
#define EM_SETSEL
Definition: winuser.h:2008
#define CreateDialogW(h, n, w, f)
Definition: winuser.h:4271
LRESULT WINAPI DispatchMessageW(_In_ const MSG *)
#define MB_ICONINFORMATION
Definition: winuser.h:796
#define BN_CLICKED
Definition: winuser.h:1915
#define SW_SHOW
Definition: winuser.h:769
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define GWL_STYLE
Definition: winuser.h:846
BOOL WINAPI DestroyWindow(_In_ HWND)
#define RDW_INVALIDATE
Definition: winuser.h:1204
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define BST_CHECKED
Definition: winuser.h:197
INT_PTR WINAPI DialogBoxParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
#define BM_GETCHECK
Definition: winuser.h:1908
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
#define EN_CHANGE
Definition: winuser.h:2012
_IRQL_requires_same_ _In_ PVOID _In_ PVOID MatchData
Definition: rtltypes.h:410
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
unsigned char BYTE
Definition: xxhash.c:193