#include #include "ELFHeaderView.h" #include "PtrMacro.h" #include "layout/LayoutStretch.h" #include "win32/Static.h" #include "win32/LayoutWindow.h" #include #include "lexical_cast_ex.h" #define CLSNAME _T("CELFHeaderView") using namespace Framework; using namespace boost; using namespace std; 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); Create(NULL, CLSNAME, _T(""), WS_CHILD | WS_DISABLED | WS_CLIPCHILDREN, &rc, hParent, NULL); SetClassPtr(); 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); m_pLayout = CGridLayout::Create(2, 14); m_pLayout->SetObject(0, 0, Win32::CLayoutWindow::CreateTextBoxBehavior(100, 20, new Win32::CStatic(m_hWnd, _T("Type:")))); m_pLayout->SetObject(0, 1, Win32::CLayoutWindow::CreateTextBoxBehavior(100, 20, new Win32::CStatic(m_hWnd, _T("Machine:")))); m_pLayout->SetObject(0, 2, Win32::CLayoutWindow::CreateTextBoxBehavior(100, 20, new Win32::CStatic(m_hWnd, _T("Version:")))); m_pLayout->SetObject(0, 3, Win32::CLayoutWindow::CreateTextBoxBehavior(100, 20, new Win32::CStatic(m_hWnd, _T("Entry Point:")))); m_pLayout->SetObject(0, 4, Win32::CLayoutWindow::CreateTextBoxBehavior(100, 20, new Win32::CStatic(m_hWnd, _T("Flags:")))); m_pLayout->SetObject(0, 5, Win32::CLayoutWindow::CreateTextBoxBehavior(100, 20, new Win32::CStatic(m_hWnd, _T("Header Size:")))); m_pLayout->SetObject(0, 6, Win32::CLayoutWindow::CreateTextBoxBehavior(100, 20, new Win32::CStatic(m_hWnd, _T("Program Header Table Offset:")))); m_pLayout->SetObject(0, 7, Win32::CLayoutWindow::CreateTextBoxBehavior(100, 20, new Win32::CStatic(m_hWnd, _T("Program Header Size:")))); m_pLayout->SetObject(0, 8, Win32::CLayoutWindow::CreateTextBoxBehavior(100, 20, new Win32::CStatic(m_hWnd, _T("Program Header Count:")))); m_pLayout->SetObject(0, 9, Win32::CLayoutWindow::CreateTextBoxBehavior(100, 20, new Win32::CStatic(m_hWnd, _T("Section Header Table Offset:")))); m_pLayout->SetObject(0, 10, Win32::CLayoutWindow::CreateTextBoxBehavior(100, 20, new Win32::CStatic(m_hWnd, _T("Section Header Size:")))); m_pLayout->SetObject(0, 11, Win32::CLayoutWindow::CreateTextBoxBehavior(100, 20, new Win32::CStatic(m_hWnd, _T("Section Header Count:")))); m_pLayout->SetObject(0, 12, Win32::CLayoutWindow::CreateTextBoxBehavior(100, 20, new Win32::CStatic(m_hWnd, _T("Section Header String Table Index:")))); m_pLayout->SetObject(1, 0, Win32::CLayoutWindow::CreateTextBoxBehavior(100, 20, m_pType)); m_pLayout->SetObject(1, 1, Win32::CLayoutWindow::CreateTextBoxBehavior(100, 20, m_pMachine)); m_pLayout->SetObject(1, 2, Win32::CLayoutWindow::CreateTextBoxBehavior(100, 20, m_pVersion)); m_pLayout->SetObject(1, 3, Win32::CLayoutWindow::CreateTextBoxBehavior(100, 20, m_pEntry)); m_pLayout->SetObject(1, 4, Win32::CLayoutWindow::CreateTextBoxBehavior(100, 20, m_pFlags)); m_pLayout->SetObject(1, 5, Win32::CLayoutWindow::CreateTextBoxBehavior(100, 20, m_pSize)); m_pLayout->SetObject(1, 6, Win32::CLayoutWindow::CreateTextBoxBehavior(100, 20, m_pPHOffset)); m_pLayout->SetObject(1, 7, Win32::CLayoutWindow::CreateTextBoxBehavior(100, 20, m_pPHSize)); m_pLayout->SetObject(1, 8, Win32::CLayoutWindow::CreateTextBoxBehavior(100, 20, m_pPHCount)); m_pLayout->SetObject(1, 9, Win32::CLayoutWindow::CreateTextBoxBehavior(100, 20, m_pSHOffset)); m_pLayout->SetObject(1, 10, Win32::CLayoutWindow::CreateTextBoxBehavior(100, 20, m_pSHSize)); m_pLayout->SetObject(1, 11, Win32::CLayoutWindow::CreateTextBoxBehavior(100, 20, m_pSHCount)); m_pLayout->SetObject(1, 12, Win32::CLayoutWindow::CreateTextBoxBehavior(100, 20, m_pSHStrTab)); m_pLayout->SetObject(1, 13, CLayoutStretch::Create()); FillInformation(); RefreshLayout(); } CELFHeaderView::~CELFHeaderView() { Destroy(); } void CELFHeaderView::FillInformation() { TCHAR sTemp[256]; const ELFHEADER* pH = &m_pELF->GetHeader(); switch(pH->nType) { case 0x00: _tcscpy(sTemp, _T("ET_NONE")); break; case 0x01: _tcscpy(sTemp, _T("ET_REL")); break; case 0x02: _tcscpy(sTemp, _T("ET_EXEC")); break; case 0x03: _tcscpy(sTemp, _T("ET_DYN")); break; case 0x04: _tcscpy(sTemp, _T("ET_CORE")); break; default: _sntprintf(sTemp, countof(sTemp), _T("Unknown (%i)"), pH->nType); break; } m_pType->SetText(sTemp); switch(pH->nCPU) { case 0x00: _tcscpy(sTemp, _T("EM_NONE")); break; case 0x01: _tcscpy(sTemp, _T("EM_M32")); break; case 0x02: _tcscpy(sTemp, _T("EM_SPARC")); break; case 0x03: _tcscpy(sTemp, _T("EM_386")); break; case 0x04: _tcscpy(sTemp, _T("EM_68K")); break; case 0x05: _tcscpy(sTemp, _T("EM_88K")); break; case 0x07: _tcscpy(sTemp, _T("EM_860")); break; case 0x08: _tcscpy(sTemp, _T("EM_MIPS")); break; default: _sntprintf(sTemp, countof(sTemp), _T("Unknown (%i)"), pH->nCPU); break; } m_pMachine->SetText(sTemp); switch(pH->nVersion) { case 0x00: _tcscpy(sTemp, _T("EV_NONE")); break; case 0x01: _tcscpy(sTemp, _T("EV_CURRENT")); break; default: _sntprintf(sTemp, countof(sTemp), _T("Unknown (%i)"), pH->nVersion); break; } m_pVersion->SetText(sTemp); m_pEntry->SetText((_T("0x") + lexical_cast_hex(pH->nEntryPoint, 8)).c_str()); m_pPHOffset->SetText((_T("0x") + lexical_cast_hex(pH->nProgHeaderStart, 8)).c_str()); m_pPHSize->SetText((_T("0x") + lexical_cast_hex(pH->nProgHeaderEntrySize, 8)).c_str()); m_pPHCount->SetText(lexical_cast(pH->nProgHeaderCount).c_str()); m_pSHOffset->SetText((_T("0x") + lexical_cast_hex(pH->nSectHeaderStart, 8)).c_str()); m_pSHSize->SetText((_T("0x") + lexical_cast_hex(pH->nSectHeaderEntrySize, 8)).c_str()); m_pSHCount->SetText(lexical_cast(pH->nSectHeaderCount).c_str()); m_pFlags->SetText((_T("0x") + lexical_cast_hex(pH->nFlags, 8)).c_str()); m_pSize->SetText((_T("0x") + lexical_cast_hex(pH->nSize, 8)).c_str()); m_pSHStrTab->SetText(lexical_cast(pH->nSectHeaderStringTableIndex).c_str()); } 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; }