[REGEDIT]

- Implement hex editing. Patch by Katayama Hirofumi.
See issue #5447 for more details.

svn path=/trunk/; revision=47781
This commit is contained in:
Gabriel Ilardi 2010-06-15 10:28:01 +00:00
parent b20e4f29cd
commit 981690481a
3 changed files with 226 additions and 89 deletions

View file

@ -416,14 +416,11 @@ INT_PTR CALLBACK modify_binary_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, L
if ((hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA))) if ((hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA)))
{ {
len = (UINT) HexEdit_GetBufferSize(hwndValue); len = (UINT) HexEdit_GetBufferSize(hwndValue);
if (len != valueDataLen && len > 0) if (len > 0 && binValueData)
{ binValueData = HeapReAlloc(GetProcessHeap(), 0, binValueData, len);
binValueData = HeapReAlloc(GetProcessHeap(), 0, binValueData, len); else
} binValueData = HeapAlloc(GetProcessHeap(), 0, len + 1);
if (len > 0) HexEdit_CopyBuffer(hwndValue, binValueData, len);
{
HexEdit_CopyBuffer(hwndValue, binValueData, len);
}
valueDataLen = len; valueDataLen = len;
} }
EndDialog(hwndDlg, IDOK); EndDialog(hwndDlg, IDOK);
@ -622,7 +619,7 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
} }
else if (EditBin == TRUE || type == REG_NONE || type == REG_BINARY) else if (EditBin == TRUE || type == REG_NONE || type == REG_BINARY)
{ {
#ifndef UNICODE #ifndef UNICODE
LPWSTR u_valuename; LPWSTR u_valuename;
int len_vname = lstrlen(valueName); int len_vname = lstrlen(valueName);
@ -639,10 +636,10 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
} }
else else
u_valuename = L""; u_valuename = L"";
#endif #endif
if(valueDataLen > 0) if(valueDataLen > 0)
{ {
if(!(binValueData = HeapAlloc(GetProcessHeap(), 0, valueDataLen))) if(!(binValueData = HeapAlloc(GetProcessHeap(), 0, valueDataLen + 1)))
{ {
error(hwnd, IDS_TOO_BIG_VALUE, valueDataLen); error(hwnd, IDS_TOO_BIG_VALUE, valueDataLen);
goto done; goto done;
@ -650,19 +647,19 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
/* force to use the unicode version, so editing strings in binary mode is correct */ /* force to use the unicode version, so editing strings in binary mode is correct */
lRet = RegQueryValueExW(hKey, lRet = RegQueryValueExW(hKey,
#ifndef UNICODE #ifndef UNICODE
u_valuename, u_valuename,
#else #else
valueName, valueName,
#endif #endif
0, 0, (LPBYTE)binValueData, &valueDataLen); 0, 0, (LPBYTE)binValueData, &valueDataLen);
if (lRet != ERROR_SUCCESS) if (lRet != ERROR_SUCCESS)
{ {
HeapFree(GetProcessHeap(), 0, binValueData); HeapFree(GetProcessHeap(), 0, binValueData);
#ifndef UNICODE #ifndef UNICODE
if(len_vname > 0) if(len_vname > 0)
HeapFree(GetProcessHeap(), 0, u_valuename); HeapFree(GetProcessHeap(), 0, u_valuename);
#endif #endif
error(hwnd, IDS_BAD_VALUE, valueName); error(hwnd, IDS_BAD_VALUE, valueName);
goto done; goto done;
} }
@ -676,21 +673,21 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
{ {
/* force to use the unicode version, so editing strings in binary mode is correct */ /* force to use the unicode version, so editing strings in binary mode is correct */
lRet = RegSetValueExW(hKey, lRet = RegSetValueExW(hKey,
#ifndef UNICODE #ifndef UNICODE
u_valuename, u_valuename,
#else #else
valueName, valueName,
#endif #endif
0, type, (LPBYTE)binValueData, valueDataLen); 0, type, (LPBYTE)binValueData, valueDataLen);
if (lRet == ERROR_SUCCESS) if (lRet == ERROR_SUCCESS)
result = TRUE; result = TRUE;
} }
if(binValueData != NULL) if(binValueData != NULL)
HeapFree(GetProcessHeap(), 0, binValueData); HeapFree(GetProcessHeap(), 0, binValueData);
#ifndef UNICODE #ifndef UNICODE
if(len_vname > 0) if(len_vname > 0)
HeapFree(GetProcessHeap(), 0, u_valuename); HeapFree(GetProcessHeap(), 0, u_valuename);
#endif #endif
} }
else else
{ {

View file

@ -30,7 +30,7 @@ typedef struct
INT nLines; INT nLines;
INT nVisibleLinesComplete; INT nVisibleLinesComplete;
INT nVisibleLines; INT nVisibleLines;
INT Position; INT Index;
INT LineHeight; INT LineHeight;
INT CharWidth; INT CharWidth;
HFONT hFont; HFONT hFont;
@ -43,6 +43,7 @@ typedef struct
BOOL EditingField; BOOL EditingField;
INT CaretCol; INT CaretCol;
INT CaretLine; INT CaretLine;
BOOL InMid;
} HEXEDIT_DATA, *PHEXEDIT_DATA; } HEXEDIT_DATA, *PHEXEDIT_DATA;
/* hit test codes */ /* hit test codes */
@ -112,7 +113,7 @@ HEXEDIT_MoveCaret(PHEXEDIT_DATA hed, BOOL Scroll)
} }
if(hed->EditingField) if(hed->EditingField)
SetCaretPos(hed->LeftMargin + ((4 + hed->AddressSpacing + (3 * hed->CaretCol)) * hed->CharWidth) - 1, (hed->CaretLine - si.nPos) * hed->LineHeight); SetCaretPos(hed->LeftMargin + ((4 + hed->AddressSpacing + (3 * hed->CaretCol) + hed->InMid * 2) * hed->CharWidth) - 1, (hed->CaretLine - si.nPos) * hed->LineHeight);
else else
SetCaretPos(hed->LeftMargin + ((4 + hed->AddressSpacing + hed->SplitSpacing + (3 * hed->ColumnsPerLine) + hed->CaretCol) * hed->CharWidth) - 2, (hed->CaretLine - si.nPos) * hed->LineHeight); SetCaretPos(hed->LeftMargin + ((4 + hed->AddressSpacing + hed->SplitSpacing + (3 * hed->ColumnsPerLine) + hed->CaretCol) * hed->CharWidth) - 2, (hed->CaretLine - si.nPos) * hed->LineHeight);
} }
@ -314,10 +315,10 @@ HEXEDIT_HitRegionTest(PHEXEDIT_DATA hed, POINTS pt)
} }
static DWORD static DWORD
HEXEDIT_PositionFromPoint(PHEXEDIT_DATA hed, POINTS pt, DWORD Hit, POINT *EditPos, BOOL *EditField) HEXEDIT_IndexFromPoint(PHEXEDIT_DATA hed, POINTS pt, DWORD Hit, POINT *EditPos, BOOL *EditField)
{ {
SCROLLINFO si; SCROLLINFO si;
DWORD Pos, bufsize; DWORD Index, bufsize;
si.cbSize = sizeof(SCROLLINFO); si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_POS; si.fMask = SIF_POS;
@ -353,18 +354,18 @@ HEXEDIT_PositionFromPoint(PHEXEDIT_DATA hed, POINTS pt, DWORD Hit, POINT *EditPo
if(pt.x > 0) if(pt.x > 0)
{ {
INT BlockWidth = (*EditField ? hed->CharWidth * 3 : hed->CharWidth); INT BlockWidth = (*EditField ? hed->CharWidth * 3 : hed->CharWidth);
EditPos->x = min(hed->ColumnsPerLine, pt.x / BlockWidth); EditPos->x = min(hed->ColumnsPerLine, (pt.x + BlockWidth / 2) / BlockWidth);
} }
bufsize = (hed->hBuffer ? (DWORD) LocalSize(hed->hBuffer) : 0); bufsize = (hed->hBuffer ? (DWORD) LocalSize(hed->hBuffer) : 0);
Pos = (EditPos->y * hed->ColumnsPerLine) + EditPos->x; Index = (EditPos->y * hed->ColumnsPerLine) + EditPos->x;
if(Pos > bufsize) if(Index > bufsize)
{ {
INT tmp = bufsize % hed->ColumnsPerLine; INT tmp = bufsize % hed->ColumnsPerLine;
Pos = bufsize; Index = bufsize;
EditPos->x = (tmp == 0 ? hed->ColumnsPerLine : tmp); EditPos->x = (tmp == 0 ? hed->ColumnsPerLine : tmp);
} }
return Pos; return Index;
} }
/*** Control specific messages ************************************************/ /*** Control specific messages ************************************************/
@ -393,7 +394,7 @@ HEXEDIT_HEM_LOADBUFFER(PHEXEDIT_DATA hed, PVOID Buffer, DWORD Size)
else else
{ {
hed->hBuffer = LocalFree(hed->hBuffer); hed->hBuffer = LocalFree(hed->hBuffer);
hed->Position = 0; hed->Index = 0;
HEXEDIT_Update(hed); HEXEDIT_Update(hed);
return 0; return 0;
@ -416,13 +417,13 @@ HEXEDIT_HEM_LOADBUFFER(PHEXEDIT_DATA hed, PVOID Buffer, DWORD Size)
LocalUnlock(hed->hBuffer); LocalUnlock(hed->hBuffer);
} }
hed->Position = 0; hed->Index = 0;
HEXEDIT_Update(hed); HEXEDIT_Update(hed);
return Size; return Size;
} }
else if(hed->hBuffer) else if(hed->hBuffer)
{ {
hed->Position = 0; hed->Index = 0;
hed->hBuffer = LocalFree(hed->hBuffer); hed->hBuffer = LocalFree(hed->hBuffer);
HEXEDIT_Update(hed); HEXEDIT_Update(hed);
} }
@ -466,12 +467,16 @@ static LRESULT
HEXEDIT_HEM_SETMAXBUFFERSIZE(PHEXEDIT_DATA hed, DWORD nMaxSize) HEXEDIT_HEM_SETMAXBUFFERSIZE(PHEXEDIT_DATA hed, DWORD nMaxSize)
{ {
hed->MaxBuffer = nMaxSize; hed->MaxBuffer = nMaxSize;
if(hed->MaxBuffer > 0 && hed->hBuffer && LocalSize(hed->hBuffer) > hed->MaxBuffer) if (hed->MaxBuffer == 0)
{ {
/* truncate the buffer */ hed->hBuffer = LocalFree(hed->hBuffer);
hed->hBuffer = LocalReAlloc(hed->hBuffer, hed->MaxBuffer, LMEM_MOVEABLE); return 0;
HEXEDIT_Update(hed);
} }
if (hed->hBuffer)
hed->hBuffer = LocalReAlloc(hed->hBuffer, hed->MaxBuffer, LMEM_MOVEABLE);
else
hed->hBuffer = LocalAlloc(LMEM_MOVEABLE, hed->MaxBuffer);
HEXEDIT_Update(hed);
return 0; return 0;
} }
@ -496,6 +501,7 @@ HEXEDIT_WM_NCCREATE(HWND hWnd, CREATESTRUCT *cs)
hed->AddressSpacing = 2; hed->AddressSpacing = 2;
hed->SplitSpacing = 2; hed->SplitSpacing = 2;
hed->EditingField = TRUE; /* in hexdump field */ hed->EditingField = TRUE; /* in hexdump field */
hed->InMid = FALSE;
SetWindowLongPtr(hWnd, 0, (DWORD_PTR)hed); SetWindowLongPtr(hWnd, 0, (DWORD_PTR)hed);
HEXEDIT_Update(hed); HEXEDIT_Update(hed);
@ -754,10 +760,11 @@ HEXEDIT_WM_LBUTTONDOWN(PHEXEDIT_DATA hed, INT Buttons, POINTS Pt)
UNREFERENCED_PARAMETER(Buttons); UNREFERENCED_PARAMETER(Buttons);
SetFocus(hed->hWndSelf); SetFocus(hed->hWndSelf);
hed->Position = HEXEDIT_PositionFromPoint(hed, Pt, Hit, &EditPos, &NewField); hed->Index = HEXEDIT_IndexFromPoint(hed, Pt, Hit, &EditPos, &NewField);
hed->EditingField = NewField; hed->EditingField = NewField;
hed->CaretCol = EditPos.x; hed->CaretCol = EditPos.x;
hed->CaretLine = EditPos.y; hed->CaretLine = EditPos.y;
hed->InMid = FALSE;
HEXEDIT_MoveCaret(hed, TRUE); HEXEDIT_MoveCaret(hed, TRUE);
@ -768,6 +775,7 @@ static BOOL
HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode) HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode)
{ {
size_t bufsize; size_t bufsize;
PBYTE buf;
if(GetKeyState(VK_MENU) & 0x8000) if(GetKeyState(VK_MENU) & 0x8000)
{ {
return FALSE; return FALSE;
@ -777,72 +785,113 @@ HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode)
switch(VkCode) switch(VkCode)
{ {
case VK_LEFT: case VK_DELETE:
if(hed->Position > 0) if (hed->InMid && hed->EditingField)
{ {
if(--hed->CaretCol < 0) buf = (PBYTE) LocalLock(hed->hBuffer);
{ if (buf)
hed->CaretLine--; {
hed->CaretCol = hed->ColumnsPerLine; MoveMemory(buf + hed->Index, buf + hed->Index + 1,
} bufsize - hed->Index - 1);
else LocalUnlock(hed->hBuffer);
hed->Position--; }
HexEdit_SetMaxBufferSize(hed->hWndSelf, bufsize - 1);
hed->InMid = FALSE;
} }
else if (hed->Index < bufsize)
{
buf = (PBYTE) LocalLock(hed->hBuffer);
if (buf)
{
MoveMemory(buf + hed->Index, buf + hed->Index + 1,
bufsize - hed->Index - 1);
LocalUnlock(hed->hBuffer);
}
HexEdit_SetMaxBufferSize(hed->hWndSelf, bufsize - 1);
}
InvalidateRect(hed->hWndSelf, NULL, TRUE);
HEXEDIT_MoveCaret(hed, TRUE); HEXEDIT_MoveCaret(hed, TRUE);
break; break;
case VK_BACK:
if (hed->InMid && hed->EditingField)
{
buf = (PBYTE) LocalLock(hed->hBuffer);
if (buf)
{
MoveMemory(buf + hed->Index, buf + hed->Index + 1,
bufsize - hed->Index - 1);
LocalUnlock(hed->hBuffer);
}
HexEdit_SetMaxBufferSize(hed->hWndSelf, bufsize - 1);
hed->InMid = FALSE;
}
else if (hed->Index > 0)
{
buf = (PBYTE) LocalLock(hed->hBuffer);
if (buf)
{
MoveMemory(buf + hed->Index - 1, buf + hed->Index,
bufsize - hed->Index);
LocalUnlock(hed->hBuffer);
}
HexEdit_SetMaxBufferSize(hed->hWndSelf, bufsize - 1);
hed->Index--;
hed->CaretCol = hed->Index % hed->ColumnsPerLine;
hed->CaretLine = hed->Index / hed->ColumnsPerLine;
hed->InMid = FALSE;
}
InvalidateRect(hed->hWndSelf, NULL, TRUE);
HEXEDIT_MoveCaret(hed, TRUE);
break;
case VK_LEFT:
if (hed->Index > 0)
{
hed->Index--;
hed->CaretCol = hed->Index % hed->ColumnsPerLine;
hed->CaretLine = hed->Index / hed->ColumnsPerLine;
hed->InMid = FALSE;
HEXEDIT_MoveCaret(hed, TRUE);
}
break;
case VK_RIGHT: case VK_RIGHT:
if(hed->Position < (INT)bufsize) if (hed->Index < (INT)bufsize)
{ {
if(++hed->CaretCol > hed->ColumnsPerLine) hed->Index++;
{ hed->CaretCol = hed->Index % hed->ColumnsPerLine;
hed->CaretCol = 0; hed->CaretLine = hed->Index / hed->ColumnsPerLine;
hed->CaretLine++; hed->InMid = FALSE;
} HEXEDIT_MoveCaret(hed, TRUE);
else
hed->Position++;
} }
HEXEDIT_MoveCaret(hed, TRUE);
break; break;
case VK_UP: case VK_UP:
if(hed->Position > 0) if (hed->Index >= hed->ColumnsPerLine)
{ {
if(hed->CaretLine <= 0) hed->Index -= hed->ColumnsPerLine;
{ hed->CaretCol = hed->Index % hed->ColumnsPerLine;
hed->CaretCol = 0; hed->CaretLine = hed->Index / hed->ColumnsPerLine;
hed->Position = 0; hed->InMid = FALSE;
} HEXEDIT_MoveCaret(hed, TRUE);
else
{
hed->CaretLine--;
hed->Position -= hed->ColumnsPerLine;
}
} }
HEXEDIT_MoveCaret(hed, TRUE);
break; break;
case VK_DOWN: case VK_DOWN:
if(hed->Position <= (INT)bufsize) if (hed->Index + hed->ColumnsPerLine <= (INT) bufsize)
{ {
if(hed->CaretLine < hed->nLines - 1) hed->Index += hed->ColumnsPerLine;
{ hed->CaretCol = hed->Index % hed->ColumnsPerLine;
hed->Position += hed->ColumnsPerLine; hed->CaretLine = hed->Index / hed->ColumnsPerLine;
hed->CaretLine++;
if(hed->Position > (INT)bufsize)
{
hed->Position = (INT) bufsize;
hed->CaretLine = (hed->nLines > 0 ? hed->nLines - 1 : 0);
hed->CaretCol = (INT) bufsize % hed->ColumnsPerLine;
}
}
else
{
INT tmp = (INT) bufsize % hed->ColumnsPerLine;
hed->Position = (INT) bufsize;
hed->CaretCol = (tmp == 0 ? hed->ColumnsPerLine : tmp);
}
} }
else
{
hed->Index = bufsize;
hed->CaretCol = hed->Index % hed->ColumnsPerLine;
hed->CaretLine = hed->Index / hed->ColumnsPerLine;
}
hed->InMid = FALSE;
HEXEDIT_MoveCaret(hed, TRUE); HEXEDIT_MoveCaret(hed, TRUE);
break; break;
} }
@ -850,6 +899,87 @@ HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode)
return FALSE; return FALSE;
} }
static BOOL
HEXEDIT_WM_CHAR(PHEXEDIT_DATA hed, WCHAR ch)
{
size_t bufsize;
PBYTE buf;
bufsize = (hed->hBuffer ? LocalSize(hed->hBuffer) : 0);
if (!hed->EditingField)
{
if (0x20 <= ch && ch < 0x7F)
{
HexEdit_SetMaxBufferSize(hed->hWndSelf, bufsize + 1);
buf = (PBYTE) LocalLock(hed->hBuffer);
if (buf)
{
MoveMemory(buf + hed->Index + 1, buf + hed->Index,
bufsize - hed->Index);
buf[hed->Index] = ch;
LocalUnlock(hed->hBuffer);
}
hed->Index++;
hed->CaretCol = hed->Index % hed->ColumnsPerLine;
hed->CaretLine = hed->Index / hed->ColumnsPerLine;
InvalidateRect(hed->hWndSelf, NULL, TRUE);
HEXEDIT_MoveCaret(hed, TRUE);
return FALSE;
}
}
else
{
if (('0' <= ch && ch <= '9') || ('A' <= ch && ch <= 'F') ||
('a' <= ch && ch <= 'f'))
{
if (hed->InMid)
{
buf = (PBYTE) LocalLock(hed->hBuffer);
if (buf)
{
if ('0' <= ch && ch <= '9')
buf[hed->Index] |= ch - '0';
else if ('A' <= ch && ch <= 'F')
buf[hed->Index] |= ch + 10 - 'A';
else if ('a' <= ch && ch <= 'f')
buf[hed->Index] |= ch + 10 - 'a';
LocalUnlock(hed->hBuffer);
}
hed->InMid = FALSE;
hed->Index++;
hed->CaretCol = hed->Index % hed->ColumnsPerLine;
hed->CaretLine = hed->Index / hed->ColumnsPerLine;
InvalidateRect(hed->hWndSelf, NULL, TRUE);
HEXEDIT_MoveCaret(hed, TRUE);
}
else
{
HexEdit_SetMaxBufferSize(hed->hWndSelf, bufsize + 1);
buf = (PBYTE) LocalLock(hed->hBuffer);
if (buf)
{
MoveMemory(buf + hed->Index + 1, buf + hed->Index,
bufsize - hed->Index);
if ('0' <= ch && ch <= '9')
buf[hed->Index] = (ch - '0') << 4;
else if ('A' <= ch && ch <= 'F')
buf[hed->Index] = (ch + 10 - 'A') << 4;
else if ('a' <= ch && ch <= 'f')
buf[hed->Index] = (ch + 10 - 'a') << 4;
LocalUnlock(hed->hBuffer);
}
hed->InMid = TRUE;
hed->CaretCol = hed->Index % hed->ColumnsPerLine;
hed->CaretLine = hed->Index / hed->ColumnsPerLine;
InvalidateRect(hed->hWndSelf, NULL, TRUE);
HEXEDIT_MoveCaret(hed, TRUE);
}
return FALSE;
}
}
return TRUE;
}
static LRESULT static LRESULT
HEXEDIT_WM_SIZE(PHEXEDIT_DATA hed, DWORD sType, WORD NewWidth, WORD NewHeight) HEXEDIT_WM_SIZE(PHEXEDIT_DATA hed, DWORD sType, WORD NewWidth, WORD NewHeight)
{ {
@ -878,6 +1008,9 @@ HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_KEYDOWN: case WM_KEYDOWN:
return HEXEDIT_WM_KEYDOWN(hed, (INT)wParam); return HEXEDIT_WM_KEYDOWN(hed, (INT)wParam);
case WM_CHAR:
return HEXEDIT_WM_CHAR(hed, (WCHAR)wParam);
case WM_VSCROLL: case WM_VSCROLL:
return HEXEDIT_WM_VSCROLL(hed, HIWORD(wParam), LOWORD(wParam)); return HEXEDIT_WM_VSCROLL(hed, HIWORD(wParam), LOWORD(wParam));

View file

@ -543,7 +543,8 @@ BOOL RefreshListView(HWND hwndLV, HKEY hKey, LPCTSTR keyPath)
errCode = RegQueryInfoKey(hNewKey, NULL, NULL, NULL, NULL, &max_sub_key_len, NULL, errCode = RegQueryInfoKey(hNewKey, NULL, NULL, NULL, NULL, &max_sub_key_len, NULL,
&val_count, &max_val_name_len, &max_val_size, NULL, NULL); &val_count, &max_val_name_len, &max_val_size, NULL, NULL);
if (errCode == ERROR_SUCCESS) { if (errCode == ERROR_SUCCESS)
{
TCHAR* ValName = HeapAlloc(GetProcessHeap(), 0, ++max_val_name_len * sizeof(TCHAR)); TCHAR* ValName = HeapAlloc(GetProcessHeap(), 0, ++max_val_name_len * sizeof(TCHAR));
DWORD dwValNameLen = max_val_name_len; DWORD dwValNameLen = max_val_name_len;
BYTE* ValBuf = HeapAlloc(GetProcessHeap(), 0, max_val_size + sizeof(TCHAR)); BYTE* ValBuf = HeapAlloc(GetProcessHeap(), 0, max_val_size + sizeof(TCHAR));
@ -557,9 +558,15 @@ BOOL RefreshListView(HWND hwndLV, HKEY hKey, LPCTSTR keyPath)
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 */ /* Remove unwanted path from key name */
TCHAR *pLastBl = _tcsrchr(ValName, TEXT('\\')); TCHAR *pLastBl = _tcsrchr(ValName, TEXT('\\'));
if (pLastBl != NULL) ++pLastBl; else pLastBl = ValName; 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; ValBuf[dwValSize] = 0;
#ifdef UNICODE
ValBuf[dwValSize + 1] = 0;
#endif
AddEntryToList(hwndLV, pLastBl, 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;