Files
2024-12-29 19:01:43 +01:00

160 lines
4.8 KiB
C++

/*****************************************************************************/
/* DlgDataEditor.cpp Copyright (c) Ladislav Zezula 2014 */
/*---------------------------------------------------------------------------*/
/* Description: Common module for a few simple dialogs */
/*---------------------------------------------------------------------------*/
/* Date Ver Who Comment */
/* -------- ---- --- ------- */
/* 19.03.14 1.00 Lad Created */
/*****************************************************************************/
#include "FileTest.h"
#include "resource.h"
//-----------------------------------------------------------------------------
// Local structures
struct TDialogData
{
TAnchors * pAnchors;
ULONGLONG BaseAddress;
LPBYTE pbFileData;
size_t cbFileData;
HWND hDlg;
};
//-----------------------------------------------------------------------------
// Message handlers
static void OnInitDialog(HWND hDlg, LPARAM lParam)
{
TDialogData * pData = (TDialogData *)lParam;
TAnchors * pAnchors;
HWND hWndChild;
// Initialize dialog data
SetDialogIcon(hDlg, IDI_FILE_TEST);
SetDialogData(hDlg, pData);
pData->hDlg = hDlg;
// Center the dialog to parent
CenterWindowToParent(hDlg);
// Configure the anchors
pData->pAnchors = pAnchors = new TAnchors(hDlg);
if(pAnchors != NULL)
{
pAnchors->AddAnchor(hDlg, IDC_FILE_DATA, akAll);
pAnchors->AddAnchor(hDlg, IDC_INFORMATION, akLeft | akRight | akBottom);
pAnchors->AddAnchor(hDlg, IDOK, akRight | akBottom);
}
// Configure the data viewer
hWndChild = GetDlgItem(hDlg, IDC_FILE_DATA);
if(hWndChild != NULL)
{
DataEditor_SetDataFormat(hWndChild, PtrPlatformSpecific, 0x10);
DataEditor_SetData(hWndChild, (ULONGLONG)pData->BaseAddress, pData->pbFileData, pData->cbFileData);
}
}
static void OnNotify(HWND hDlg, NMHDR * pNMHDR)
{
if(pNMHDR->code == DEN_EXCEPTION)
{
PDTE_EXCEPTION_DATA pExceptionData = (PDTE_EXCEPTION_DATA)pNMHDR;
HWND hWndChild = GetDlgItem(hDlg, IDC_INFORMATION);
if(hWndChild != NULL)
{
SetWindowTextRc(hWndChild, IDS_DATA_EXCEPTION,
pExceptionData->WriteOperation ? _T("writing") : _T("reading"),
pExceptionData->ExceptionAddress);
}
}
}
static void OnDestroy(HWND hDlg)
{
TDialogData * pData = ((TDialogData *)GetWindowLongPtr(hDlg, DWLP_USER));
if(pData != NULL)
{
if(pData->pAnchors != NULL)
delete pData->pAnchors;
pData->pAnchors = NULL;
}
}
static int OnFlushViewOfFileClick(HWND hDlg)
{
TDialogData* pData = ((TDialogData*)GetWindowLongPtr(hDlg, DWLP_USER));
FlushViewOfFile(pData->pbFileData, pData->cbFileData);
return TRUE;
}
static INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
TDialogData * pData;
UINT nIDCtrl;
UINT nIDNotify;
// Dialog initialization
switch(uMsg)
{
case WM_INITDIALOG:
OnInitDialog(hDlg, lParam);
return TRUE;
case WM_SIZE:
case WM_GETMINMAXINFO:
if((pData = ((TDialogData *)GetWindowLongPtr(hDlg, DWLP_USER))) != NULL)
pData->pAnchors->OnMessage(uMsg, wParam, lParam);
break;
case WM_NOTIFY:
OnNotify(hDlg, (NMHDR *)lParam);
break;
case WM_COMMAND:
nIDNotify = HIWORD(wParam);
nIDCtrl = LOWORD(wParam);
if (nIDNotify == BN_CLICKED)
{
switch (nIDCtrl)
{
case IDC_FLUSH_VIEW:
OnFlushViewOfFileClick(hDlg);
break;
default:
EndDialog(hDlg, nIDCtrl);
}
}
break;
case WM_DESTROY:
OnDestroy(hDlg);
break;
}
return FALSE;
}
//-----------------------------------------------------------------------------
// Dialog functions
INT_PTR DataEditorDialog(HWND hParent, LPVOID BaseAddress, size_t ViewSize)
{
TDialogData Data;
ZeroMemory(&Data, sizeof(TDialogData));
Data.BaseAddress = (ULONGLONG)BaseAddress;
Data.pbFileData = (LPBYTE)BaseAddress;
Data.cbFileData = ViewSize;
return DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_DATA_EDITOR), hParent, DialogProc, (LPARAM)&Data);
}