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

文件操作

开发平台:

Visual C++

  1. // winpeView.cpp : implementation of the CExportView class
  2. //
  3. #include "stdafx.h"
  4. #include "winpe.h"
  5. //#include "pefile.h"
  6. #include "winpeDoc.h"
  7. #include "ExportView.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CExportView
  15. IMPLEMENT_DYNCREATE(CExportView, CScrollView)
  16. BEGIN_MESSAGE_MAP(CExportView, CScrollView)
  17. //{{AFX_MSG_MAP(CExportView)
  18. ON_WM_CREATE()
  19. //}}AFX_MSG_MAP
  20. // Standard printing commands
  21. ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
  22. ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
  23. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
  24. END_MESSAGE_MAP()
  25. /////////////////////////////////////////////////////////////////////////////
  26. // CExportView construction/destruction
  27. CExportView::CExportView()
  28. {
  29. // TODO: add construction code here
  30. }
  31. CExportView::~CExportView()
  32. {
  33. }
  34. BOOL CExportView::PreCreateWindow(CREATESTRUCT& cs)
  35. {
  36. // TODO: Modify the Window class or styles here by modifying
  37. //  the CREATESTRUCT cs
  38. return CScrollView::PreCreateWindow(cs);
  39. }
  40. /////////////////////////////////////////////////////////////////////////////
  41. // CExportView drawing
  42. void CExportView::OnDraw(CDC* pDC)
  43. {
  44. CWinpeDoc* pDoc = GetDocument();
  45. ASSERT_VALID(pDoc);
  46. if (m_nLinesTotal != 0)
  47. {
  48. CRect rect;
  49. pDC->GetClipBox(&rect);
  50. CFont * pOldFont = pDC->SelectObject(pDoc->m_screenFont);
  51. CSize size = pDC->GetTextExtent("Fg",2);
  52. INT nStart = rect.top / size.cy;
  53. INT nEnd = min (m_nLinesTotal -1,
  54.  (rect.bottom + size.cy - 1) /
  55.  size.cy);
  56. //UINT nStart = rect.top / pDoc->m_cyScreen;
  57. //UINT nEnd = min(m_nLinesTotal - 1,
  58. //  (rect.bottom + pDoc->m_cyScreen - 1) /
  59. //  pDoc->m_cyScreen);
  60. for (INT i = nStart; i <= nEnd; i++)
  61. {
  62. pDC->TextOut(2,(i * size.cy) +2,m_DisplayData[i]);
  63. }
  64. pDC->SelectObject(pOldFont);
  65. }
  66. }
  67. /////////////////////////////////////////////////////////////////////////////
  68. // CExportView printing
  69. BOOL CExportView::OnPreparePrinting(CPrintInfo* pInfo)
  70. {
  71. // default preparation
  72. return DoPreparePrinting(pInfo);
  73. }
  74. void CExportView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
  75. {
  76. // TODO: add extra initialization before printing
  77. CWinpeDoc* pDoc = GetDocument();
  78. ASSERT_VALID(pDoc);
  79. pDC->SetMapMode(MM_LOENGLISH);
  80.     CFont* pOldFont = pDC->SelectObject (pDoc->m_printerFont);
  81.     
  82.     CSize size = pDC->GetTextExtent ("---------1---------2---------" 
  83.         "3---------4---------5---------6---------7---------8-", 81);
  84.     pDC->SelectObject (pOldFont);
  85. //
  86. // Get height and width then convert to logical
  87. //
  88. CSize vsz; // vertres horzres
  89. vsz.cy = pDC->GetDeviceCaps(VERTRES);
  90. vsz.cx = pDC->GetDeviceCaps(HORZRES);
  91. pDC->DPtoLP(&vsz);
  92. m_cyPrinter = size.cy;
  93. m_cxOffset = (vsz.cx - size.cx) / 2;
  94.     m_cxWidth = size.cx;
  95. //
  96.     //
  97. //
  98.     m_nLinesPerPage = (vsz.cy -
  99.         (m_cyPrinter * (3 + (2 * PRINTMARGIN)))) / m_cyPrinter;
  100.     UINT nMaxPage = max (1, (m_nLinesTotal + (m_nLinesPerPage - 1)) /
  101.         m_nLinesPerPage);
  102. if (m_nLinesTotal + (m_nLinesPerPage - 1) % m_nLinesPerPage)
  103. nMaxPage++;
  104.     pInfo->SetMaxPage (nMaxPage);
  105. }
  106. void CExportView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  107. {
  108. // TODO: add cleanup after printing
  109. }
  110. /////////////////////////////////////////////////////////////////////////////
  111. // CExportView diagnostics
  112. #ifdef _DEBUG
  113. void CExportView::AssertValid() const
  114. {
  115. CScrollView::AssertValid();
  116. }
  117. void CExportView::Dump(CDumpContext& dc) const
  118. {
  119. CScrollView::Dump(dc);
  120. }
  121. CWinpeDoc* CExportView::GetDocument() // non-debug version is inline
  122. {
  123. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CWinpeDoc)));
  124. return (CWinpeDoc*)m_pDocument;
  125. }
  126. #endif //_DEBUG
  127. /////////////////////////////////////////////////////////////////////////////
  128. // CExportView message handlers
  129. int CExportView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  130. {
  131. if (CScrollView::OnCreate(lpCreateStruct) == -1)
  132. return -1;
  133. // TODO: Add your specialized creation code here
  134. return 0;
  135. }
  136. void CExportView::OnInitialUpdate() 
  137. {
  138. CWinpeDoc* pDoc = GetDocument();
  139. ASSERT_VALID(pDoc);
  140. pDoc->TurnChecksOff();
  141. pDoc->m_Exports_Checked = TRUE;
  142. DWORD nDocLength = pDoc->GetDocumentLength();
  143. if (nDocLength == 0)
  144. {
  145. m_nLinesTotal = 0;
  146. }
  147. else
  148. {
  149. m_nLinesTotal = GetExportsSection();
  150. }
  151. CClientDC dc(this);
  152. TEXTMETRIC tm;
  153. CFont* pOldFont = dc.SelectObject(pDoc->m_screenFont);
  154. dc.GetTextMetrics (&tm);
  155. m_cyScreen = tm.tmHeight + tm.tmExternalLeading;
  156. dc.SelectObject(pOldFont);
  157. SetScrollSizes (MM_TEXT,
  158. CSize(0,m_nLinesTotal * m_cyScreen), //tot size
  159. CSize(0,m_cyScreen * 10),  //screen size 
  160. CSize (0,m_cyScreen)); //line size
  161. ScrollToPosition(CPoint (0,0));
  162. CScrollView::OnInitialUpdate();
  163. // TODO: Add your specialized code here and/or call the base class
  164. }
  165. INT CExportView::GetExportsSection()
  166. {
  167. PIMAGE_EXPORT_DIRECTORY exportDir;
  168. PIMAGE_SECTION_HEADER header;
  169. PIMAGE_NT_HEADERS pNTHeader;
  170. PIMAGE_DOS_HEADER pDosHdr;
  171. INT delta;
  172. LPSTR filename;
  173. DWORD i;
  174. PDWORD functions;
  175. PWORD  ordinals;
  176. LPSTR *name;
  177. DWORD exportsStartRVA, exportsEndRVA;
  178. DWORD base;
  179. BYTE * pfile;
  180. CString string;
  181. CString stringapnd;
  182. CHAR line[128];
  183. CHAR *pLine;
  184. CWinpeDoc* pDoc;
  185. pDoc = GetDocument();
  186. pfile = pDoc->GetDocumentDataP();
  187. pDosHdr = (PIMAGE_DOS_HEADER)pfile;
  188. base = (DWORD)pfile;
  189. pNTHeader = MakePtr(PIMAGE_NT_HEADERS,
  190. pfile,pDosHdr->e_lfanew);
  191. exportsStartRVA = 
  192. pNTHeader->OptionalHeader.DataDirectory
  193.     [IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
  194. exportsEndRVA = exportsStartRVA + pNTHeader->OptionalHeader.DataDirectory
  195.                             [IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
  196.     // Get the IMAGE_SECTION_HEADER that contains the exports.  This is
  197.     // usually the .edata section, but doesn't have to be.
  198.     header = pDoc->GetEnclosingSectionHeader(exportsStartRVA,
  199.  pNTHeader);
  200.     if ( !header )
  201. {
  202. string = "No Exports Table Found:";
  203. m_DisplayData.Add(string);
  204.         return m_DisplayData.GetSize(); 
  205. }
  206.     delta = (INT)(header->VirtualAddress - header->PointerToRawData);
  207.         
  208.     exportDir = MakePtr(PIMAGE_EXPORT_DIRECTORY, base,
  209.                          exportsStartRVA - delta);
  210.         
  211.     filename = (PSTR)(exportDir->Name - delta + base);
  212.     string = "Exports Table:";
  213. m_DisplayData.Add(string);
  214.         
  215.     
  216.     wsprintf(line,"  Name:            %s", filename);
  217. pLine = string.GetBuffer(strlen(line)+1);
  218. strcpy(pLine,line);
  219. string.ReleaseBuffer();
  220. m_DisplayData.Add(string);
  221.     wsprintf(line,"  Characteristics: %08X", exportDir->Characteristics);
  222. pLine = string.GetBuffer(strlen(line)+1);
  223. strcpy(pLine,line);
  224. string.ReleaseBuffer();
  225. m_DisplayData.Add(string);
  226.     wsprintf(line,"  TimeDateStamp:   %08X", exportDir->TimeDateStamp);
  227. pLine = string.GetBuffer(strlen(line)+1);
  228. strcpy(pLine,line);
  229. string.ReleaseBuffer();
  230. m_DisplayData.Add(string);
  231.     wsprintf(line,"  Version:         %u.%02u", exportDir->MajorVersion,
  232.             exportDir->MinorVersion);
  233. pLine = string.GetBuffer(strlen(line)+1);
  234. strcpy(pLine,line);
  235. string.ReleaseBuffer();
  236. m_DisplayData.Add(string);
  237.     wsprintf(line,"  Ordinal base:    %08X", exportDir->Base);
  238. pLine = string.GetBuffer(strlen(line)+1);
  239. strcpy(pLine,line);
  240. string.ReleaseBuffer();
  241. m_DisplayData.Add(string);
  242.     wsprintf(line,"  # of functions:  %08X", exportDir->NumberOfFunctions);
  243. pLine = string.GetBuffer(strlen(line)+1);
  244. strcpy(pLine,line);
  245. string.ReleaseBuffer();
  246. m_DisplayData.Add(string);
  247.     wsprintf(line,"  # of Names:      %08X", exportDir->NumberOfNames);
  248. pLine = string.GetBuffer(strlen(line)+1);
  249. strcpy(pLine,line);
  250. string.ReleaseBuffer();
  251. m_DisplayData.Add(string);
  252.     
  253.     functions = (PDWORD)((DWORD)exportDir->AddressOfFunctions - delta + base);
  254.     ordinals = (PWORD)((DWORD)exportDir->AddressOfNameOrdinals - delta + base);
  255.     name = (PSTR *)((DWORD)exportDir->AddressOfNames - delta + base);
  256.     wsprintf(line,"  Entry Pt  Ordn  Name");
  257. pLine = string.GetBuffer(strlen(line)+1);
  258. strcpy(pLine,line);
  259. string.ReleaseBuffer();
  260. m_DisplayData.Add(string);
  261.     for ( i=0; i < exportDir->NumberOfFunctions; i++ )
  262.     {
  263.         DWORD entryPointRVA = functions[i];
  264.         DWORD j;
  265.         if ( entryPointRVA == 0 )   // Skip over gaps in exported function
  266.             continue;               // ordinals (the entrypoint is 0 for
  267.                                     // these functions).
  268.         wsprintf(line,"  %08X  %4u", entryPointRVA, i + exportDir->Base );
  269. pLine = string.GetBuffer(strlen(line)+1);
  270. strcpy(pLine,line);
  271. string.ReleaseBuffer();
  272. //m_DisplayData.Add(string);
  273.         // See if this function has an associated name exported for it.
  274.         for ( j=0; j < exportDir->NumberOfNames; j++ )
  275. {
  276.             if ( ordinals[j] == i )
  277. {
  278.                 wsprintf(line,"  %s", name[j] - delta + base);
  279. pLine = stringapnd.GetBuffer(strlen(line)+1);
  280. strcpy(pLine,line);
  281. stringapnd.ReleaseBuffer();
  282. string += stringapnd;
  283. m_DisplayData.Add(string);
  284. }
  285. }
  286.         // Is it a forwarder?  If so, the entry point RVA is inside the
  287.         // .edata section, and is an RVA to the DllName.EntryPointName
  288.         if ( (entryPointRVA >= exportsStartRVA)
  289.              && (entryPointRVA <= exportsEndRVA) )
  290.         {
  291.             wsprintf(line," (forwarder -> %s)", entryPointRVA - delta + base );
  292. pLine = string.GetBuffer(strlen(line)+1);
  293. strcpy(pLine,line);
  294. string.ReleaseBuffer();
  295. m_DisplayData.Add(string);
  296.         }
  297.         
  298.         
  299.     }
  300.     
  301.     string = "  ";
  302. m_DisplayData.Add(string);
  303. return m_DisplayData.GetSize(); 
  304. }
  305. void CExportView::PrintPageHeader (CDC* pDC, UINT nPageNumber)
  306. {
  307. CWinpeDoc* pDoc = GetDocument();
  308. ASSERT_VALID(pDoc);
  309. CString strHeader = GetDocument ()->GetPathName ();
  310.     if (strHeader.GetLength () > 68)
  311.         strHeader = GetDocument ()->GetTitle ();
  312.     CString strPageNumber;
  313.     strPageNumber.Format ("Page %d", nPageNumber);
  314.     UINT nSpaces = 81 - strPageNumber.GetLength () -
  315.         strHeader.GetLength ();
  316.     for (UINT i=0; i<nSpaces; i++)
  317.         strHeader += ' ';
  318.     strHeader += strPageNumber;
  319.     INT y = m_cyPrinter * PRINTMARGIN;
  320.     CFont* pOldFont = pDC->SelectObject (pDoc->m_printerFont);
  321.     
  322. pDC->TextOut (0, -y, strHeader);
  323.     y += (m_cyPrinter * 3) / 2;
  324. pDC->MoveTo (0, -y);
  325.     pDC->LineTo (m_cxWidth, -y);
  326.     pDC->SelectObject (pOldFont);
  327. }
  328. void CExportView::PrintPage(CDC* pDC, UINT nPageNumber)
  329. {
  330. CWinpeDoc* pDoc = GetDocument();
  331. ASSERT_VALID(pDoc);
  332. if (m_nLinesTotal != 0) {
  333.         INT nStart = (nPageNumber - 1) * m_nLinesPerPage;
  334.         INT nEnd = min (m_nLinesTotal - 1, nStart + m_nLinesPerPage - 1);
  335.         CString string;
  336.         CFont* pOldFont = pDC->SelectObject (pDoc->m_printerFont);
  337.         INT y;
  338.         for (INT i=nStart; i<=nEnd; i++) {
  339.             //FormatLine (i, string);
  340.             y = ((i - nStart) + PRINTMARGIN + 3) * m_cyPrinter;
  341.             pDC->TextOut (0, -y,m_DisplayData[i]);
  342.         }
  343.         pDC->SelectObject (pOldFont);
  344.     }
  345. }
  346. void CExportView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) 
  347. {
  348. // TODO: Add your specialized code here and/or call the base class
  349. CWinpeDoc* pDoc = GetDocument();
  350. ASSERT_VALID(pDoc);
  351. CScrollView::OnPrepareDC(pDC, pInfo);
  352. if (pInfo)
  353. {
  354. pDC->SetMapMode(MM_LOENGLISH);
  355. pDC->SelectObject(pDoc->m_printerFont);
  356. }
  357. }
  358. void CExportView::OnPrint(CDC* pDC, CPrintInfo* pInfo) 
  359. {
  360. // TODO: Add your specialized code here and/or call the base class
  361. //CScrollView::OnPrint(pDC, pInfo);
  362. PrintPageHeader (pDC, pInfo->m_nCurPage);
  363.     PrintPage (pDC, pInfo->m_nCurPage);
  364. }
  365. void CExportView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
  366. {
  367. // TODO: Add your specialized code here and/or call the base class
  368. CWinpeDoc* pDoc = GetDocument();
  369. ASSERT_VALID(pDoc);
  370. CClientDC dc(this);
  371. TEXTMETRIC tm;
  372. CFont* pOldFont = dc.SelectObject(pDoc->m_screenFont);
  373. dc.GetTextMetrics (&tm);
  374. m_cyScreen = tm.tmHeight + tm.tmExternalLeading;
  375. dc.SelectObject(pOldFont);
  376. //
  377. SetScrollSizes (MM_TEXT,
  378. CSize(0,m_nLinesTotal * m_cyScreen),
  379. CSize(0,m_cyScreen * 100),
  380. CSize (0,m_cyScreen));
  381. ScrollToPosition(CPoint (0,0));
  382. CRect rect;
  383. dc.GetClipBox(&rect);
  384. InvalidateRect(&rect);
  385. }