mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-02 19:26:32 +00:00
Regedit: Partially implemented Find/Find Next
Currently only implemented "Search Key Names"; searching key values and data not yet implemented. Also, the searching algorithm is pretty crude right now. svn path=/trunk/; revision=19712
This commit is contained in:
@@ -366,7 +366,7 @@ BEGIN
|
||||
PUSHBUTTON "A&bbrechen",IDCANCEL,197,24,50,14
|
||||
GROUPBOX "Look at",IDC_STATIC,7,25,63,51
|
||||
LTEXT "Suche &nach:",IDC_STATIC,7,8,37,10
|
||||
EDITTEXT IDD_FINDWHAT,47,7,142,13,ES_AUTOHSCROLL
|
||||
EDITTEXT IDC_FINDWHAT,47,7,142,13,ES_AUTOHSCROLL
|
||||
CONTROL "&Schlüssel",IDC_LOOKAT_KEYS,"Button",BS_AUTOCHECKBOX |
|
||||
WS_TABSTOP,14,36,35,8
|
||||
CONTROL "&Werte",IDC_LOOKAT_VALUES,"Button",BS_AUTOCHECKBOX |
|
||||
|
||||
@@ -81,8 +81,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Copy Key Name", ID_EDIT_COPYKEYNAME
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Find\tCtrl+F", ID_EDIT_FIND, GRAYED
|
||||
MENUITEM "Find Ne&xt\tF3", ID_EDIT_FINDNEXT, GRAYED
|
||||
MENUITEM "&Find\tCtrl+F", ID_EDIT_FIND
|
||||
MENUITEM "Find Ne&xt\tF3", ID_EDIT_FINDNEXT
|
||||
END
|
||||
POPUP "&View"
|
||||
BEGIN
|
||||
@@ -139,7 +139,7 @@ BEGIN
|
||||
MENUITEM "&Binary Value", ID_EDIT_NEW_BINARYVALUE
|
||||
MENUITEM "&DWORD Value", ID_EDIT_NEW_DWORDVALUE
|
||||
END
|
||||
MENUITEM "&Find", ID_EDIT_FIND, GRAYED
|
||||
MENUITEM "&Find", ID_EDIT_FIND
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Delete", ID_TREE_DELETE
|
||||
MENUITEM "&Rename", ID_TREE_RENAME
|
||||
@@ -351,6 +351,7 @@ BEGIN
|
||||
IDS_EXPAND "&Expand"
|
||||
IDS_COLLAPSE "&Collapse"
|
||||
IDS_GOTO_SUGGESTED_KEY "&Go to '%s'"
|
||||
IDS_FINISHEDFIND "Finished searching through the registry."
|
||||
END
|
||||
|
||||
/*****************************************************************/
|
||||
@@ -403,7 +404,7 @@ BEGIN
|
||||
PUSHBUTTON "Cancel",IDCANCEL,197,24,50,14
|
||||
GROUPBOX "Look at",IDC_STATIC,7,25,63,51
|
||||
LTEXT "Fi&nd what:",IDC_STATIC,7,8,37,10
|
||||
EDITTEXT IDD_FINDWHAT,47,7,142,13,ES_AUTOHSCROLL
|
||||
EDITTEXT IDC_FINDWHAT,47,7,142,13,ES_AUTOHSCROLL
|
||||
CONTROL "&Keys",IDC_LOOKAT_KEYS,"Button",BS_AUTOCHECKBOX |
|
||||
WS_TABSTOP,14,36,35,8
|
||||
CONTROL "&Values",IDC_LOOKAT_VALUES,"Button",BS_AUTOCHECKBOX |
|
||||
@@ -416,6 +417,17 @@ BEGIN
|
||||
WS_TABSTOP,83,48,90,12
|
||||
END
|
||||
|
||||
IDD_FINDING DIALOGEX 0, 0, 145, 50
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP |
|
||||
WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Find"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
ICON IDI_REGEDIT,IDC_STATIC,7,7,20,20
|
||||
PUSHBUTTON "&Cancel",IDCANCEL,93,29,45,14
|
||||
LTEXT "Searching the registry...",IDC_STATIC,33,12,83,8
|
||||
END
|
||||
|
||||
/*
|
||||
* TEXTINCLUDE
|
||||
*/
|
||||
|
||||
@@ -142,6 +142,9 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
case ID_TREE_EXPORT:
|
||||
ExportRegistryFile(pChildWnd->hTreeWnd);
|
||||
break;
|
||||
case ID_EDIT_FIND:
|
||||
FindDialog(hWnd);
|
||||
break;
|
||||
case ID_EDIT_COPYKEYNAME:
|
||||
hSelection = TreeView_GetSelection(pChildWnd->hTreeWnd);
|
||||
keyPath = GetItemPath(pChildWnd->hTreeWnd, hSelection, &hRootKey);
|
||||
|
||||
@@ -0,0 +1,314 @@
|
||||
/*
|
||||
* Regedit find dialog
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
|
||||
#include <windows.h>
|
||||
#include <tchar.h>
|
||||
#include <commctrl.h>
|
||||
#include <commdlg.h>
|
||||
#include <cderr.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <shellapi.h>
|
||||
#include <objsel.h>
|
||||
#include <objbase.h>
|
||||
#include <ole2.h>
|
||||
|
||||
#include "main.h"
|
||||
#include "regproc.h"
|
||||
|
||||
static TCHAR s_szFindWhat[256];
|
||||
static const TCHAR s_szFindFlags[] = _T("FindFlags");
|
||||
static const TCHAR s_szFindFlagsR[] = _T("FindFlagsReactOS");
|
||||
static HWND s_hwndAbortDialog;
|
||||
static BOOL s_bAbort;
|
||||
|
||||
|
||||
|
||||
static DWORD GetFindFlags(void)
|
||||
{
|
||||
HKEY hKey;
|
||||
DWORD dwFlags = RSF_LOOKATKEYS;
|
||||
DWORD dwType, dwValue, cbData;
|
||||
|
||||
if (RegOpenKey(HKEY_CURRENT_USER, g_szGeneralRegKey, &hKey) == ERROR_SUCCESS)
|
||||
{
|
||||
/* Retrieve flags from registry key */
|
||||
cbData = sizeof(dwValue);
|
||||
if (RegQueryValueEx(hKey, s_szFindFlags, NULL, &dwType, (LPBYTE) &dwValue, &cbData) == ERROR_SUCCESS)
|
||||
{
|
||||
if (dwType == REG_DWORD)
|
||||
dwFlags = (dwFlags & ~0x0000FFFF) | ((dwValue & 0x0000FFFF) << 0);
|
||||
}
|
||||
|
||||
/* Retrieve ReactOS Regedit specific flags from registry key */
|
||||
cbData = sizeof(dwValue);
|
||||
if (RegQueryValueEx(hKey, s_szFindFlagsR, NULL, &dwType, (LPBYTE) &dwValue, &cbData) == ERROR_SUCCESS)
|
||||
{
|
||||
if (dwType == REG_DWORD)
|
||||
dwFlags = (dwFlags & ~0xFFFF0000) | ((dwValue & 0x0000FFFF) << 16);
|
||||
}
|
||||
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
return dwFlags;
|
||||
}
|
||||
|
||||
static void SetFindFlags(DWORD dwFlags)
|
||||
{
|
||||
HKEY hKey;
|
||||
DWORD dwDisposition;
|
||||
DWORD dwData;
|
||||
|
||||
if (RegCreateKeyEx(HKEY_CURRENT_USER, g_szGeneralRegKey, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition) == ERROR_SUCCESS)
|
||||
{
|
||||
dwData = (dwFlags >> 0) & 0x0000FFFF;
|
||||
RegSetValueEx(hKey, s_szFindFlags, 0, REG_DWORD, (const BYTE *) &dwData, sizeof(dwData));
|
||||
|
||||
dwData = (dwFlags >> 16) & 0x0000FFFF;
|
||||
RegSetValueEx(hKey, s_szFindFlagsR, 0, REG_DWORD, (const BYTE *) &dwData, sizeof(dwData));
|
||||
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
}
|
||||
|
||||
static INT_PTR CALLBACK AbortFindDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch(uMsg)
|
||||
{
|
||||
case WM_CLOSE:
|
||||
s_bAbort = TRUE;
|
||||
break;
|
||||
|
||||
case WM_COMMAND:
|
||||
switch(HIWORD(wParam))
|
||||
{
|
||||
case BN_CLICKED:
|
||||
switch(LOWORD(wParam))
|
||||
{
|
||||
case IDCANCEL:
|
||||
s_bAbort = TRUE;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static BOOL RegSearchProc(LPVOID lpParam)
|
||||
{
|
||||
MSG msg;
|
||||
|
||||
if (s_hwndAbortDialog && PeekMessage(&msg, s_hwndAbortDialog, 0, 0, PM_REMOVE))
|
||||
{
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
return s_bAbort;
|
||||
}
|
||||
|
||||
BOOL FindNext(HWND hWnd)
|
||||
{
|
||||
HKEY hKeyRoot;
|
||||
LPCTSTR pszFindWhat;
|
||||
LPCTSTR pszKeyPath;
|
||||
DWORD dwFlags;
|
||||
LONG lResult;
|
||||
TCHAR szSubKey[512];
|
||||
TCHAR szError[512];
|
||||
TCHAR szTitle[64];
|
||||
TCHAR szFullKey[512];
|
||||
|
||||
pszFindWhat = s_szFindWhat;
|
||||
dwFlags = GetFindFlags() & ~(RSF_LOOKATVALUES | RSF_LOOKATDATA);
|
||||
|
||||
pszKeyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot);
|
||||
lstrcpyn(szSubKey, pszKeyPath, sizeof(szSubKey) / sizeof(szSubKey[0]));
|
||||
|
||||
/* Create abort find dialog */
|
||||
s_hwndAbortDialog = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_FINDING), hWnd, AbortFindDialogProc);
|
||||
if (s_hwndAbortDialog)
|
||||
ShowWindow(s_hwndAbortDialog, SW_SHOW);
|
||||
s_bAbort = FALSE;
|
||||
|
||||
lResult = RegSearch(hKeyRoot, szSubKey, sizeof(szSubKey) / sizeof(szSubKey[0]),
|
||||
pszFindWhat, 0, dwFlags, RegSearchProc, NULL);
|
||||
|
||||
if (s_hwndAbortDialog)
|
||||
{
|
||||
DestroyWindow(s_hwndAbortDialog);
|
||||
s_hwndAbortDialog = NULL;
|
||||
}
|
||||
|
||||
/* Did the user click "Cancel"? If so, exit without displaying an error message */
|
||||
if (lResult == ERROR_OPERATION_ABORTED)
|
||||
return FALSE;
|
||||
|
||||
if (lResult != ERROR_SUCCESS)
|
||||
{
|
||||
LoadString(NULL, IDS_APP_TITLE, szTitle, sizeof(szTitle) / sizeof(szTitle[0]));
|
||||
|
||||
if ((lResult != ERROR_NO_MORE_ITEMS) || !LoadString(NULL, IDS_FINISHEDFIND, szError, sizeof(szError) / sizeof(szError[0])))
|
||||
{
|
||||
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, lResult, 0,
|
||||
szError, sizeof(szError) / sizeof(szError[0]), NULL);
|
||||
}
|
||||
MessageBox(hWnd, szError, szTitle, MB_OK);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
RegKeyGetName(szFullKey, sizeof(szFullKey) / sizeof(szFullKey[0]), hKeyRoot, szSubKey);
|
||||
SelectNode(g_pChildWnd->hTreeWnd, szFullKey);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static INT_PTR CALLBACK FindDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
INT_PTR iResult = 0;
|
||||
HWND hControl;
|
||||
LONG lStyle;
|
||||
DWORD dwFlags;
|
||||
static TCHAR s_szSavedFindValue[256];
|
||||
|
||||
switch(uMsg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
dwFlags = GetFindFlags();
|
||||
|
||||
/* Looking at values is not yet implemented */
|
||||
hControl = GetDlgItem(hDlg, IDC_LOOKAT_KEYS);
|
||||
if (hControl)
|
||||
SendMessage(hControl, BM_SETCHECK, (dwFlags & RSF_LOOKATKEYS) ? TRUE : FALSE, 0);
|
||||
|
||||
/* Looking at values is not yet implemented */
|
||||
hControl = GetDlgItem(hDlg, IDC_LOOKAT_VALUES);
|
||||
if (hControl)
|
||||
{
|
||||
lStyle = GetWindowLong(hControl, GWL_STYLE);
|
||||
SetWindowLong(hControl, GWL_STYLE, lStyle | WS_DISABLED);
|
||||
}
|
||||
|
||||
/* Looking at data is not yet implemented */
|
||||
hControl = GetDlgItem(hDlg, IDC_LOOKAT_DATA);
|
||||
if (hControl)
|
||||
{
|
||||
lStyle = GetWindowLong(hControl, GWL_STYLE);
|
||||
SetWindowLong(hControl, GWL_STYLE, lStyle | WS_DISABLED);
|
||||
}
|
||||
|
||||
/* Match whole string */
|
||||
hControl = GetDlgItem(hDlg, IDC_MATCHSTRING);
|
||||
if (hControl)
|
||||
SendMessage(hControl, BM_SETCHECK, (dwFlags & RSF_WHOLESTRING) ? TRUE : FALSE, 0);
|
||||
|
||||
/* Case sensitivity */
|
||||
hControl = GetDlgItem(hDlg, IDC_MATCHCASE);
|
||||
if (hControl)
|
||||
SendMessage(hControl, BM_SETCHECK, (dwFlags & RSF_MATCHCASE) ? TRUE : FALSE, 0);
|
||||
|
||||
hControl = GetDlgItem(hDlg, IDC_FINDWHAT);
|
||||
if (hControl)
|
||||
{
|
||||
SetWindowText(hControl, s_szSavedFindValue);
|
||||
SetFocus(hControl);
|
||||
SendMessage(hControl, EM_SETSEL, 0, -1);
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_CLOSE:
|
||||
EndDialog(hDlg, 0);
|
||||
break;
|
||||
|
||||
case WM_COMMAND:
|
||||
switch(HIWORD(wParam))
|
||||
{
|
||||
case BN_CLICKED:
|
||||
switch(LOWORD(wParam))
|
||||
{
|
||||
case IDOK:
|
||||
dwFlags = 0;
|
||||
|
||||
hControl = GetDlgItem(hDlg, IDC_LOOKAT_KEYS);
|
||||
if (hControl && (SendMessage(hControl, BM_GETCHECK, 0, 0) == BST_CHECKED))
|
||||
dwFlags |= RSF_LOOKATKEYS;
|
||||
|
||||
hControl = GetDlgItem(hDlg, IDC_LOOKAT_VALUES);
|
||||
if (hControl && (SendMessage(hControl, BM_GETCHECK, 0, 0) == BST_CHECKED))
|
||||
dwFlags |= RSF_LOOKATVALUES;
|
||||
|
||||
hControl = GetDlgItem(hDlg, IDC_LOOKAT_DATA);
|
||||
if (hControl && (SendMessage(hControl, BM_GETCHECK, 0, 0) == BST_CHECKED))
|
||||
dwFlags |= RSF_LOOKATDATA;
|
||||
|
||||
hControl = GetDlgItem(hDlg, IDC_MATCHSTRING);
|
||||
if (hControl && (SendMessage(hControl, BM_GETCHECK, 0, 0) == BST_CHECKED))
|
||||
dwFlags |= RSF_WHOLESTRING;
|
||||
|
||||
hControl = GetDlgItem(hDlg, IDC_MATCHCASE);
|
||||
if (hControl && (SendMessage(hControl, BM_GETCHECK, 0, 0) == BST_CHECKED))
|
||||
dwFlags |= RSF_MATCHCASE;
|
||||
|
||||
SetFindFlags(dwFlags);
|
||||
|
||||
hControl = GetDlgItem(hDlg, IDC_FINDWHAT);
|
||||
if (hControl)
|
||||
GetWindowText(hControl, s_szFindWhat, sizeof(s_szFindWhat) / sizeof(s_szFindWhat[0]));
|
||||
EndDialog(hDlg, 1);
|
||||
break;
|
||||
|
||||
case IDCANCEL:
|
||||
EndDialog(hDlg, 0);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case EN_CHANGE:
|
||||
switch(LOWORD(wParam))
|
||||
{
|
||||
case IDC_FINDWHAT:
|
||||
GetWindowText((HWND) lParam, s_szSavedFindValue, sizeof(s_szSavedFindValue) / sizeof(s_szSavedFindValue[0]));
|
||||
hControl = GetDlgItem(hDlg, IDOK);
|
||||
if (hControl)
|
||||
{
|
||||
lStyle = GetWindowLong(hControl, GWL_STYLE);
|
||||
if (s_szSavedFindValue[0])
|
||||
lStyle &= ~WS_DISABLED;
|
||||
else
|
||||
lStyle |= WS_DISABLED;
|
||||
SetWindowLong(hControl, GWL_STYLE, lStyle);
|
||||
RedrawWindow(hControl, NULL, NULL, RDW_INVALIDATE);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
return iResult;
|
||||
}
|
||||
|
||||
void FindDialog(HWND hWnd)
|
||||
{
|
||||
if (DialogBoxParam(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_FIND),
|
||||
hWnd, FindDialogProc, 0) != 0)
|
||||
{
|
||||
FindNext(hWnd);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -905,7 +905,7 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
break;
|
||||
case ID_EDIT_DELETE:
|
||||
{
|
||||
if (GetFocus() == g_pChildWnd->hListWnd)
|
||||
if (GetFocus() == g_pChildWnd->hListWnd)
|
||||
{
|
||||
UINT nSelected = ListView_GetSelectedCount(g_pChildWnd->hListWnd);
|
||||
if(nSelected >= 1)
|
||||
@@ -966,6 +966,12 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
break;
|
||||
|
||||
}
|
||||
case ID_EDIT_FIND:
|
||||
FindDialog(hWnd);
|
||||
break;
|
||||
case ID_EDIT_FINDNEXT:
|
||||
FindNext(hWnd);
|
||||
break;
|
||||
case ID_EDIT_COPYKEYNAME:
|
||||
CopyKeyName(hWnd, hKeyRoot, keyPath);
|
||||
break;
|
||||
|
||||
@@ -50,6 +50,7 @@ HMENU hMenuFrame;
|
||||
HMENU hPopupMenus = 0;
|
||||
UINT nClipboardFormat;
|
||||
LPCTSTR strClipboardFormat = _T("TODO: SET CORRECT FORMAT");
|
||||
const TCHAR g_szGeneralRegKey[] = _T("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Regedit");
|
||||
|
||||
|
||||
#define MAX_LOADSTRING 100
|
||||
@@ -162,8 +163,7 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
|
||||
}
|
||||
|
||||
/* Restore position */
|
||||
if (RegQueryStringValue(HKEY_CURRENT_USER,
|
||||
_T("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Regedit"),
|
||||
if (RegQueryStringValue(HKEY_CURRENT_USER, g_szGeneralRegKey,
|
||||
_T("LastKey"),
|
||||
szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0])) == ERROR_SUCCESS)
|
||||
{
|
||||
|
||||
@@ -79,12 +79,18 @@ extern TCHAR szTitle[];
|
||||
extern TCHAR szFrameClass[];
|
||||
extern TCHAR szChildClass[];
|
||||
|
||||
extern const TCHAR g_szGeneralRegKey[];
|
||||
|
||||
/* about.c */
|
||||
extern void ShowAboutBox(HWND hWnd);
|
||||
|
||||
/* childwnd.c */
|
||||
extern LRESULT CALLBACK ChildWndProc(HWND, UINT, WPARAM, LPARAM);
|
||||
|
||||
/* find.c */
|
||||
extern void FindDialog(HWND hWnd);
|
||||
extern BOOL FindNext(HWND hWnd);
|
||||
|
||||
/* framewnd.c */
|
||||
extern LRESULT CALLBACK FrameWndProc(HWND, UINT, WPARAM, LPARAM);
|
||||
extern void SetupStatusBar(HWND hWnd, BOOL bResize);
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
<file>about.c</file>
|
||||
<file>childwnd.c</file>
|
||||
<file>edit.c</file>
|
||||
<file>find.c</file>
|
||||
<file>framewnd.c</file>
|
||||
<file>hexedit.c</file>
|
||||
<file>listview.c</file>
|
||||
|
||||
@@ -1594,7 +1594,7 @@ LONG RegRenameKey(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpNewName)
|
||||
{
|
||||
LPCTSTR s;
|
||||
LPTSTR lpNewSubKey = NULL;
|
||||
LONG Ret = 0;
|
||||
LONG Ret = 0;
|
||||
|
||||
s = _tcsrchr(lpSubKey, _T('\\'));
|
||||
if (s)
|
||||
@@ -1686,6 +1686,145 @@ done:
|
||||
return lResult;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Searching
|
||||
*/
|
||||
|
||||
static LONG RegNextKey(HKEY hKey, LPTSTR lpSubKey, size_t iSubKeyLength)
|
||||
{
|
||||
LONG lResult;
|
||||
LPTSTR s;
|
||||
LPCTSTR pszOriginalKey;
|
||||
TCHAR szKeyName[256];
|
||||
HKEY hSubKey, hBaseKey;
|
||||
DWORD dwIndex = 0;
|
||||
DWORD cbName;
|
||||
FILETIME ft;
|
||||
BOOL bFoundKey = FALSE;
|
||||
|
||||
/* Try accessing a subkey */
|
||||
if (RegOpenKeyEx(hKey, lpSubKey, 0, KEY_ALL_ACCESS, &hSubKey) == ERROR_SUCCESS)
|
||||
{
|
||||
cbName = iSubKeyLength - _tcslen(lpSubKey) - 1;
|
||||
lResult = RegEnumKeyEx(hSubKey, 0, lpSubKey + _tcslen(lpSubKey) + 1,
|
||||
&cbName, NULL, NULL, NULL, &ft);
|
||||
RegCloseKey(hSubKey);
|
||||
|
||||
if (lResult == ERROR_SUCCESS)
|
||||
{
|
||||
lpSubKey[_tcslen(lpSubKey)] = '\\';
|
||||
bFoundKey = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (!bFoundKey)
|
||||
{
|
||||
/* Go up and find the next sibling key */
|
||||
do
|
||||
{
|
||||
s = _tcsrchr(lpSubKey, '\\');
|
||||
if (s)
|
||||
{
|
||||
*s = '\0';
|
||||
pszOriginalKey = s + 1;
|
||||
|
||||
hBaseKey = NULL;
|
||||
RegOpenKeyEx(hKey, lpSubKey, 0, KEY_ALL_ACCESS, &hBaseKey);
|
||||
}
|
||||
else
|
||||
{
|
||||
pszOriginalKey = lpSubKey;
|
||||
hBaseKey = hKey;
|
||||
}
|
||||
|
||||
if (hBaseKey)
|
||||
{
|
||||
dwIndex = 0;
|
||||
do
|
||||
{
|
||||
lResult = RegEnumKey(hBaseKey, dwIndex++, szKeyName, sizeof(szKeyName) / sizeof(szKeyName[0]));
|
||||
}
|
||||
while((lResult == ERROR_SUCCESS) && _tcscmp(szKeyName, pszOriginalKey));
|
||||
|
||||
if (lResult == ERROR_SUCCESS)
|
||||
{
|
||||
lResult = RegEnumKey(hBaseKey, dwIndex++, szKeyName, sizeof(szKeyName) / sizeof(szKeyName[0]));
|
||||
if (lResult == ERROR_SUCCESS)
|
||||
{
|
||||
bFoundKey = TRUE;
|
||||
_sntprintf(lpSubKey + _tcslen(lpSubKey), iSubKeyLength - _tcslen(lpSubKey), _T("\\%s"), szKeyName);
|
||||
}
|
||||
}
|
||||
RegCloseKey(hBaseKey);
|
||||
}
|
||||
}
|
||||
while(!bFoundKey);
|
||||
}
|
||||
return bFoundKey ? ERROR_SUCCESS : ERROR_NO_MORE_ITEMS;
|
||||
}
|
||||
|
||||
static BOOL RegSearchCompare(LPCTSTR s1, LPCTSTR s2, DWORD dwSearchFlags)
|
||||
{
|
||||
BOOL bResult;
|
||||
if (dwSearchFlags & RSF_WHOLESTRING)
|
||||
{
|
||||
if (dwSearchFlags & RSF_MATCHCASE)
|
||||
bResult = !_tcscmp(s1, s2);
|
||||
else
|
||||
bResult = !_tcsicmp(s1, s2);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (dwSearchFlags & RSF_MATCHCASE)
|
||||
bResult = (_tcsstr(s1, s2) != NULL);
|
||||
else
|
||||
{
|
||||
/* My kingdom for _tcsistr() */
|
||||
bResult = FALSE;
|
||||
while(*s1)
|
||||
{
|
||||
if (!_tcsnicmp(s1, s2, _tcslen(s2)))
|
||||
{
|
||||
bResult = TRUE;
|
||||
break;
|
||||
}
|
||||
s1++;
|
||||
}
|
||||
}
|
||||
}
|
||||
return bResult;
|
||||
}
|
||||
|
||||
LONG RegSearch(HKEY hKey, LPTSTR lpSubKey, size_t iSubKeyLength,
|
||||
LPCTSTR pszSearchString, DWORD dwValueIndex,
|
||||
DWORD dwSearchFlags, BOOL (*pfnCallback)(LPVOID), LPVOID lpParam)
|
||||
{
|
||||
LONG lResult;
|
||||
LPCTSTR s;
|
||||
|
||||
if (dwSearchFlags & (RSF_LOOKATVALUES | RSF_LOOKATDATA))
|
||||
return ERROR_CALL_NOT_IMPLEMENTED; /* NYI */
|
||||
|
||||
do
|
||||
{
|
||||
if (pfnCallback)
|
||||
{
|
||||
if (pfnCallback(lpParam))
|
||||
return ERROR_OPERATION_ABORTED;
|
||||
}
|
||||
|
||||
lResult = RegNextKey(hKey, lpSubKey, iSubKeyLength);
|
||||
if (lResult != ERROR_SUCCESS)
|
||||
return lResult;
|
||||
|
||||
s = _tcsrchr(lpSubKey, '\\');
|
||||
s = s ? s + 1 : lpSubKey;
|
||||
}
|
||||
while(!(dwSearchFlags & RSF_LOOKATKEYS) || !RegSearchCompare(s, pszSearchString, dwSearchFlags));
|
||||
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Key naming and parsing
|
||||
*/
|
||||
|
||||
@@ -85,7 +85,6 @@ BOOL RegKeyEditPermissions(HWND hWndOwner, HKEY hKey, LPCTSTR lpMachine, LPCTSTR
|
||||
/*
|
||||
* Processing
|
||||
*/
|
||||
LONG RegDeleteKeyRecursive(HKEY hKey, LPCTSTR lpSubKey);
|
||||
LONG RegCopyKey(HKEY hDestKey, LPCTSTR lpDestSubKey, HKEY hSrcKey, LPCTSTR lpSrcSubKey);
|
||||
LONG RegMoveKey(HKEY hDestKey, LPCTSTR lpDestSubKey, HKEY hSrcKey, LPCTSTR lpSrcSubKey);
|
||||
LONG RegRenameKey(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpNewName);
|
||||
@@ -95,6 +94,16 @@ LONG RegQueryStringValue(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, LPTST
|
||||
/*
|
||||
* Miscellaneous
|
||||
*/
|
||||
#define RSF_WHOLESTRING 0x00000001
|
||||
#define RSF_LOOKATKEYS 0x00000002
|
||||
#define RSF_LOOKATVALUES 0x00000004
|
||||
#define RSF_LOOKATDATA 0x00000008
|
||||
#define RSF_MATCHCASE 0x00010000
|
||||
|
||||
LONG RegSearch(HKEY hKey, LPTSTR lpSubKey, size_t iSubKeyLength,
|
||||
LPCTSTR pszSearchString, DWORD dwValueIndex,
|
||||
DWORD dwSearchFlags, BOOL (*pfnCallback)(LPVOID), LPVOID lpParam);
|
||||
|
||||
BOOL RegKeyGetName(LPTSTR pszDest, size_t iDestLength, HKEY hRootKey, LPCTSTR lpSubKey);
|
||||
|
||||
/* EOF */
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
#define IDD_ADDFAVORITES 138
|
||||
#define IDD_REMOVEFAVORITES 139
|
||||
#define IDD_FIND 140
|
||||
#define IDD_FINDING 141
|
||||
#define IDC_LICENSE_EDIT 1029
|
||||
#define ID_REGISTRY_EXIT 32770
|
||||
#define ID_FAVOURITES_ADDTOFAVOURITES 32772
|
||||
@@ -194,12 +195,13 @@
|
||||
|
||||
#define IDC_FAVORITENAME 2011
|
||||
#define IDC_FAVORITESLIST 2012
|
||||
#define IDD_FINDWHAT 2013
|
||||
#define IDC_FINDWHAT 2013
|
||||
#define IDC_LOOKAT_KEYS 2014
|
||||
#define IDC_LOOKAT_VALUES 2015
|
||||
#define IDC_LOOKAT_DATA 2016
|
||||
#define IDC_MATCHSTRING 2017
|
||||
#define IDC_MATCHCASE 2018
|
||||
#define IDS_FINISHEDFIND 2019
|
||||
|
||||
#define ID_FAVORITES_MIN 2100
|
||||
#define ID_FAVORITES_MAX 2999
|
||||
|
||||
Reference in New Issue
Block a user