- 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

svn path=/trunk/; revision=27447
This commit is contained in:
Ged Murphy 2007-07-07 10:09:24 +00:00
parent f9fbc836c8
commit de5865bcd6
7 changed files with 139 additions and 115 deletions

View file

@ -67,13 +67,18 @@ static void draw_splitbar(HWND hWnd, int x)
static void ResizeWnd(ChildWnd* pChildWnd, int cx, int cy) static void ResizeWnd(ChildWnd* pChildWnd, int cx, int cy)
{ {
HDWP hdwp = BeginDeferWindowPos(2); HDWP hdwp = BeginDeferWindowPos(2);
RECT rt; RECT rt, rs;
SetRect(&rt, 0, 0, cx, cy);
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; 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->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->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, 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); EndDeferWindowPos(hdwp);
} }
@ -276,6 +281,17 @@ LRESULT CALLBACK AddressBarProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPar
return CallWindowProc(oldwndproc, hwnd, uMsg, wParam, lParam); 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);
}
}
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: ChildWndProc(HWND, unsigned, WORD, LONG) * FUNCTION: ChildWndProc(HWND, unsigned, WORD, LONG)
@ -527,6 +543,7 @@ LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa
pt = MAKEPOINTS(lParam); pt = MAKEPOINTS(lParam);
cnt = ListView_GetSelectedCount(pChildWnd->hListWnd); cnt = ListView_GetSelectedCount(pChildWnd->hListWnd);
i = ListView_GetNextItem(pChildWnd->hListWnd, -1, LVNI_FOCUSED | LVNI_SELECTED); i = ListView_GetNextItem(pChildWnd->hListWnd, -1, LVNI_FOCUSED | LVNI_SELECTED);
FixPointIfContext(&pt, pChildWnd->hListWnd);
if(i == -1) if(i == -1)
{ {
TrackPopupMenu(GetSubMenu(hPopupMenus, PM_NEW), TPM_RIGHTBUTTON, pt.x, pt.y, 0, hFrameWnd, NULL); TrackPopupMenu(GetSubMenu(hPopupMenus, PM_NEW), TPM_RIGHTBUTTON, pt.x, pt.y, 0, hFrameWnd, NULL);
@ -566,7 +583,7 @@ LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa
ScreenToClient(pChildWnd->hTreeWnd, &hti.pt); ScreenToClient(pChildWnd->hTreeWnd, &hti.pt);
(void)TreeView_HitTest(pChildWnd->hTreeWnd, &hti); (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); hContextMenu = GetSubMenu(hPopupMenus, PM_TREECONTEXT);
(void)TreeView_SelectItem(pChildWnd->hTreeWnd, hti.hItem); (void)TreeView_SelectItem(pChildWnd->hTreeWnd, hti.hItem);
@ -627,7 +644,7 @@ LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa
s += _tcslen(s) + 1; s += _tcslen(s) + 1;
} }
} }
FixPointIfContext(&pt, pChildWnd->hTreeWnd);
TrackPopupMenu(hContextMenu, TPM_RIGHTBUTTON, pt.x, pt.y, 0, pChildWnd->hWnd, NULL); TrackPopupMenu(hContextMenu, TPM_RIGHTBUTTON, pt.x, pt.y, 0, pChildWnd->hWnd, NULL);
} }
} }

View file

