Author: gedmurphy
Date: Sat Jul 7 14:09:24 2007
New Revision: 27447
URL:
http://svn.reactos.org/svn/reactos?rev=27447&view=rev
Log:
- fixes / improvements to regedit, see bug 2356 for details
- patch by carlo bramix (carlo.bramix at libero it)
- it should be noted that import_registry_file needs more work to support unicode files
Modified:
trunk/reactos/base/applications/regedit/childwnd.c
trunk/reactos/base/applications/regedit/lang/en-US.rc
trunk/reactos/base/applications/regedit/lang/it-IT.rc
trunk/reactos/base/applications/regedit/lang/pt-PT.rc
trunk/reactos/base/applications/regedit/listview.c
trunk/reactos/base/applications/regedit/regproc.c
trunk/reactos/base/applications/regedit/security.c
Modified: trunk/reactos/base/applications/regedit/childwnd.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/regedit/…
==============================================================================
--- trunk/reactos/base/applications/regedit/childwnd.c (original)
+++ trunk/reactos/base/applications/regedit/childwnd.c Sat Jul 7 14:09:24 2007
@@ -67,13 +67,18 @@
static void ResizeWnd(ChildWnd* pChildWnd, int cx, int cy)
{
HDWP hdwp = BeginDeferWindowPos(2);
- RECT rt;
+ RECT rt, rs;
+
SetRect(&rt, 0, 0, cx, cy);
-
+ cy = 0;
+ if (hStatusBar != NULL) {
+ GetWindowRect(hStatusBar, &rs);
+ cy = rs.bottom - rs.top + 8;
+ }
cx = pChildWnd->nSplitPos + SPLIT_WIDTH/2;
DeferWindowPos(hdwp, pChildWnd->hAddressBarWnd, 0, rt.left, rt.top, rt.right-rt.left,
23, SWP_NOZORDER|SWP_NOACTIVATE);
- DeferWindowPos(hdwp, pChildWnd->hTreeWnd, 0, rt.left, rt.top + 25,
pChildWnd->nSplitPos-SPLIT_WIDTH/2-rt.left, rt.bottom-rt.top - 30,
SWP_NOZORDER|SWP_NOACTIVATE);
- DeferWindowPos(hdwp, pChildWnd->hListWnd, 0, rt.left+cx , rt.top + 25,
rt.right-cx, rt.bottom-rt.top, SWP_NOZORDER|SWP_NOACTIVATE);
+ DeferWindowPos(hdwp, pChildWnd->hTreeWnd, 0, rt.left, rt.top + 25,
pChildWnd->nSplitPos-SPLIT_WIDTH/2-rt.left, rt.bottom-rt.top-cy,
SWP_NOZORDER|SWP_NOACTIVATE);
+ DeferWindowPos(hdwp, pChildWnd->hListWnd, 0, rt.left+cx , rt.top + 25,
rt.right-cx, rt.bottom-rt.top-cy, SWP_NOZORDER|SWP_NOACTIVATE);
EndDeferWindowPos(hdwp);
}
@@ -274,6 +279,17 @@
break;
}
return CallWindowProc(oldwndproc, hwnd, uMsg, wParam, lParam);
+}
+
+/* fix coords to top-left when SHIFT-F10 is pressed */
+void FixPointIfContext(POINTS *pt, HWND hWnd)
+{
+ if (pt->x == -1 && pt->y == -1) {
+ POINT p = { 0, 0 };
+ ClientToScreen(hWnd, &p);
+ pt->x = (WORD)(p.x);
+ pt->y = (WORD)(p.y);
+ }
}
/*******************************************************************************
@@ -527,6 +543,7 @@
pt = MAKEPOINTS(lParam);
cnt = ListView_GetSelectedCount(pChildWnd->hListWnd);
i = ListView_GetNextItem(pChildWnd->hListWnd, -1, LVNI_FOCUSED |
LVNI_SELECTED);
+ FixPointIfContext(&pt, pChildWnd->hListWnd);
if(i == -1)
{
TrackPopupMenu(GetSubMenu(hPopupMenus, PM_NEW), TPM_RIGHTBUTTON, pt.x, pt.y, 0,
hFrameWnd, NULL);
@@ -566,7 +583,7 @@
ScreenToClient(pChildWnd->hTreeWnd, &hti.pt);
(void)TreeView_HitTest(pChildWnd->hTreeWnd, &hti);
- if ((hti.flags & TVHT_ONITEM) != 0)
+ if ((hti.flags & TVHT_ONITEM) != 0 || (pt.x == -1 && pt.y == -1))
{
hContextMenu = GetSubMenu(hPopupMenus, PM_TREECONTEXT);
(void)TreeView_SelectItem(pChildWnd->hTreeWnd, hti.hItem);
@@ -627,7 +644,7 @@
s += _tcslen(s) + 1;
}
}
-
+ FixPointIfContext(&pt, pChildWnd->hTreeWnd);
TrackPopupMenu(hContextMenu, TPM_RIGHTBUTTON, pt.x, pt.y, 0,
pChildWnd->hWnd, NULL);
}
}
Modified: trunk/reactos/base/applications/regedit/lang/en-US.rc
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/regedit/…
==============================================================================
--- trunk/reactos/base/applications/regedit/lang/en-US.rc (original)
+++ trunk/reactos/base/applications/regedit/lang/en-US.rc Sat Jul 7 14:09:24 2007
@@ -135,6 +135,8 @@
MENUITEM "&String Value",
ID_EDIT_NEW_STRINGVALUE
MENUITEM "&Binary Value",
ID_EDIT_NEW_BINARYVALUE
MENUITEM "&DWORD Value", ID_EDIT_NEW_DWORDVALUE
+ MENUITEM "&Multi-String Value",
ID_EDIT_NEW_MULTISTRINGVALUE
+ MENUITEM "&Expandable String Value",
ID_EDIT_NEW_EXPANDABLESTRINGVALUE
END
END
POPUP ""
@@ -147,6 +149,8 @@
MENUITEM "&String Value",
ID_EDIT_NEW_STRINGVALUE
MENUITEM "&Binary Value",
ID_EDIT_NEW_BINARYVALUE
MENUITEM "&DWORD Value", ID_EDIT_NEW_DWORDVALUE
+ MENUITEM "&Multi-String Value",
ID_EDIT_NEW_MULTISTRINGVALUE
+ MENUITEM "&Expandable String Value",
ID_EDIT_NEW_EXPANDABLESTRINGVALUE
END
MENUITEM "&Find", ID_EDIT_FIND
MENUITEM SEPARATOR
Modified: trunk/reactos/base/applications/regedit/lang/it-IT.rc
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/regedit/…
==============================================================================
--- trunk/reactos/base/applications/regedit/lang/it-IT.rc (original)
+++ trunk/reactos/base/applications/regedit/lang/it-IT.rc Sat Jul 7 14:09:24 2007
@@ -131,13 +131,17 @@
END
POPUP ""
BEGIN
- POPUP "&Nuova"
+ POPUP "&Nuovo"
BEGIN
MENUITEM "&Chiave", ID_EDIT_NEW_KEY
MENUITEM SEPARATOR
- MENUITEM "&Stringa", ID_EDIT_NEW_STRINGVALUE
- MENUITEM "Valore &binario", ID_EDIT_NEW_BINARYVALUE
- MENUITEM "Valore &DWORD", ID_EDIT_NEW_DWORDVALUE
+ MENUITEM "Valore &stringa",
ID_EDIT_NEW_STRINGVALUE
+ MENUITEM "Valore &binario",
ID_EDIT_NEW_BINARYVALUE
+ MENUITEM "Valore &DWORD", ID_EDIT_NEW_DWORDVALUE
+ MENUITEM "Valore &multi-stringa",
ID_EDIT_NEW_MULTISTRINGVALUE
+
+ MENUITEM "Valore stringa &espandibile",
ID_EDIT_NEW_EXPANDABLESTRINGVALUE
+
END
END
POPUP ""
@@ -147,9 +151,13 @@
BEGIN
MENUITEM "&Chiave", ID_EDIT_NEW_KEY
MENUITEM SEPARATOR
- MENUITEM "&Stringa", ID_EDIT_NEW_STRINGVALUE
- MENUITEM "Valore &binario", ID_EDIT_NEW_BINARYVALUE
- MENUITEM "Valore &DWORD", ID_EDIT_NEW_DWORDVALUE
+ MENUITEM "Valore &stringa",
ID_EDIT_NEW_STRINGVALUE
+ MENUITEM "Valore &binario",
ID_EDIT_NEW_BINARYVALUE
+ MENUITEM "Valore &DWORD", ID_EDIT_NEW_DWORDVALUE
+ MENUITEM "Valore &multi-stringa",
ID_EDIT_NEW_MULTISTRINGVALUE
+
+ MENUITEM "Valore stringa &espandibile",
ID_EDIT_NEW_EXPANDABLESTRINGVALUE
+
END
MENUITEM "&Trova", ID_EDIT_FIND
MENUITEM SEPARATOR
@@ -175,11 +183,11 @@
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Nome:",IDC_STATIC,5,5,119,8
- EDITTEXT IDC_VALUE_NAME,5,15,200,12, WS_BORDER | WS_TABSTOP | WS_DISABLED
+ EDITTEXT IDC_VALUE_NAME,5,15,239,12,ES_AUTOHSCROLL | ES_READONLY
LTEXT "Dati:",IDC_STATIC,5,30,119,8
- EDITTEXT IDC_VALUE_DATA,5,40,200,12, WS_BORDER | WS_TABSTOP
- DEFPUSHBUTTON "OK",IDOK,140,60,30,11,WS_GROUP
- DEFPUSHBUTTON "Annulla",IDCANCEL,175,60,30,11,WS_GROUP
+ EDITTEXT IDC_VALUE_DATA,5,40,239,12
+ DEFPUSHBUTTON "OK",IDOK,142,64,50,14,WS_GROUP
+ PUSHBUTTON "Annulla",IDCANCEL,196,64,50,14,WS_GROUP
END
IDD_EDIT_MULTI_STRING DIALOG 32, 24, 252, 174
@@ -191,7 +199,9 @@
LTEXT "&Name:",IDC_STATIC,6,6,134,8
EDITTEXT IDC_VALUE_NAME,6,17,240,12,ES_AUTOHSCROLL | ES_READONLY
LTEXT "&Dati:",IDC_STATIC,6,35,161,8
- EDITTEXT IDC_VALUE_DATA,6,46,240,102,ES_AUTOHSCROLL | ES_MULTILINE |
ES_WANTRETURN | ES_AUTOVSCROLL | WS_VSCROLL
+ EDITTEXT IDC_VALUE_DATA,6,46,240,102,ES_MULTILINE |
+ ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN |
+ WS_VSCROLL
DEFPUSHBUTTON "OK",IDOK,142,154,50,14
PUSHBUTTON "Annulla",IDCANCEL,196,154,50,14
END
Modified: trunk/reactos/base/applications/regedit/lang/pt-PT.rc
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/regedit/…
==============================================================================
--- trunk/reactos/base/applications/regedit/lang/pt-PT.rc (original)
+++ trunk/reactos/base/applications/regedit/lang/pt-PT.rc Sat Jul 7 14:09:24 2007
@@ -137,7 +137,7 @@
LTEXT "Dados do valor:",IDC_STATIC,5,30,119,8
EDITTEXT IDC_VALUE_DATA,5,40,200,12, WS_BORDER | WS_TABSTOP
DEFPUSHBUTTON "OK",IDOK,140,60,30,11,WS_GROUP
- DEFPUSHBUTTON "Cancelar",IDCANCEL,175,60,30,11,WS_GROUP
+ PUSHBUTTON "Cancelar",IDCANCEL,175,60,30,11,WS_GROUP
END
/*
Modified: trunk/reactos/base/applications/regedit/listview.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/regedit/…
==============================================================================
--- trunk/reactos/base/applications/regedit/listview.c (original)
+++ trunk/reactos/base/applications/regedit/listview.c Sat Jul 7 14:09:24 2007
@@ -42,52 +42,38 @@
static DWORD g_columnToSort = ~0UL;
static BOOL g_invertSort = FALSE;
-static LPTSTR g_valueName;
#define MAX_LIST_COLUMNS (IDS_LIST_COLUMN_LAST - IDS_LIST_COLUMN_FIRST + 1)
-static int default_column_widths[MAX_LIST_COLUMNS] = { 200, 175, 400 };
-static int column_alignment[MAX_LIST_COLUMNS] = { LVCFMT_LEFT, LVCFMT_LEFT, LVCFMT_LEFT
};
+static const int default_column_widths[MAX_LIST_COLUMNS] = { 200, 175, 400 };
+static const int column_alignment[MAX_LIST_COLUMNS] = { LVCFMT_LEFT, LVCFMT_LEFT,
LVCFMT_LEFT };
LPCTSTR GetValueName(HWND hwndLV, int iStartAt)
{
int item;
- size_t len, maxLen;
- LPTSTR newStr;
LVITEM LVItem;
PLINE_INFO lineinfo;
- if (!g_valueName) g_valueName = HeapAlloc(GetProcessHeap(), 0, 1024);
- if (!g_valueName) return NULL;
- *g_valueName = 0;
- maxLen = HeapSize(GetProcessHeap(), 0, g_valueName);
- if (maxLen == -1) return NULL;
-
+ /*
+ if a new item is inserted, then no allocation,
+ otherwise the heap block will be lost!
+ */
item = ListView_GetNextItem(hwndLV, iStartAt, LVNI_SELECTED);
if (item == -1) return NULL;
+
+ /*
+ Should be always TRUE anyways
+ */
+ LVItem.iItem = item;
+ LVItem.iSubItem = 0;
LVItem.mask = LVIF_PARAM;
- LVItem.iItem = item;
- for(;;)
- {
- if(ListView_GetItem(hwndLV, &LVItem))
- {
- lineinfo = (PLINE_INFO)LVItem.lParam;
- if(!lineinfo->name)
- {
- *g_valueName = 0;
- return g_valueName;
- }
- len = _tcslen(lineinfo->name);
- if (len < maxLen - 1) break;
- newStr = HeapReAlloc(GetProcessHeap(), 0, g_valueName, maxLen * 2);
- if (!newStr) return NULL;
- g_valueName = newStr;
- maxLen *= 2;
- }
- else
+ if (ListView_GetItem(hwndLV, &LVItem) == FALSE)
+ return NULL;
+
+ lineinfo = (PLINE_INFO)LVItem.lParam;
+ if (lineinfo == NULL)
return NULL;
- }
- memcpy(g_valueName, lineinfo->name, sizeof(TCHAR) * (len + 1));
- return g_valueName;
+
+ return lineinfo->name;
}
BOOL IsDefaultValue(HWND hwndLV, int i)
@@ -110,11 +96,11 @@
*/
static void AddEntryToList(HWND hwndLV, LPTSTR Name, DWORD dwValType, void* ValBuf, DWORD
dwCount, int Position, BOOL ValExists)
{
- LINE_INFO* linfo;
+ PLINE_INFO linfo;
LVITEM item;
int index;
- linfo = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(LINE_INFO) + dwCount);
+ linfo = (PLINE_INFO)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(LINE_INFO) +
dwCount);
linfo->dwValType = dwValType;
linfo->val_len = dwCount;
if(dwCount > 0)
@@ -402,69 +388,63 @@
g_pChildWnd->nFocusPanel = 0;
break;
case LVN_BEGINLABELEDIT:
- {
- PLINE_INFO lineinfo;
- Info = (NMLVDISPINFO*)lParam;
- if(Info)
- {
- lineinfo = (PLINE_INFO)Info->item.lParam;
+ Info = (NMLVDISPINFO*)lParam;
+ if(Info)
+ {
+ PLINE_INFO lineinfo = (PLINE_INFO)Info->item.lParam;
if(!lineinfo->name || !_tcscmp(lineinfo->name, _T("")))
{
- *Result = TRUE;
+ *Result = TRUE;
}
else
{
- *Result = FALSE;
- }
- }
- else
+ *Result = FALSE;
+ }
+ }
+ else
*Result = TRUE;
- return TRUE;
- }
+ return TRUE;
case LVN_ENDLABELEDIT:
- {
- PLINE_INFO lineinfo;
- Info = (NMLVDISPINFO*)lParam;
- if(Info && Info->item.pszText)
- {
- lineinfo = (PLINE_INFO)Info->item.lParam;
+ Info = (NMLVDISPINFO*)lParam;
+ if(Info && Info->item.pszText)
+ {
+ PLINE_INFO lineinfo = (PLINE_INFO)Info->item.lParam;
if(!lineinfo->name || !_tcscmp(lineinfo->name, _T("")))
{
- *Result = FALSE;
+ *Result = FALSE;
}
else
{
- //if((ret = RenameValue(lineinfo->name, Info->item.pszText)) != ERROR_SUCCESS)
- {
- TCHAR msg[128], caption[128];
-
- LoadString(hInst, IDS_ERR_RENVAL_CAPTION, caption, sizeof(caption)/sizeof(TCHAR));
- if(_tcslen(Info->item.pszText) == 0)
- {
- LoadString(hInst, IDS_ERR_RENVAL_TOEMPTY, msg, sizeof(msg)/sizeof(TCHAR));
- MessageBox(0, msg, NULL, 0);
- *Result = TRUE;
- }
- else
- {
- HKEY hKeyRoot;
- LPCTSTR keyPath;
- LONG lResult;
- keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot);
- lResult = RegRenameValue(hKeyRoot, keyPath, Info->item.pszText,
lineinfo->name);
- if (lineinfo->name)
- LocalFree(lineinfo->name);
- lineinfo->name = _tcsdup(Info->item.pszText);
- *Result = TRUE;
- return (lResult == ERROR_SUCCESS);
- }
- }
- }
- }
- else
+ if(_tcslen(Info->item.pszText) == 0)
+ {
+ TCHAR msg[128], caption[128];
+
+ LoadString(hInst, IDS_ERR_RENVAL_TOEMPTY, msg,
sizeof(msg)/sizeof(TCHAR));
+ LoadString(hInst, IDS_ERR_RENVAL_CAPTION, caption,
sizeof(caption)/sizeof(TCHAR));
+ MessageBox(0, msg, caption, 0);
+ *Result = TRUE;
+ }
+ else
+ {
+ HKEY hKeyRoot;
+ LPCTSTR keyPath;
+ LONG lResult;
+
+ keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0,
&hKeyRoot);
+ lResult = RegRenameValue(hKeyRoot, keyPath,
Info->item.pszText, lineinfo->name);
+ lineinfo->name = realloc(lineinfo->name,
(_tcslen(Info->item.pszText)+1)*sizeof(TCHAR));
+ if (lineinfo->name != NULL)
+ _tcscpy(lineinfo->name, Info->item.pszText);
+
+ *Result = TRUE;
+ return (lResult == ERROR_SUCCESS);
+ }
+ }
+ }
+ else
*Result = TRUE;
- return TRUE;
- }
+
+ return TRUE;
}
return FALSE;
}
@@ -493,12 +473,10 @@
return NULL;
}
-void DestroyListView(HWND hwndLV) {
+void DestroyListView(HWND hwndLV)
+{
INT count, i;
LVITEM item;
-
- if (g_valueName)
- HeapFree(GetProcessHeap(), 0, g_valueName);
count = ListView_GetItemCount(hwndLV);
for (i = 0; i < count; i++) {
@@ -519,8 +497,6 @@
DWORD val_count;
HKEY hNewKey;
LONG errCode;
- INT count, i;
- LVITEM item;
BOOL AddedDefault = FALSE;
if (!hwndLV) return FALSE;
@@ -528,14 +504,8 @@
(void)ListView_EditLabel(hwndLV, -1);
SendMessage(hwndLV, WM_SETREDRAW, FALSE, 0);
- count = ListView_GetItemCount(hwndLV);
- for (i = 0; i < count; i++) {
- item.mask = LVIF_PARAM;
- item.iItem = i;
- (void)ListView_GetItem(hwndLV, &item);
- free(((LINE_INFO*)item.lParam)->name);
- HeapFree(GetProcessHeap(), 0, (void*)item.lParam);
- }
+ DestroyListView(hwndLV);
+
g_columnToSort = ~0UL;
(void)ListView_DeleteAllItems(hwndLV);
@@ -560,9 +530,12 @@
/* } */
/* dwValSize = max_val_size; */
while (RegEnumValue(hNewKey, dwIndex, ValName, &dwValNameLen, NULL,
&dwValType, ValBuf, &dwValSize) == ERROR_SUCCESS) {
+ /* Remove unwanted path from key name */
+ TCHAR *pLastBl = _tcsrchr(ValName, TEXT('\\'));
+ if (pLastBl != NULL) ++pLastBl; else pLastBl = ValName;
/* Add a terminating 0 character. Usually this is only necessary for strings.
*/
((TCHAR*)ValBuf)[dwValSize/sizeof(TCHAR)] = 0;
- AddEntryToList(hwndLV, ValName, dwValType, ValBuf, dwValSize, -1, TRUE);
+ AddEntryToList(hwndLV, pLastBl, dwValType, ValBuf, dwValSize, -1, TRUE);
dwValNameLen = max_val_name_len;
dwValSize = max_val_size;
dwValType = 0L;
Modified: trunk/reactos/base/applications/regedit/regproc.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/regedit/…
==============================================================================
--- trunk/reactos/base/applications/regedit/regproc.c (original)
+++ trunk/reactos/base/applications/regedit/regproc.c Sat Jul 7 14:09:24 2007
@@ -696,6 +696,11 @@
line_idx++;
val_name = line + line_idx;
while (TRUE) {
+ /* check if the line is unterminated (otherwise it may loop forever!) */
+ if (line[line_idx] == '\0') {
+ fprintf(stderr,"Warning! unrecognized line:\n%s\n", line);
+ return;
+ } else
if (line[line_idx] == '\\') /* skip escaped character */
{
line_idx += 2;
@@ -1391,7 +1396,19 @@
FILE* reg_file = _tfopen(filename, _T("r"));
if (reg_file) {
- processRegLines(reg_file, doSetValue);
+ unsigned char ch1 = fgetc(reg_file);
+ unsigned char ch2 = fgetc(reg_file);
+
+ /* detect UTF-16.LE or UTF-16.BE format */
+ if ((ch1 == 0xff && ch2 == 0xfe) ||
+ (ch1 == 0xfe && ch2 == 0xff)) {
+ /* TODO: implement support for UNICODE files! */
+ } else {
+ /* restore read point to the first line */
+ fseek(reg_file, 0L, SEEK_SET);
+ processRegLines(reg_file, doSetValue);
+ }
+ fclose(reg_file);
return TRUE;
}
return FALSE;
@@ -1850,3 +1867,4 @@
return TRUE;
}
+
Modified: trunk/reactos/base/applications/regedit/security.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/regedit/…
==============================================================================
--- trunk/reactos/base/applications/regedit/security.c (original)
+++ trunk/reactos/base/applications/regedit/security.c Sat Jul 7 14:09:24 2007
@@ -30,8 +30,10 @@
#endif
/* FIXME: already defined in aclui.h - causing problems when compiling with MSVC/PSDK*/
+#ifndef _MSC_VER
DEFINE_GUID(IID_IEffectivePermission, 0x3853dc76, 0x9f35, 0x407c, 0x0088,
0xa1,0xd1,0x93,0x44,0x36,0x5f,0xbc);
DEFINE_GUID(IID_ISecurityObjectTypeInfo, 0xfc3066eb, 0x79ef, 0x444b, 0x0091,
0x11,0xd1,0x8a,0x75,0xeb,0xf2,0xfa);
+#endif
/******************************************************************************
Implementation of the IUnknown methods of CRegKeySecurity