SectionTblView.cpp
上传用户:ch83438830
上传日期:2007-01-01
资源大小:104k
文件大小:12k
源码类别:

文件操作

开发平台:

Visual C++

  1. // winpeView.cpp : implementation of the CSectionTblView class
  2. //
  3. #include "stdafx.h"
  4. #include "winpe.h"
  5. //#include "pefile.h"
  6. #include "winpeDoc.h"
  7. #include "SectionTblView.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. typedef struct
  14. {
  15.     DWORD   flag;
  16.     PSTR    name;
  17. } DWORD_FLAG_DESCRIPTIONS;
  18. // Bitfield values and names for the IMAGE_SECTION_HEADER flags
  19. DWORD_FLAG_DESCRIPTIONS SectionCharacteristics[] = 
  20. {
  21. { IMAGE_SCN_CNT_CODE, "CODE" },
  22. { IMAGE_SCN_CNT_INITIALIZED_DATA, "INITIALIZED_DATA" },
  23. { IMAGE_SCN_CNT_UNINITIALIZED_DATA, "UNINITIALIZED_DATA" },
  24. { IMAGE_SCN_LNK_INFO, "LNK_INFO" },
  25. // { IMAGE_SCN_LNK_OVERLAY, "LNK_OVERLAY" },
  26. { IMAGE_SCN_LNK_REMOVE, "LNK_REMOVE" },
  27. { IMAGE_SCN_LNK_COMDAT, "LNK_COMDAT" },
  28. { IMAGE_SCN_MEM_DISCARDABLE, "MEM_DISCARDABLE" },
  29. { IMAGE_SCN_MEM_NOT_CACHED, "MEM_NOT_CACHED" },
  30. { IMAGE_SCN_MEM_NOT_PAGED, "MEM_NOT_PAGED" },
  31. { IMAGE_SCN_MEM_SHARED, "MEM_SHARED" },
  32. { IMAGE_SCN_MEM_EXECUTE, "MEM_EXECUTE" },
  33. { IMAGE_SCN_MEM_READ, "MEM_READ" },
  34. { IMAGE_SCN_MEM_WRITE, "MEM_WRITE" },
  35. };
  36. #define NUMBER_SECTION_CHARACTERISTICS 
  37.     (sizeof(SectionCharacteristics) / sizeof(DWORD_FLAG_DESCRIPTIONS))
  38. /////////////////////////////////////////////////////////////////////////////
  39. // CSectionTblView
  40. IMPLEMENT_DYNCREATE(CSectionTblView, CScrollView)
  41. BEGIN_MESSAGE_MAP(CSectionTblView, CScrollView)
  42. //{{AFX_MSG_MAP(CSectionTblView)
  43. ON_WM_CREATE()
  44. //}}AFX_MSG_MAP
  45. // Standard printing commands
  46. ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
  47. ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
  48. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
  49. END_MESSAGE_MAP()
  50. /////////////////////////////////////////////////////////////////////////////
  51. // CSectionTblView construction/destruction
  52. CSectionTblView::CSectionTblView()
  53. {
  54. // TODO: add construction code here
  55. }
  56. CSectionTblView::~CSectionTblView()
  57. {
  58. }
  59. BOOL CSectionTblView::PreCreateWindow(CREATESTRUCT& cs)
  60. {
  61. // TODO: Modify the Window class or styles here by modifying
  62. //  the CREATESTRUCT cs
  63. return CScrollView::PreCreateWindow(cs);
  64. }
  65. /////////////////////////////////////////////////////////////////////////////
  66. // CSectionTblView drawing
  67. void CSectionTblView::OnDraw(CDC* pDC)
  68. {
  69. CWinpeDoc* pDoc = GetDocument();
  70. ASSERT_VALID(pDoc);
  71. if (m_nLinesTotal != 0)
  72. {
  73. CRect rect;
  74. pDC->GetClipBox(&rect);
  75. CSize size = pDC->GetTextExtent("Fg",2);
  76. INT nStart = rect.top / size.cy;
  77. INT nEnd = min (m_nLinesTotal -1,
  78.  (rect.bottom + size.cy - 1) /
  79.  size.cy);
  80. CFont * pOldFont = pDC->SelectObject(pDoc->m_screenFont);
  81. for (INT i = nStart; i <= nEnd; i++)
  82. {
  83. pDC->TextOut(2,(i * size.cy) +2,m_DisplayData[i]);
  84. }
  85. pDC->SelectObject(pOldFont);
  86. }
  87. }
  88. /////////////////////////////////////////////////////////////////////////////
  89. // CSectionTblView printing
  90. BOOL CSectionTblView::OnPreparePrinting(CPrintInfo* pInfo)
  91. {
  92. // default preparation
  93. return DoPreparePrinting(pInfo);
  94. }
  95. void CSectionTblView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
  96. {
  97. // TODO: add extra initialization before printing
  98. CWinpeDoc* pDoc = GetDocument();
  99. ASSERT_VALID(pDoc);
  100. pDC->SetMapMode(MM_LOENGLISH);
  101.     CFont* pOldFont = pDC->SelectObject (pDoc->m_printerFont);
  102.     
  103.     CSize size = pDC->GetTextExtent ("---------1---------2---------" 
  104.         "3---------4---------5---------6---------7---------8-", 81);
  105.     pDC->SelectObject (pOldFont);
  106. //
  107. // Get height and width then convert to logical
  108. //
  109. CSize vsz; // vertres horzres
  110. vsz.cy = pDC->GetDeviceCaps(VERTRES);
  111. vsz.cx = pDC->GetDeviceCaps(HORZRES);
  112. pDC->DPtoLP(&vsz);
  113. m_cyPrinter = size.cy;
  114. m_cxOffset = (vsz.cx - size.cx) / 2;
  115.     m_cxWidth = size.cx;
  116. //
  117.     //
  118. //
  119.     m_nLinesPerPage = (vsz.cy -
  120.         (m_cyPrinter * (3 + (2 * PRINTMARGIN)))) / m_cyPrinter;
  121.     UINT nMaxPage = max (1, (m_nLinesTotal + (m_nLinesPerPage - 1)) /
  122.         m_nLinesPerPage);
  123. if (m_nLinesTotal + (m_nLinesPerPage - 1) % m_nLinesPerPage)
  124. nMaxPage++;
  125.     pInfo->SetMaxPage (nMaxPage);
  126. }
  127. void CSectionTblView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  128. {
  129. // TODO: add cleanup after printing
  130. }
  131. /////////////////////////////////////////////////////////////////////////////
  132. // CSectionTblView diagnostics
  133. #ifdef _DEBUG
  134. void CSectionTblView::AssertValid() const
  135. {
  136. CScrollView::AssertValid();
  137. }
  138. void CSectionTblView::Dump(CDumpContext& dc) const
  139. {
  140. CScrollView::Dump(dc);
  141. }
  142. CWinpeDoc* CSectionTblView::GetDocument() // non-debug version is inline
  143. {
  144. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CWinpeDoc)));
  145. return (CWinpeDoc*)m_pDocument;
  146. }
  147. #endif //_DEBUG
  148. /////////////////////////////////////////////////////////////////////////////
  149. // CSectionTblView message handlers
  150. int CSectionTblView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  151. {
  152. if (CScrollView::OnCreate(lpCreateStruct) == -1)
  153. return -1;
  154. return 0;
  155. }
  156. void CSectionTblView::OnInitialUpdate() 
  157. {
  158. CWinpeDoc* pDoc = GetDocument();
  159. ASSERT_VALID(pDoc);
  160. pDoc->TurnChecksOff();
  161. pDoc->m_Sections_Checked = TRUE;
  162. DWORD nDocLength = pDoc->GetDocumentLength();
  163. if (nDocLength == 0)
  164. {
  165. m_nLinesTotal = 0;
  166. }
  167. else
  168. {
  169. m_nLinesTotal = GetSectionTable();
  170. }
  171. CClientDC dc(this);
  172. TEXTMETRIC tm;
  173. CFont* pOldFont = dc.SelectObject(pDoc->m_screenFont);
  174. dc.GetTextMetrics (&tm);
  175. m_cyScreen = tm.tmHeight + tm.tmExternalLeading;
  176. dc.SelectObject(pOldFont);
  177. SetScrollSizes (MM_TEXT,
  178. CSize(0,m_nLinesTotal * m_cyScreen), //tot size
  179. CSize(0,m_cyScreen * 10),  //screen size 
  180. CSize (0,m_cyScreen)); //line size
  181. ScrollToPosition(CPoint (0,0));
  182. CScrollView::OnInitialUpdate();
  183. // TODO: Add your specialized code here and/or call the base class
  184. }
  185. INT CSectionTblView::GetSectionTable()
  186. {
  187. PIMAGE_SECTION_HEADER pSections;
  188. PIMAGE_DOS_HEADER pDosHeader;
  189. PIMAGE_NT_HEADERS pNTHeader;
  190. INT nsections;
  191. BYTE * pfile;
  192. CString string;
  193. BOOL IsEXE;
  194. INT i, j; 
  195. CHAR line[128];
  196. CHAR *pLine;
  197. CWinpeDoc* pDoc;
  198. pDoc = GetDocument();
  199. pfile = pDoc->GetDocumentDataP();
  200. pDosHeader = (PIMAGE_DOS_HEADER)pfile;
  201. pNTHeader = MakePtr(PIMAGE_NT_HEADERS,
  202. pDosHeader,
  203. pDosHeader->e_lfanew);
  204. nsections = pNTHeader->FileHeader.NumberOfSections;
  205. //nsections = NumOfSections(pfile);
  206. INT tp = pDoc->GetOpenFileType();
  207. if (tp == FILETYPE_EXE)
  208. IsEXE = TRUE;
  209. else
  210. IsEXE = FALSE;
  211. pSections = IMAGE_FIRST_SECTION(pNTHeader);
  212. //pSections = (PIMAGE_SECTION_HEADER)SECHDROFFSET(pfile);
  213.     string = "Section Table";
  214. m_DisplayData.Add(string);
  215.         
  216.     for ( i=1; i <= nsections; i++, pSections++ )
  217.     {
  218.         wsprintf(line, "  %02X %-8.8s  %s: %08X  VirtAddr:  %08X",
  219.                 i, pSections->Name,
  220.                 IsEXE ? "VirtSize" : "PhysAddr",
  221.                 pSections->Misc.VirtualSize, pSections->VirtualAddress);
  222. pLine = string.GetBuffer(strlen(line)+1);
  223. strcpy(pLine,line);
  224. string.ReleaseBuffer();
  225. m_DisplayData.Add(string);
  226.         wsprintf(line, "    raw data offs:   %08X  raw data size: %08X",
  227.                 pSections->PointerToRawData, pSections->SizeOfRawData );
  228. pLine = string.GetBuffer(strlen(line)+1);
  229. strcpy(pLine,line);
  230. string.ReleaseBuffer();
  231. m_DisplayData.Add(string);
  232.         wsprintf(line, "    relocation offs: %08X  relocations:   %08X",
  233.                 pSections->PointerToRelocations, pSections->NumberOfRelocations );
  234. pLine = string.GetBuffer(strlen(line)+1);
  235. strcpy(pLine,line);
  236. string.ReleaseBuffer();
  237. m_DisplayData.Add(string);
  238.         wsprintf(line, "    line # offs:     %08X  line #'s:      %08X",
  239.                 pSections->PointerToLinenumbers, pSections->NumberOfLinenumbers );
  240. pLine = string.GetBuffer(strlen(line)+1);
  241. strcpy(pLine,line);
  242. string.ReleaseBuffer();
  243. m_DisplayData.Add(string);
  244.         wsprintf(line, "    characteristics: %08X", pSections->Characteristics);
  245. pLine = string.GetBuffer(strlen(line)+1);
  246. strcpy(pLine,line);
  247. string.ReleaseBuffer();
  248. m_DisplayData.Add(string);
  249.         wsprintf(line,"    ");
  250. pLine = string.GetBuffer(strlen(line)+1);
  251. strcpy(pLine,line);
  252. string.ReleaseBuffer();
  253. m_DisplayData.Add(string);
  254.         for ( j=0; j < NUMBER_SECTION_CHARACTERISTICS; j++ )
  255.         {
  256.             if ( pSections->Characteristics & 
  257.                 SectionCharacteristics[j].flag )
  258. {
  259.                 wsprintf(line, "  %s", SectionCharacteristics[j].name );
  260. pLine = string.GetBuffer(strlen(line)+1);
  261. strcpy(pLine,line);
  262. string.ReleaseBuffer();
  263. m_DisplayData.Add(string);
  264. }
  265.         }
  266. string = "  ";
  267. m_DisplayData.Add(string);
  268.         
  269.     }
  270.     
  271.     return m_DisplayData.GetSize(); 
  272. }
  273. void CSectionTblView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) 
  274. {
  275. // TODO: Add your specialized code here and/or call the base class
  276. //CScrollView::OnPrepareDC(pDC, pInfo);
  277. CWinpeDoc* pDoc = GetDocument();
  278. ASSERT_VALID(pDoc);
  279. CScrollView::OnPrepareDC(pDC, pInfo);
  280. if (pInfo)
  281. {
  282. pDC->SetMapMode(MM_LOENGLISH);
  283. pDC->SelectObject(pDoc->m_printerFont);
  284. }
  285. }
  286. void CSectionTblView::OnPrint(CDC* pDC, CPrintInfo* pInfo) 
  287. {
  288. // TODO: Add your specialized code here and/or call the base class
  289. //CScrollView::OnPrint(pDC, pInfo);
  290. PrintPageHeader (pDC, pInfo->m_nCurPage);
  291.     PrintPage (pDC, pInfo->m_nCurPage);
  292. }
  293. void CSectionTblView::PrintPageHeader(CDC* pDC, UINT nPageNumber)
  294. {
  295. CWinpeDoc* pDoc = GetDocument();
  296. ASSERT_VALID(pDoc);
  297. CString strHeader = GetDocument ()->GetPathName ();
  298.     if (strHeader.GetLength () > 68)
  299.         strHeader = GetDocument ()->GetTitle ();
  300.     CString strPageNumber;
  301.     strPageNumber.Format ("Page %d", nPageNumber);
  302.     UINT nSpaces = 81 - strPageNumber.GetLength () -
  303.         strHeader.GetLength ();
  304.     for (UINT i=0; i<nSpaces; i++)
  305.         strHeader += ' ';
  306.     strHeader += strPageNumber;
  307.     INT y = m_cyPrinter * PRINTMARGIN;
  308.     CFont* pOldFont = pDC->SelectObject (pDoc->m_printerFont);
  309.     //pDC->TextOut (m_cxOffset, -y, strHeader);
  310. pDC->TextOut (0, -y, strHeader);
  311.     y += (m_cyPrinter * 3) / 2;
  312.     //pDC->MoveTo (m_cxOffset, -y);
  313. pDC->MoveTo (0, -y);
  314.     pDC->LineTo (m_cxWidth, -y);
  315. //pDC->LineTo (0, -y);
  316.     pDC->SelectObject (pOldFont);
  317. }
  318. void CSectionTblView::PrintPage(CDC* pDC, UINT nPageNumber)
  319. {
  320. CWinpeDoc* pDoc = GetDocument();
  321. ASSERT_VALID(pDoc);
  322. if (m_nLinesTotal != 0) {
  323.         INT nStart = (nPageNumber - 1) * m_nLinesPerPage;
  324.         INT nEnd = min (m_nLinesTotal - 1, nStart + m_nLinesPerPage - 1);
  325.         CString string;
  326.         CFont* pOldFont = pDC->SelectObject (pDoc->m_printerFont);
  327.         INT y;
  328.         for (INT i=nStart; i<=nEnd; i++) {
  329.             //FormatLine (i, string);
  330.             y = ((i - nStart) + PRINTMARGIN + 3) * m_cyPrinter;
  331.             //pDC->TextOut (m_cxOffset, -y, string);
  332. pDC->TextOut (0, -y, m_DisplayData[i]);
  333.         }
  334.         pDC->SelectObject (pOldFont);
  335.     }
  336. }
  337. void CSectionTblView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
  338. {
  339. // TODO: Add your specialized code here and/or call the base class
  340. CWinpeDoc* pDoc = GetDocument();
  341. ASSERT_VALID(pDoc);
  342. CClientDC dc(this);
  343. TEXTMETRIC tm;
  344. CFont* pOldFont = dc.SelectObject(pDoc->m_screenFont);
  345. dc.GetTextMetrics (&tm);
  346. m_cyScreen = tm.tmHeight + tm.tmExternalLeading;
  347. dc.SelectObject(pOldFont);
  348. //
  349. SetScrollSizes (MM_TEXT,
  350. CSize(0,m_nLinesTotal * m_cyScreen),
  351. CSize(0,m_cyScreen * 100),
  352. CSize (0,m_cyScreen));
  353. ScrollToPosition(CPoint (0,0));
  354. CRect rect;
  355. dc.GetClipBox(&rect);
  356. InvalidateRect(&rect);
  357. }