@ -135,6 +135,8 @@ BEGIN
MENUITEM "&String Value", ID_EDIT_NEW_STRINGVALUE MENUITEM "&String Value", ID_EDIT_NEW_STRINGVALUE
MENUITEM "&Binary Value", ID_EDIT_NEW_BINARYVALUE MENUITEM "&Binary Value", ID_EDIT_NEW_BINARYVALUE
MENUITEM "&DWORD Value", ID_EDIT_NEW_DWORDVALUE 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
END END
POPUP "" POPUP ""
@ -147,6 +149,8 @@ BEGIN
MENUITEM "&String Value", ID_EDIT_NEW_STRINGVALUE MENUITEM "&String Value", ID_EDIT_NEW_STRINGVALUE
MENUITEM "&Binary Value", ID_EDIT_NEW_BINARYVALUE MENUITEM "&Binary Value", ID_EDIT_NEW_BINARYVALUE
MENUITEM "&DWORD Value", ID_EDIT_NEW_DWORDVALUE 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
MENUITEM "&Find", ID_EDIT_FIND MENUITEM "&Find", ID_EDIT_FIND
MENUITEM SEPARATOR MENUITEM SEPARATOR

View file

@ -131,13 +131,17 @@ BEGIN
END END
POPUP "" POPUP ""
BEGIN BEGIN
POPUP "&Nuova" POPUP "&Nuovo"
BEGIN BEGIN
MENUITEM "&Chiave", ID_EDIT_NEW_KEY MENUITEM "&Chiave", ID_EDIT_NEW_KEY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Stringa", ID_EDIT_NEW_STRINGVALUE MENUITEM "Valore &stringa", ID_EDIT_NEW_STRINGVALUE
MENUITEM "Valore &binario", ID_EDIT_NEW_BINARYVALUE MENUITEM "Valore &binario", ID_EDIT_NEW_BINARYVALUE
MENUITEM "Valore &DWORD", ID_EDIT_NEW_DWORDVALUE 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
END END
POPUP "" POPUP ""
@ -147,9 +151,13 @@ BEGIN
BEGIN BEGIN
MENUITEM "&Chiave", ID_EDIT_NEW_KEY MENUITEM "&Chiave", ID_EDIT_NEW_KEY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Stringa", ID_EDIT_NEW_STRINGVALUE MENUITEM "Valore &stringa", ID_EDIT_NEW_STRINGVALUE
MENUITEM "Valore &binario", ID_EDIT_NEW_BINARYVALUE MENUITEM "Valore &binario", ID_EDIT_NEW_BINARYVALUE
MENUITEM "Valore &DWORD", ID_EDIT_NEW_DWORDVALUE 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
MENUITEM "&Trova", ID_EDIT_FIND MENUITEM "&Trova", ID_EDIT_FIND
MENUITEM SEPARATOR MENUITEM SEPARATOR
@ -175,11 +183,11 @@ CAPTION "Edit String"
FONT 8, "MS Shell Dlg" FONT 8, "MS Shell Dlg"
BEGIN BEGIN
LTEXT "Nome:",IDC_STATIC,5,5,119,8 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 LTEXT "Dati:",IDC_STATIC,5,30,119,8
EDITTEXT IDC_VALUE_DATA,5,40,200,12, WS_BORDER | WS_TABSTOP EDITTEXT IDC_VALUE_DATA,5,40,239,12
DEFPUSHBUTTON "OK",IDOK,140,60,30,11,WS_GROUP DEFPUSHBUTTON "OK",IDOK,142,64,50,14,WS_GROUP
DEFPUSHBUTTON "Annulla",IDCANCEL,175,60,30,11,WS_GROUP PUSHBUTTON "Annulla",IDCANCEL,196,64,50,14,WS_GROUP
END END
IDD_EDIT_MULTI_STRING DIALOG 32, 24, 252, 174 IDD_EDIT_MULTI_STRING DIALOG 32, 24, 252, 174
@ -191,7 +199,9 @@ BEGIN
LTEXT "&Name:",IDC_STATIC,6,6,134,8 LTEXT "&Name:",IDC_STATIC,6,6,134,8
EDITTEXT IDC_VALUE_NAME,6,17,240,12,ES_AUTOHSCROLL | ES_READONLY EDITTEXT IDC_VALUE_NAME,6,17,240,12,ES_AUTOHSCROLL | ES_READONLY
LTEXT "&Dati:",IDC_STATIC,6,35,161,8 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 DEFPUSHBUTTON "OK",IDOK,142,154,50,14
PUSHBUTTON "Annulla",IDCANCEL,196,154,50,14 PUSHBUTTON "Annulla",IDCANCEL,196,154,50,14
END END

