mirror of
https://github.com/reactos/reactos.git
synced 2025-06-24 10:10:16 +00:00
some more work on the hex edit control (added messages for loading/changing the buffer)
svn path=/trunk/; revision=9760
This commit is contained in:
parent
c75be21c00
commit
e17ebf0811
3 changed files with 203 additions and 71 deletions
|
@ -33,6 +33,7 @@
|
|||
#include "main.h"
|
||||
#include "regproc.h"
|
||||
#include "resource.h"
|
||||
#include "hexedit.h"
|
||||
|
||||
|
||||
typedef enum _EDIT_MODE
|
||||
|
@ -44,7 +45,9 @@ typedef enum _EDIT_MODE
|
|||
|
||||
static const TCHAR* editValueName;
|
||||
static TCHAR* stringValueData;
|
||||
static PVOID binValueData;
|
||||
static DWORD dwordValueData;
|
||||
static DWORD valueDataLen;
|
||||
static EDIT_MODE dwordEditMode = EDIT_MODE_HEX;
|
||||
|
||||
|
||||
|
@ -260,68 +263,6 @@ LRESULT CALLBACK DwordEditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPAR
|
|||
return CallWindowProc(oldwndproc, hwnd, uMsg, wParam, lParam);
|
||||
}
|
||||
|
||||
INT_PTR CALLBACK modify_binary_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
TCHAR* valueData;
|
||||
HWND hwndValue;
|
||||
int len;
|
||||
|
||||
switch(uMsg) {
|
||||
case WM_INITDIALOG:
|
||||
if(editValueName && _tcscmp(editValueName, _T("")))
|
||||
{
|
||||
SetDlgItemText(hwndDlg, IDC_VALUE_NAME, editValueName);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetDlgItemText(hwndDlg, IDC_VALUE_NAME, _T("(Default)"));
|
||||
}
|
||||
SetDlgItemText(hwndDlg, IDC_VALUE_DATA, stringValueData);
|
||||
SetFocus(GetDlgItem(hwndDlg, IDC_VALUE_DATA));
|
||||
return FALSE;
|
||||
case WM_COMMAND:
|
||||
switch (LOWORD(wParam))
|
||||
{
|
||||
case IDOK:
|
||||
if ((hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA)))
|
||||
{
|
||||
if ((len = GetWindowTextLength(hwndValue)))
|
||||
{
|
||||
if (stringValueData)
|
||||
{
|
||||
if ((valueData = HeapReAlloc(GetProcessHeap(), 0, stringValueData, (len + 1) * sizeof(TCHAR))))
|
||||
{
|
||||
stringValueData = valueData;
|
||||
if (!GetWindowText(hwndValue, stringValueData, len + 1))
|
||||
*stringValueData = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((valueData = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(TCHAR))))
|
||||
{
|
||||
stringValueData = valueData;
|
||||
if (!GetWindowText(hwndValue, stringValueData, len + 1))
|
||||
*stringValueData = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (stringValueData)
|
||||
*stringValueData = 0;
|
||||
}
|
||||
}
|
||||
EndDialog(hwndDlg, IDOK);
|
||||
break;
|
||||
case IDCANCEL:
|
||||
EndDialog(hwndDlg, IDCANCEL);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
|
@ -448,9 +389,56 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
INT_PTR CALLBACK modify_binary_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
PVOID valueData;
|
||||
HWND hwndValue;
|
||||
int len;
|
||||
|
||||
switch(uMsg) {
|
||||
case WM_INITDIALOG:
|
||||
if(editValueName && _tcscmp(editValueName, _T("")))
|
||||
{
|
||||
SetDlgItemText(hwndDlg, IDC_VALUE_NAME, editValueName);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetDlgItemText(hwndDlg, IDC_VALUE_NAME, _T("(Default)"));
|
||||
}
|
||||
HexEdit_LoadBuffer(GetDlgItem(hwndDlg, IDC_VALUE_DATA), binValueData, valueDataLen);
|
||||
SetFocus(GetDlgItem(hwndDlg, IDC_VALUE_DATA));
|
||||
return FALSE;
|
||||
case WM_COMMAND:
|
||||
switch (LOWORD(wParam))
|
||||
{
|
||||
case IDOK:
|
||||
if ((hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA)))
|
||||
{
|
||||
len = HexEdit_GetBufferSize(hwndValue);
|
||||
if (len != valueDataLen && len > 0)
|
||||
{
|
||||
binValueData = HeapReAlloc(GetProcessHeap(), 0, binValueData, len);
|
||||
}
|
||||
if (len > 0)
|
||||
{
|
||||
HexEdit_CopyBuffer(hwndValue, binValueData, len);
|
||||
}
|
||||
valueDataLen = len;
|
||||
}
|
||||
EndDialog(hwndDlg, IDOK);
|
||||
break;
|
||||
case IDCANCEL:
|
||||
EndDialog(hwndDlg, IDCANCEL);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName)
|
||||
{
|
||||
DWORD valueDataLen;
|
||||
DWORD type;
|
||||
LONG lRet;
|
||||
BOOL result = FALSE;
|
||||
|
@ -467,6 +455,7 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName)
|
|||
type = REG_SZ;
|
||||
valueDataLen = 0;
|
||||
stringValueData = NULL;
|
||||
binValueData = NULL;
|
||||
}
|
||||
|
||||
if (lRet != ERROR_SUCCESS)
|
||||
|
@ -633,19 +622,28 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName)
|
|||
}
|
||||
else if (type == REG_NONE || type == REG_BINARY)
|
||||
{
|
||||
lRet = RegQueryValueEx(hKey, valueName, 0, 0, (LPBYTE)&dwordValueData, &valueDataLen);
|
||||
if(!(binValueData = HeapAlloc(GetProcessHeap(), 0, valueDataLen)))
|
||||
{
|
||||
error(hwnd, IDS_TOO_BIG_VALUE, valueDataLen);
|
||||
goto done;
|
||||
}
|
||||
|
||||
lRet = RegQueryValueEx(hKey, valueName, 0, 0, (LPBYTE)binValueData, &valueDataLen);
|
||||
if (lRet != ERROR_SUCCESS)
|
||||
{
|
||||
error(hwnd, IDS_BAD_VALUE, valueName);
|
||||
HeapFree(GetProcessHeap(), 0, binValueData);
|
||||
error(hwnd, IDS_BAD_VALUE, valueName);
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_BIN_DATA), hwnd, modify_binary_dlgproc) == IDOK)
|
||||
{
|
||||
lRet = RegSetValueEx(hKey, valueName, 0, type, (LPBYTE)&dwordValueData, sizeof(DWORD));
|
||||
lRet = RegSetValueEx(hKey, valueName, 0, type, (LPBYTE)binValueData, valueDataLen);
|
||||
if (lRet == ERROR_SUCCESS)
|
||||
result = TRUE;
|
||||
}
|
||||
if(binValueData != NULL)
|
||||
HeapFree(GetProcessHeap(), 0, binValueData);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -29,8 +29,9 @@ typedef struct
|
|||
{
|
||||
HWND hWndSelf;
|
||||
HWND hWndParent;
|
||||
HLOCAL hData;
|
||||
HLOCAL hBuffer;
|
||||
DWORD style;
|
||||
DWORD MaxBuffer;
|
||||
INT LineHeight;
|
||||
INT CharWidth;
|
||||
HFONT hFont;
|
||||
|
@ -77,6 +78,106 @@ HEXEDIT_MoveCaret(PHEXEDIT_DATA hed, INT Col, INT Line)
|
|||
SetCaretPos(hed->LeftMargin + (Col * hed->CharWidth), hed->TopMargin + (Line * hed->LineHeight));
|
||||
}
|
||||
|
||||
/*** Control specific messages ************************************************/
|
||||
|
||||
static LRESULT
|
||||
HEXEDIT_HEM_LOADBUFFER(PHEXEDIT_DATA hed, PVOID Buffer, DWORD Size)
|
||||
{
|
||||
if(Buffer != NULL && Size > 0)
|
||||
{
|
||||
LPVOID buf;
|
||||
|
||||
if(hed->MaxBuffer > 0 && Size > hed->MaxBuffer)
|
||||
{
|
||||
Size = hed->MaxBuffer;
|
||||
}
|
||||
|
||||
if(hed->hBuffer)
|
||||
{
|
||||
if(Size > 0)
|
||||
{
|
||||
if(LocalSize(hed->hBuffer) != Size)
|
||||
{
|
||||
hed->hBuffer = LocalReAlloc(hed->hBuffer, Size, LMEM_MOVEABLE | LMEM_ZEROINIT);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
hed->hBuffer = LocalFree(hed->hBuffer);
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else if(Size > 0)
|
||||
{
|
||||
hed->hBuffer = LocalAlloc(LHND, Size);
|
||||
}
|
||||
|
||||
if(Size > 0)
|
||||
{
|
||||
buf = LocalLock(hed->hBuffer);
|
||||
if(buf)
|
||||
{
|
||||
memcpy(buf, Buffer, Size);
|
||||
}
|
||||
else
|
||||
Size = 0;
|
||||
LocalUnlock(hed->hBuffer);
|
||||
}
|
||||
|
||||
return Size;
|
||||
}
|
||||
else if(hed->hBuffer)
|
||||
{
|
||||
hed->hBuffer = LocalFree(hed->hBuffer);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static LRESULT
|
||||
HEXEDIT_HEM_COPYBUFFER(PHEXEDIT_DATA hed, PVOID Buffer, DWORD Size)
|
||||
{
|
||||
DWORD nCpy;
|
||||
|
||||
if(!hed->hBuffer)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(Buffer != NULL && Size > 0)
|
||||
{
|
||||
nCpy = min(Size, LocalSize(hed->hBuffer));
|
||||
if(nCpy > 0)
|
||||
{
|
||||
PVOID buf;
|
||||
|
||||
buf = LocalLock(hed->hBuffer);
|
||||
if(buf)
|
||||
{
|
||||
memcpy(Buffer, buf, nCpy);
|
||||
}
|
||||
else
|
||||
nCpy = 0;
|
||||
LocalUnlock(hed->hBuffer);
|
||||
}
|
||||
return nCpy;
|
||||
}
|
||||
|
||||
return (LRESULT)LocalSize(hed->hBuffer);
|
||||
}
|
||||
|
||||
static LRESULT
|
||||
HEXEDIT_HEM_SETMAXBUFFERSIZE(PHEXEDIT_DATA hed, DWORD nMaxSize)
|
||||
{
|
||||
hed->MaxBuffer = nMaxSize;
|
||||
if(hed->MaxBuffer > 0 && hed->hBuffer && LocalSize(hed->hBuffer) > hed->MaxBuffer)
|
||||
{
|
||||
/* truncate the buffer */
|
||||
hed->hBuffer = LocalReAlloc(hed->hBuffer, hed->MaxBuffer, LMEM_MOVEABLE);
|
||||
}
|
||||
}
|
||||
|
||||
/*** Message Proc *************************************************************/
|
||||
|
||||
static LRESULT
|
||||
|
@ -101,10 +202,10 @@ HEXEDIT_WM_NCCREATE(HWND hWnd, CREATESTRUCT *cs)
|
|||
static LRESULT
|
||||
HEXEDIT_WM_NCDESTROY(PHEXEDIT_DATA hed)
|
||||
{
|
||||
if(hed->hData)
|
||||
if(hed->hBuffer)
|
||||
{
|
||||
while(LocalUnlock(hed->hData));
|
||||
LocalFree(hed->hData);
|
||||
while(LocalUnlock(hed->hBuffer));
|
||||
LocalFree(hed->hBuffer);
|
||||
}
|
||||
|
||||
SetWindowLong(hed->hWndSelf, 0, 0);
|
||||
|
@ -176,6 +277,15 @@ HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||
hed = (PHEXEDIT_DATA)GetWindowLong(hWnd, 0);
|
||||
switch(uMsg)
|
||||
{
|
||||
case HEM_LOADBUFFER:
|
||||
return HEXEDIT_HEM_LOADBUFFER(hed, (PVOID)wParam, (DWORD)lParam);
|
||||
|
||||
case HEM_COPYBUFFER:
|
||||
return HEXEDIT_HEM_COPYBUFFER(hed, (PVOID)wParam, (DWORD)lParam);
|
||||
|
||||
case HEM_SETMAXBUFFERSIZE:
|
||||
return HEXEDIT_HEM_SETMAXBUFFERSIZE(hed, (DWORD)lParam);
|
||||
|
||||
case WM_SETFOCUS:
|
||||
return HEXEDIT_WM_SETFOCUS(hed);
|
||||
|
||||
|
|
|
@ -11,6 +11,30 @@ UnregisterHexEditorClass(HINSTANCE hInstance);
|
|||
/* styles */
|
||||
#define HES_READONLY (0x800)
|
||||
#define HES_LOWERCASE (0x10)
|
||||
#define HES_UPPERCASE (0x8)
|
||||
#define HES_UPPERCASE (0x8)
|
||||
#define HES_AUTOVSCROLL (0x40)
|
||||
#define HES_HIDEADDRESS (0x4)
|
||||
|
||||
/* messages */
|
||||
#define HEM_BASE (WM_USER + 50)
|
||||
#define HEM_LOADBUFFER (HEM_BASE + 1)
|
||||
#define HEM_COPYBUFFER (HEM_BASE + 2)
|
||||
#define HEM_SETMAXBUFFERSIZE (HEM_BASE + 3)
|
||||
|
||||
/* macros */
|
||||
#define HexEdit_LoadBuffer(hWnd, Buffer, Size) \
|
||||
SendMessage((hWnd), HEM_LOADBUFFER, (WPARAM)(Buffer), (LPARAM)(Size))
|
||||
|
||||
#define HexEdit_ClearBuffer(hWnd) \
|
||||
SendMessage((hWnd), HEM_LOADBUFFER, 0, 0)
|
||||
|
||||
#define HexEdit_CopyBuffer(hWnd, Buffer, nMax) \
|
||||
SendMessage((hWnd), HEM_COPYBUFFER, (WPARAM)(Buffer), (LPARAM)(nMax))
|
||||
|
||||
#define HexEdit_GetBufferSize(hWnd) \
|
||||
SendMessage((hWnd), HEM_COPYBUFFER, 0, 0)
|
||||
|
||||
#define HexEdit_SetMaxBufferSize(hWnd, Size) \
|
||||
SendMessage((hWnd), HEM_SETMAXBUFFERSIZE, 0, (LPARAM)(Size))
|
||||
|
||||
#endif /* __HEXEDIT_H */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue