2006-06-15 04:19:30 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include "ELFHeaderView.h"
|
|
|
|
#include "PtrMacro.h"
|
|
|
|
#include "LayoutStretch.h"
|
|
|
|
#include "win32/Static.h"
|
|
|
|
#include "win32/LayoutWindow.h"
|
2007-02-20 21:16:34 +00:00
|
|
|
#include <boost/lexical_cast.hpp>
|
|
|
|
#include "lexical_cast_ex.h"
|
2006-06-15 04:19:30 +00:00
|
|
|
|
2007-02-20 21:16:34 +00:00
|
|
|
#define CLSNAME _T("CELFHeaderView")
|
2006-06-15 04:19:30 +00:00
|
|
|
|
|
|
|
using namespace Framework;
|
2007-02-20 21:16:34 +00:00
|
|
|
using namespace boost;
|
|
|
|
using namespace std;
|
2006-06-15 04:19:30 +00:00
|
|
|
|
|
|
|
CELFHeaderView::CELFHeaderView(HWND hParent, CELF* pELF)
|
|
|
|
{
|
|
|
|
RECT rc;
|
|
|
|
|
|
|
|
if(!DoesWindowClassExist(CLSNAME))
|
|
|
|
{
|
|
|
|
WNDCLASSEX wc;
|
|
|
|
memset(&wc, 0, sizeof(WNDCLASSEX));
|
|
|
|
wc.cbSize = sizeof(WNDCLASSEX);
|
|
|
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
|
|
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW);
|
|
|
|
wc.hInstance = GetModuleHandle(NULL);
|
|
|
|
wc.lpszClassName = CLSNAME;
|
|
|
|
wc.lpfnWndProc = CWindow::WndProc;
|
|
|
|
RegisterClassEx(&wc);
|
|
|
|
}
|
|
|
|
|
|
|
|
m_pELF = pELF;
|
|
|
|
|
|
|
|
SetRect(&rc, 0, 0, 1, 1);
|
|
|
|
|
2007-02-20 21:16:34 +00:00
|
|
|
Create(NULL, CLSNAME, _T(""), WS_CHILD | WS_DISABLED | WS_CLIPCHILDREN, &rc, hParent, NULL);
|
2006-06-15 04:19:30 +00:00
|
|
|
SetClassPtr();
|
|
|
|
|
2007-02-20 21:16:34 +00:00
|
|
|
m_pType = new Win32::CEdit(m_hWnd, &rc, _T(""), ES_READONLY);
|
|
|
|
m_pMachine = new Win32::CEdit(m_hWnd, &rc, _T(""), ES_READONLY);
|
|
|
|
m_pVersion = new Win32::CEdit(m_hWnd, &rc, _T(""), ES_READONLY);
|
|
|
|
m_pEntry = new Win32::CEdit(m_hWnd, &rc, _T(""), ES_READONLY);
|
|
|
|
m_pPHOffset = new Win32::CEdit(m_hWnd, &rc, _T(""), ES_READONLY);
|
|
|
|
m_pPHSize = new Win32::CEdit(m_hWnd, &rc, _T(""), ES_READONLY);
|
|
|
|
m_pPHCount = new Win32::CEdit(m_hWnd, &rc, _T(""), ES_READONLY);
|
|
|
|
m_pSHOffset = new Win32::CEdit(m_hWnd, &rc, _T(""), ES_READONLY);
|
|
|
|
m_pSHSize = new Win32::CEdit(m_hWnd, &rc, _T(""), ES_READONLY);
|
|
|
|
m_pSHCount = new Win32::CEdit(m_hWnd, &rc, _T(""), ES_READONLY);
|
|
|
|
m_pFlags = new Win32::CEdit(m_hWnd, &rc, _T(""), ES_READONLY);
|
|
|
|
m_pSize = new Win32::CEdit(m_hWnd, &rc, _T(""), ES_READONLY);
|
|
|
|
m_pSHStrTab = new Win32::CEdit(m_hWnd, &rc, _T(""), ES_READONLY);
|
2006-06-15 04:19:30 +00:00
|
|
|
|
|
|
|
m_pLayout = new CGridLayout(2, 14);
|
|
|
|
|
2007-02-20 21:16:34 +00:00
|
|
|
m_pLayout->SetObject(0, 0, CLayoutWindow::CreateTextBoxBehavior(100, 20, new Win32::CStatic(m_hWnd, _T("Type:"))));
|
|
|
|
m_pLayout->SetObject(0, 1, CLayoutWindow::CreateTextBoxBehavior(100, 20, new Win32::CStatic(m_hWnd, _T("Machine:"))));
|
|
|
|
m_pLayout->SetObject(0, 2, CLayoutWindow::CreateTextBoxBehavior(100, 20, new Win32::CStatic(m_hWnd, _T("Version:"))));
|
|
|
|
m_pLayout->SetObject(0, 3, CLayoutWindow::CreateTextBoxBehavior(100, 20, new Win32::CStatic(m_hWnd, _T("Entry Point:"))));
|
|
|
|
m_pLayout->SetObject(0, 4, CLayoutWindow::CreateTextBoxBehavior(100, 20, new Win32::CStatic(m_hWnd, _T("Flags:"))));
|
|
|
|
m_pLayout->SetObject(0, 5, CLayoutWindow::CreateTextBoxBehavior(100, 20, new Win32::CStatic(m_hWnd, _T("Header Size:"))));
|
|
|
|
m_pLayout->SetObject(0, 6, CLayoutWindow::CreateTextBoxBehavior(100, 20, new Win32::CStatic(m_hWnd, _T("Program Header Table Offset:"))));
|
|
|
|
m_pLayout->SetObject(0, 7, CLayoutWindow::CreateTextBoxBehavior(100, 20, new Win32::CStatic(m_hWnd, _T("Program Header Size:"))));
|
|
|
|
m_pLayout->SetObject(0, 8, CLayoutWindow::CreateTextBoxBehavior(100, 20, new Win32::CStatic(m_hWnd, _T("Program Header Count:"))));
|
|
|
|
m_pLayout->SetObject(0, 9, CLayoutWindow::CreateTextBoxBehavior(100, 20, new Win32::CStatic(m_hWnd, _T("Section Header Table Offset:"))));
|
|
|
|
m_pLayout->SetObject(0, 10, CLayoutWindow::CreateTextBoxBehavior(100, 20, new Win32::CStatic(m_hWnd, _T("Section Header Size:"))));
|
|
|
|
m_pLayout->SetObject(0, 11, CLayoutWindow::CreateTextBoxBehavior(100, 20, new Win32::CStatic(m_hWnd, _T("Section Header Count:"))));
|
|
|
|
m_pLayout->SetObject(0, 12, CLayoutWindow::CreateTextBoxBehavior(100, 20, new Win32::CStatic(m_hWnd, _T("Section Header String Table Index:"))));
|
2006-06-15 04:19:30 +00:00
|
|
|
|
|
|
|
m_pLayout->SetObject(1, 0, CLayoutWindow::CreateTextBoxBehavior(100, 20, m_pType));
|
|
|
|
m_pLayout->SetObject(1, 1, CLayoutWindow::CreateTextBoxBehavior(100, 20, m_pMachine));
|
|
|
|
m_pLayout->SetObject(1, 2, CLayoutWindow::CreateTextBoxBehavior(100, 20, m_pVersion));
|
|
|
|
m_pLayout->SetObject(1, 3, CLayoutWindow::CreateTextBoxBehavior(100, 20, m_pEntry));
|
|
|
|
m_pLayout->SetObject(1, 4, CLayoutWindow::CreateTextBoxBehavior(100, 20, m_pFlags));
|
|
|
|
m_pLayout->SetObject(1, 5, CLayoutWindow::CreateTextBoxBehavior(100, 20, m_pSize));
|
|
|
|
m_pLayout->SetObject(1, 6, CLayoutWindow::CreateTextBoxBehavior(100, 20, m_pPHOffset));
|
|
|
|
m_pLayout->SetObject(1, 7, CLayoutWindow::CreateTextBoxBehavior(100, 20, m_pPHSize));
|
|
|
|
m_pLayout->SetObject(1, 8, CLayoutWindow::CreateTextBoxBehavior(100, 20, m_pPHCount));
|
|
|
|
m_pLayout->SetObject(1, 9, CLayoutWindow::CreateTextBoxBehavior(100, 20, m_pSHOffset));
|
|
|
|
m_pLayout->SetObject(1, 10, CLayoutWindow::CreateTextBoxBehavior(100, 20, m_pSHSize));
|
|
|
|
m_pLayout->SetObject(1, 11, CLayoutWindow::CreateTextBoxBehavior(100, 20, m_pSHCount));
|
|
|
|
m_pLayout->SetObject(1, 12, CLayoutWindow::CreateTextBoxBehavior(100, 20, m_pSHStrTab));
|
|
|
|
m_pLayout->SetObject(1, 13, new CLayoutStretch);
|
|
|
|
|
|
|
|
FillInformation();
|
|
|
|
|
|
|
|
RefreshLayout();
|
|
|
|
}
|
|
|
|
|
|
|
|
CELFHeaderView::~CELFHeaderView()
|
|
|
|
{
|
|
|
|
Destroy();
|
|
|
|
DELETEPTR(m_pLayout);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CELFHeaderView::FillInformation()
|
|
|
|
{
|
2007-02-20 21:16:34 +00:00
|
|
|
TCHAR sTemp[256];
|
2006-06-15 04:19:30 +00:00
|
|
|
ELFHEADER* pH;
|
|
|
|
|
|
|
|
pH = &m_pELF->m_Header;
|
|
|
|
|
|
|
|
switch(pH->nType)
|
|
|
|
{
|
|
|
|
case 0x00:
|
2007-02-20 21:16:34 +00:00
|
|
|
_tcscpy(sTemp, _T("ET_NONE"));
|
2006-06-15 04:19:30 +00:00
|
|
|
break;
|
|
|
|
case 0x01:
|
2007-02-20 21:16:34 +00:00
|
|
|
_tcscpy(sTemp, _T("ET_REL"));
|
2006-06-15 04:19:30 +00:00
|
|
|
break;
|
|
|
|
case 0x02:
|
2007-02-20 21:16:34 +00:00
|
|
|
_tcscpy(sTemp, _T("ET_EXEC"));
|
2006-06-15 04:19:30 +00:00
|
|
|
break;
|
|
|
|
case 0x03:
|
2007-02-20 21:16:34 +00:00
|
|
|
_tcscpy(sTemp, _T("ET_DYN"));
|
2006-06-15 04:19:30 +00:00
|
|
|
break;
|
|
|
|
case 0x04:
|
2007-02-20 21:16:34 +00:00
|
|
|
_tcscpy(sTemp, _T("ET_CORE"));
|
2006-06-15 04:19:30 +00:00
|
|
|
break;
|
|
|
|
default:
|
2007-02-20 21:16:34 +00:00
|
|
|
_sntprintf(sTemp, countof(sTemp), _T("Unknown (%i)"), pH->nType);
|
2006-06-15 04:19:30 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
m_pType->SetText(sTemp);
|
|
|
|
|
|
|
|
switch(pH->nCPU)
|
|
|
|
{
|
|
|
|
case 0x00:
|
2007-02-20 21:16:34 +00:00
|
|
|
_tcscpy(sTemp, _T("EM_NONE"));
|
2006-06-15 04:19:30 +00:00
|
|
|
break;
|
|
|
|
case 0x01:
|
2007-02-20 21:16:34 +00:00
|
|
|
_tcscpy(sTemp, _T("EM_M32"));
|
2006-06-15 04:19:30 +00:00
|
|
|
break;
|
|
|
|
case 0x02:
|
2007-02-20 21:16:34 +00:00
|
|
|
_tcscpy(sTemp, _T("EM_SPARC"));
|
2006-06-15 04:19:30 +00:00
|
|
|
break;
|
|
|
|
case 0x03:
|
2007-02-20 21:16:34 +00:00
|
|
|
_tcscpy(sTemp, _T("EM_386"));
|
2006-06-15 04:19:30 +00:00
|
|
|
break;
|
|
|
|
case 0x04:
|
2007-02-20 21:16:34 +00:00
|
|
|
_tcscpy(sTemp, _T("EM_68K"));
|
2006-06-15 04:19:30 +00:00
|
|
|
break;
|
|
|
|
case 0x05:
|
2007-02-20 21:16:34 +00:00
|
|
|
_tcscpy(sTemp, _T("EM_88K"));
|
2006-06-15 04:19:30 +00:00
|
|
|
break;
|
|
|
|
case 0x07:
|
2007-02-20 21:16:34 +00:00
|
|
|
_tcscpy(sTemp, _T("EM_860"));
|
2006-06-15 04:19:30 +00:00
|
|
|
break;
|
|
|
|
case 0x08:
|
2007-02-20 21:16:34 +00:00
|
|
|
_tcscpy(sTemp, _T("EM_MIPS"));
|
2006-06-15 04:19:30 +00:00
|
|
|
break;
|
|
|
|
default:
|
2007-02-20 21:16:34 +00:00
|
|
|
_sntprintf(sTemp, countof(sTemp), _T("Unknown (%i)"), pH->nCPU);
|
2006-06-15 04:19:30 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
m_pMachine->SetText(sTemp);
|
|
|
|
|
|
|
|
switch(pH->nVersion)
|
|
|
|
{
|
|
|
|
case 0x00:
|
2007-02-20 21:16:34 +00:00
|
|
|
_tcscpy(sTemp, _T("EV_NONE"));
|
2006-06-15 04:19:30 +00:00
|
|
|
break;
|
|
|
|
case 0x01:
|
2007-02-20 21:16:34 +00:00
|
|
|
_tcscpy(sTemp, _T("EV_CURRENT"));
|
2006-06-15 04:19:30 +00:00
|
|
|
break;
|
|
|
|
default:
|
2007-02-20 21:16:34 +00:00
|
|
|
_sntprintf(sTemp, countof(sTemp), _T("Unknown (%i)"), pH->nVersion);
|
2006-06-15 04:19:30 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
m_pVersion->SetText(sTemp);
|
|
|
|
|
2007-02-20 21:16:34 +00:00
|
|
|
m_pEntry->SetText((_T("0x") + lexical_cast_hex<tstring>(pH->nEntryPoint, 8)).c_str());
|
|
|
|
m_pPHOffset->SetText((_T("0x") + lexical_cast_hex<tstring>(pH->nProgHeaderStart, 8)).c_str());
|
|
|
|
m_pPHSize->SetText((_T("0x") + lexical_cast_hex<tstring>(pH->nProgHeaderEntrySize, 8)).c_str());
|
|
|
|
m_pPHCount->SetText(lexical_cast<tstring>(pH->nProgHeaderCount).c_str());
|
|
|
|
m_pSHOffset->SetText((_T("0x") + lexical_cast_hex<tstring>(pH->nSectHeaderStart, 8)).c_str());
|
|
|
|
m_pSHSize->SetText((_T("0x") + lexical_cast_hex<tstring>(pH->nSectHeaderEntrySize, 8)).c_str());
|
|
|
|
m_pSHCount->SetText(lexical_cast<tstring>(pH->nSectHeaderCount).c_str());
|
|
|
|
m_pFlags->SetText((_T("0x") + lexical_cast_hex<tstring>(pH->nFlags, 8)).c_str());
|
|
|
|
m_pSize->SetText((_T("0x") + lexical_cast_hex<tstring>(pH->nSize, 8)).c_str());
|
|
|
|
m_pSHStrTab->SetText(lexical_cast<tstring>(pH->nSectHeaderStringTableIndex).c_str());
|
2006-06-15 04:19:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void CELFHeaderView::RefreshLayout()
|
|
|
|
{
|
|
|
|
RECT rc;
|
|
|
|
::GetClientRect(GetParent(), &rc);
|
|
|
|
|
|
|
|
SetPosition(0, 0);
|
|
|
|
SetSize(rc.right, rc.bottom);
|
|
|
|
|
|
|
|
GetClientRect(&rc);
|
|
|
|
|
|
|
|
SetRect(&rc, rc.left + 10, rc.top + 10, rc.right - 10, rc.bottom + m_pLayout->GetPreferredHeight());
|
|
|
|
|
|
|
|
m_pLayout->SetRect(rc.left, rc.top, rc.right, rc.bottom);
|
|
|
|
m_pLayout->RefreshGeometry();
|
|
|
|
|
|
|
|
Redraw();
|
|
|
|
}
|
|
|
|
|
|
|
|
long CELFHeaderView::OnSize(unsigned int nType, unsigned int nX, unsigned int nY)
|
|
|
|
{
|
|
|
|
RefreshLayout();
|
|
|
|
return TRUE;
|
|
|
|
}
|