View file

@ -137,7 +137,7 @@ BEGIN
LTEXT "Dados do valor:",IDC_STATIC,5,30,119,8 LTEXT "Dados do valor:",IDC_STATIC,5,30,119,8
EDITTEXT IDC_VALUE_DATA,5,40,200,12, WS_BORDER | WS_TABSTOP EDITTEXT IDC_VALUE_DATA,5,40,200,12, WS_BORDER | WS_TABSTOP
DEFPUSHBUTTON "OK",IDOK,140,60,30,11,WS_GROUP 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 END
/* /*

View file

@ -42,52 +42,38 @@ typedef struct tagLINE_INFO
static DWORD g_columnToSort = ~0UL; static DWORD g_columnToSort = ~0UL;
static BOOL g_invertSort = FALSE; static BOOL g_invertSort = FALSE;
static LPTSTR g_valueName;
#define MAX_LIST_COLUMNS (IDS_LIST_COLUMN_LAST - IDS_LIST_COLUMN_FIRST + 1) #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 const 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 column_alignment[MAX_LIST_COLUMNS] = { LVCFMT_LEFT, LVCFMT_LEFT, LVCFMT_LEFT };
LPCTSTR GetValueName(HWND hwndLV, int iStartAt) LPCTSTR GetValueName(HWND hwndLV, int iStartAt)
{ {
int item; int item;
size_t len, maxLen;
LPTSTR newStr;
LVITEM LVItem; LVITEM LVItem;
PLINE_INFO lineinfo; PLINE_INFO lineinfo;
if (!g_valueName) g_valueName = HeapAlloc(GetProcessHeap(), 0, 1024); /*
if (!g_valueName) return NULL; if a new item is inserted, then no allocation,
*g_valueName = 0; otherwise the heap block will be lost!
maxLen = HeapSize(GetProcessHeap(), 0, g_valueName); */
if (maxLen == -1) return NULL;
item = ListView_GetNextItem(hwndLV, iStartAt, LVNI_SELECTED); item = ListView_GetNextItem(hwndLV, iStartAt, LVNI_SELECTED);
if (item == -1) return NULL; if (item == -1) return NULL;
LVItem.mask = LVIF_PARAM;
/*
Should be always TRUE anyways
*/
LVItem.iItem = item; LVItem.iItem = item;
for(;;) LVItem.iSubItem = 0;
{ LVItem.mask = LVIF_PARAM;
if(ListView_GetItem(hwndLV, &LVItem)) if (ListView_GetItem(hwndLV, &LVItem) == FALSE)
{ return NULL;
lineinfo = (PLINE_INFO)LVItem.lParam;
if(!lineinfo->name) lineinfo = (PLINE_INFO)LVItem.lParam;
{ if (lineinfo == NULL)
*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
return NULL; return NULL;
}
memcpy(g_valueName, lineinfo->name, sizeof(TCHAR) * (len + 1)); return lineinfo->name;
return g_valueName;
} }
BOOL IsDefaultValue(HWND hwndLV, int i) BOOL IsDefaultValue(HWND hwndLV, int i)
@ -110,11 +96,11 @@ BOOL IsDefaultValue(HWND hwndLV, int i)
*/ */
static void AddEntryToList(HWND hwndLV, LPTSTR Name, DWORD dwValType, void* ValBuf, DWORD dwCount, int Position, BOOL ValExists) 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; LVITEM item;
int index; 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->dwValType = dwValType;
linfo->val_len = dwCount; linfo->val_len = dwCount;
if(dwCount > 0) if(dwCount > 0)
@ -402,69 +388,63 @@ BOOL ListWndNotifyProc(HWND hWnd, WPARAM wParam, LPARAM lParam, BOOL *Result)
g_pChildWnd->nFocusPanel = 0; g_pChildWnd->nFocusPanel = 0;
break; break;
case LVN_BEGINLABELEDIT: case LVN_BEGINLABELEDIT:
Info = (NMLVDISPINFO*)lParam;
if(Info)
{ {
PLINE_INFO lineinfo; PLINE_INFO lineinfo = (PLINE_INFO)Info->item.lParam;
Info = (NMLVDISPINFO*)lParam;
if(Info)
{
lineinfo = (PLINE_INFO)Info->item.lParam;
if(!lineinfo->name || !_tcscmp(lineinfo->name, _T(""))) if(!lineinfo->name || !_tcscmp(lineinfo->name, _T("")))
{ {
*Result = TRUE; *Result = TRUE;
} }
else else
{ {
*Result = FALSE; *Result = FALSE;
} }
}
else
*Result = TRUE;
return TRUE;
} }
else
*Result = TRUE;
return TRUE;
case LVN_ENDLABELEDIT: case LVN_ENDLABELEDIT:
Info = (NMLVDISPINFO*)lParam;
if(Info && Info->item.pszText)
{ {
PLINE_INFO lineinfo; PLINE_INFO lineinfo = (PLINE_INFO)Info->item.lParam;
Info = (NMLVDISPINFO*)lParam;
if(Info && Info->item.pszText)
{
lineinfo = (PLINE_INFO)Info->item.lParam;
if(!lineinfo->name || !_tcscmp(lineinfo->name, _T(""))) if(!lineinfo->name || !_tcscmp(lineinfo->name, _T("")))
{ {
*Result = FALSE; *Result = FALSE;
} }
else else
{ {
//if((ret = RenameValue(lineinfo->name, Info->item.pszText)) != ERROR_SUCCESS) if(_tcslen(Info->item.pszText) == 0)
{ {
TCHAR msg[128], caption[128]; TCHAR msg[128], caption[128];
LoadString(hInst, IDS_ERR_RENVAL_CAPTION, caption, sizeof(caption)/sizeof(TCHAR)); LoadString(hInst, IDS_ERR_RENVAL_TOEMPTY, msg, sizeof(msg)/sizeof(TCHAR));
if(_tcslen(Info->item.pszText) == 0) LoadString(hInst, IDS_ERR_RENVAL_CAPTION, caption, sizeof(caption)/sizeof(TCHAR));
{ MessageBox(0, msg, caption, 0);
LoadString(hInst, IDS_ERR_RENVAL_TOEMPTY, msg, sizeof(msg)/sizeof(TCHAR)); *Result = TRUE;
MessageBox(0, msg, NULL, 0); }
*Result = TRUE; else
} {
else HKEY hKeyRoot;
{ LPCTSTR keyPath;
HKEY hKeyRoot; LONG lResult;
LPCTSTR keyPath;
LONG lResult; keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot);
keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); lResult = RegRenameValue(hKeyRoot, keyPath, Info->item.pszText, lineinfo->name);
lResult = RegRenameValue(hKeyRoot, keyPath, Info->item.pszText, lineinfo->name); lineinfo->name = realloc(lineinfo->name, (_tcslen(Info->item.pszText)+1)*sizeof(TCHAR));
if (lineinfo->name) if (lineinfo->name != NULL)
LocalFree(lineinfo->name); _tcscpy(lineinfo->name, Info->item.pszText);
lineinfo->name = _tcsdup(Info->item.pszText);
*Result = TRUE; *Result = TRUE;
return (lResult == ERROR_SUCCESS); return (lResult == ERROR_SUCCESS);
} }
}
} }
}
else
*Result = TRUE;
return TRUE;
} }
else
*Result = TRUE;
return TRUE;
} }
return FALSE; return FALSE;
} }
@ -493,13 +473,11 @@ fail:
return NULL; return NULL;
} }
void DestroyListView(HWND hwndLV) { void DestroyListView(HWND hwndLV)
{
INT count, i; INT count, i;
LVITEM item; LVITEM item;
if (g_valueName)
HeapFree(GetProcessHeap(), 0, g_valueName);
count = ListView_GetItemCount(hwndLV); count = ListView_GetItemCount(hwndLV);
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
item.mask = LVIF_PARAM; item.mask = LVIF_PARAM;
@ -519,8 +497,6 @@ BOOL RefreshListView(HWND hwndLV, HKEY hKey, LPCTSTR keyPath)
DWORD val_count; DWORD val_count;
HKEY hNewKey; HKEY hNewKey;
LONG errCode; LONG errCode;
INT count, i;
LVITEM item;
BOOL AddedDefault = FALSE; BOOL AddedDefault = FALSE;
if (!hwndLV) return FALSE; if (!hwndLV) return FALSE;
@ -528,14 +504,8 @@ BOOL RefreshListView(HWND hwndLV, HKEY hKey, LPCTSTR keyPath)
(void)ListView_EditLabel(hwndLV, -1); (void)ListView_EditLabel(hwndLV, -1);
SendMessage(hwndLV, WM_SETREDRAW, FALSE, 0); SendMessage(hwndLV, WM_SETREDRAW, FALSE, 0);
count = ListView_GetItemCount(hwndLV); DestroyListView(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);
}
g_columnToSort = ~0UL; g_columnToSort = ~0UL;
(void)ListView_DeleteAllItems(hwndLV); (void)ListView_DeleteAllItems(hwndLV);
@ -560,9 +530,12 @@ BOOL RefreshListView(HWND hwndLV, HKEY hKey, LPCTSTR keyPath)
/* } */ /* } */
/* dwValSize = max_val_size; */ /* dwValSize = max_val_size; */
while (RegEnumValue(hNewKey, dwIndex, ValName, &dwValNameLen, NULL, &dwValType, ValBuf, &dwValSize) == ERROR_SUCCESS) { 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. */ /* Add a terminating 0 character. Usually this is only necessary for strings. */
((TCHAR*)ValBuf)[dwValSize/sizeof(TCHAR)] = 0; ((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; dwValNameLen = max_val_name_len;
dwValSize = max_val_size; dwValSize = max_val_size;
dwValType = 0L; dwValType = 0L;

View file

@ -696,6 +696,11 @@ void processSetValue(LPSTR line)
line_idx++; line_idx++;
val_name = line + line_idx; val_name = line + line_idx;
while (TRUE) { 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 */ if (line[line_idx] == '\\') /* skip escaped character */
{ {
line_idx += 2; line_idx += 2;
@ -1391,7 +1396,19 @@ BOOL import_registry_file(LPTSTR filename)
FILE* reg_file = _tfopen(filename, _T("r")); FILE* reg_file = _tfopen(filename, _T("r"));
if (reg_file) { 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 TRUE;
} }
return FALSE; return FALSE;
@ -1850,3 +1867,4 @@ BOOL RegKeyGetName(LPTSTR pszDest, size_t iDestLength, HKEY hRootKey, LPCTSTR lp
return TRUE; return TRUE;
} }

View file

@ -30,8 +30,10 @@ DEFINE_GUID(IID_IRegKeySecurity2, 0xc3ccfdb4, 0x6f88, 0x11d2, 0x00a3, 0xce,0x00,
#endif #endif
/* FIXME: already defined in aclui.h - causing problems when compiling with MSVC/PSDK*/ /* 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_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); DEFINE_GUID(IID_ISecurityObjectTypeInfo, 0xfc3066eb, 0x79ef, 0x444b, 0x0091, 0x11,0xd1,0x8a,0x75,0xeb,0xf2,0xfa);
#endif
/****************************************************************************** /******************************************************************************
Implementation of the IUnknown methods of CRegKeySecurity Implementation of the IUnknown methods of CRegKeySecurity