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

文件操作

开发平台:

Visual C++

  1. // winpeView.cpp : implementation of the CImportView class
  2. //
  3. #include "stdafx.h"
  4. #include "winpe.h"
  5. //#include "pefile.h"
  6. #include "winpeDoc.h"
  7. #include "ImportView.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CImportView
  15. IMPLEMENT_DYNCREATE(CImportView, CScrollView)
  16. BEGIN_MESSAGE_MAP(CImportView, CScrollView)
  17. //{{AFX_MSG_MAP(CImportView)
  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. // CImportView construction/destruction
  27. CImportView::CImportView()
  28. {
  29. // TODO: add construction code here
  30. }
  31. CImportView::~CImportView()
  32. {
  33. }
  34. BOOL CImportView::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. // CImportView drawing
  42. void CImportView::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. for (INT i = nStart; i <= nEnd; i++)
  57. {
  58. pDC->TextOut(2,(i * size.cy) +2,m_DisplayData[i]);
  59. }
  60. pDC->SelectObject(pOldFont);
  61. }
  62. }
  63. /////////////////////////////////////////////////////////////////////////////
  64. // CImportView printing
  65. BOOL CImportView::OnPreparePrinting(CPrintInfo* pInfo)
  66. {
  67. // default preparation
  68. return DoPreparePrinting(pInfo);
  69. }
  70. void CImportView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
  71. {
  72. // TODO: add extra initialization before printing
  73. CWinpeDoc* pDoc = GetDocument();
  74. ASSERT_VALID(pDoc);
  75. m_keepprinting = TRUE;
  76.     
  77. }
  78. void CImportView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  79. {
  80. // TODO: add cleanup after printing
  81. }
  82. /////////////////////////////////////////////////////////////////////////////
  83. // CImportView diagnostics
  84. #ifdef _DEBUG
  85. void CImportView::AssertValid() const
  86. {
  87. CScrollView::AssertValid();
  88. }
  89. void CImportView::Dump(CDumpContext& dc) const
  90. {
  91. CScrollView::Dump(dc);
  92. }
  93. CWinpeDoc* CImportView::GetDocument() // non-debug version is inline
  94. {
  95. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CWinpeDoc)));
  96. return (CWinpeDoc*)m_pDocument;
  97. }
  98. #endif //_DEBUG
  99. /////////////////////////////////////////////////////////////////////////////
  100. // CImportView message handlers
  101. int CImportView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  102. {
  103. if (CScrollView::OnCreate(lpCreateStruct) == -1)
  104. return -1;
  105. // TODO: Add your specialized creation code here
  106. return 0;
  107. }
  108. void CImportView::OnInitialUpdate() 
  109. {
  110. CWinpeDoc* pDoc = GetDocument();
  111. ASSERT_VALID(pDoc);
  112. pDoc->TurnChecksOff();
  113. pDoc->m_Imports_Checked = TRUE;
  114. DWORD nDocLength = pDoc->GetDocumentLength();
  115. if (nDocLength == 0)
  116. {
  117. m_nLinesTotal = 0;
  118. }
  119. else
  120. {
  121. m_nLinesTotal = GetImportsSection();
  122. }
  123. CClientDC dc(this);
  124. TEXTMETRIC tm;
  125. CFont* pOldFont = dc.SelectObject(pDoc->m_screenFont);
  126. dc.GetTextMetrics (&tm);
  127. m_cyScreen = tm.tmHeight + tm.tmExternalLeading;
  128. dc.SelectObject(pOldFont);
  129. SetScrollSizes (MM_TEXT,
  130. CSize(0,m_nLinesTotal * m_cyScreen), //tot size
  131. CSize(0,m_cyScreen * 10),  //screen size 
  132. CSize (0,m_cyScreen)); //line size
  133. ScrollToPosition(CPoint (0,0));
  134. CScrollView::OnInitialUpdate();
  135. // TODO: Add your specialized code here and/or call the base class
  136. }
  137. INT CImportView::GetImportsSection()
  138. {
  139. BYTE * pfile;
  140. CString string;
  141. CString stringapnd;
  142. CHAR line[128];
  143. CHAR line2[128];
  144. CWinpeDoc* pDoc;
  145. PIMAGE_IMPORT_DESCRIPTOR importDesc;
  146. PIMAGE_DOS_HEADER pDosHdr;
  147. PIMAGE_NT_HEADERS pNTHeader;
  148.     PIMAGE_SECTION_HEADER pSection;
  149.     PIMAGE_THUNK_DATA thunk, thunkIAT=0;
  150.     PIMAGE_IMPORT_BY_NAME pOrdinalName;
  151.     DWORD importsStartRVA;
  152.     INT delta = -1;
  153. pDoc = GetDocument();
  154. pfile = pDoc->GetDocumentDataP();
  155. pDosHdr = (PIMAGE_DOS_HEADER)pfile;
  156. pNTHeader = MakePtr(PIMAGE_NT_HEADERS,
  157. pfile,pDosHdr->e_lfanew);
  158. // Look up where the imports section is (normally in the .idata section)
  159.     // but not necessarily so.  Therefore, grab the RVA from the data dir.
  160.     importsStartRVA = pNTHeader->OptionalHeader.DataDirectory
  161.                             [IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
  162.     if ( !importsStartRVA )
  163. {
  164. string = "No Imports Table Found:";
  165. m_DisplayData.Add(string);
  166.         return m_DisplayData.GetSize(); 
  167. }
  168.      
  169.     // Get the IMAGE_SECTION_HEADER that contains the imports.  This is
  170.     // usually the .idata section, but doesn't have to be.
  171.     pSection = pDoc->GetEnclosingSectionHeader(importsStartRVA,
  172.  pNTHeader );
  173.     if ( !pSection )
  174. {
  175. string = "No Imports Table Found:";
  176. m_DisplayData.Add(string);
  177.         return m_DisplayData.GetSize(); 
  178. }
  179.     
  180.     delta = (INT)(pSection->VirtualAddress-pSection->PointerToRawData);
  181.     
  182.     importDesc = (PIMAGE_IMPORT_DESCRIPTOR) (importsStartRVA - delta + (DWORD)pfile);
  183.             
  184.     string = "Imports Table:";
  185. m_DisplayData.Add(string);
  186.     
  187.     while ( 1 )
  188.     {
  189.         // See if we've reached an empty IMAGE_IMPORT_DESCRIPTOR
  190.         if ( (importDesc->TimeDateStamp==0 ) && (importDesc->Name==0) )
  191.             break;
  192.         
  193.         wsprintf(line,"  %s", (PBYTE)(importDesc->Name) - delta + (DWORD)pfile);
  194. AttaLine(line);
  195.         wsprintf(line,"  Hint/Name Table: %08X", importDesc->Characteristics);
  196. AttaLine(line);
  197.         wsprintf(line,"  TimeDateStamp:   %08X", importDesc->TimeDateStamp);
  198. AttaLine(line);
  199.         wsprintf(line,"  ForwarderChain:  %08X", importDesc->ForwarderChain);
  200. AttaLine(line);
  201.         wsprintf(line,"  First thunk RVA: %08X", importDesc->FirstThunk);
  202. AttaLine(line);
  203.     
  204.         thunk = (PIMAGE_THUNK_DATA)importDesc->Characteristics;
  205.         thunkIAT = (PIMAGE_THUNK_DATA)importDesc->FirstThunk;
  206.         if ( thunk == 0 )   // No Characteristics field?
  207.         {
  208.             // Yes! Gotta have a non-zero FirstThunk field then.
  209.             thunk = thunkIAT;
  210.             
  211.             if ( thunk == 0 )
  212. {                  // No FirstThunk field?  Ooops!!!
  213. string = "No First Thunk? Ooops! !";
  214. m_DisplayData.Add(string);
  215. return m_DisplayData.GetSize();
  216. }
  217.              
  218.         }
  219.         
  220.         // Adjust the pointer to point where the tables are in the
  221.         // mem mapped file.
  222.         thunk = (PIMAGE_THUNK_DATA)( (PBYTE)thunk - delta + (DWORD)pfile);
  223.         thunkIAT = (PIMAGE_THUNK_DATA)( (PBYTE)thunkIAT - delta + (DWORD)pfile);
  224.     
  225.         string = "  Ordn  Name";
  226.         
  227.         while ( 1 ) // Loop forever (or until we break out)
  228.         {
  229.             if ( thunk->u1.AddressOfData == 0 )
  230.                 break;
  231.             if ( thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG )
  232.             {
  233.                 wsprintf(line,"  %4u", IMAGE_ORDINAL(thunk->u1.Ordinal) );
  234.             }
  235.             else
  236.             {
  237.                 pOrdinalName = thunk->u1.AddressOfData;
  238.                 pOrdinalName = (PIMAGE_IMPORT_BY_NAME)
  239.                                 ((PBYTE)pOrdinalName - delta + (DWORD)pfile);
  240.                     
  241.                 wsprintf(line,"  %4u  %s", pOrdinalName->Hint, pOrdinalName->Name);
  242.             }
  243.             
  244.             
  245.             wsprintf(line2, " (IAT: %08X)", thunkIAT->u1.Function );
  246. strcat(line,line2);
  247. AttaLine(line);
  248.            
  249.             thunk++;            // Advance to next thunk
  250.             thunkIAT++;         // advance to next thunk
  251.         }
  252.         importDesc++;   // advance to next IMAGE_IMPORT_DESCRIPTOR
  253. string = ":  ";
  254. m_DisplayData.Add(string);
  255.         
  256.     }
  257.     
  258. string = ":  ";
  259. m_DisplayData.Add(string);
  260. return m_DisplayData.GetSize(); 
  261. }
  262. void CImportView::AttaLine(CHAR* pLine)
  263. {
  264. CString string;
  265. CHAR *sLine;
  266. // set len back to 1 after testing
  267. sLine = string.GetBuffer(strlen(pLine)+1);
  268. strcpy(sLine,pLine);
  269. string.ReleaseBuffer();
  270. m_DisplayData.Add(string);
  271.    
  272. }
  273. void CImportView::PrintPageHeader (CDC* pDC, UINT nPageNumber)
  274. {
  275. CWinpeDoc* pDoc = GetDocument();
  276. ASSERT_VALID(pDoc);
  277. CString strHeader = GetDocument ()->GetPathName ();
  278.     if (strHeader.GetLength () > 68)
  279.         strHeader = GetDocument ()->GetTitle ();
  280.     CString strPageNumber;
  281.     strPageNumber.Format ("Page %d", nPageNumber);
  282.     UINT nSpaces = 81 - strPageNumber.GetLength () -
  283.         strHeader.GetLength ();
  284.     for (UINT i=0; i<nSpaces; i++)
  285.         strHeader += ' ';
  286.     strHeader += strPageNumber;
  287.     INT y = m_cyPrinter * PRINTMARGIN;
  288.     CFont* pOldFont = pDC->SelectObject (pDoc->m_printerFont);
  289.     
  290. pDC->TextOut (0, -y, strHeader);
  291.     y += (m_cyPrinter * 3) / 2;
  292. pDC->MoveTo (0, -y);
  293.     pDC->LineTo (m_cxWidth, -y);
  294.     pDC->SelectObject (pOldFont);
  295. }
  296. void CImportView::PrintPage(CDC* pDC, UINT nPageNumber)
  297. {
  298. CWinpeDoc* pDoc = GetDocument();
  299. ASSERT_VALID(pDoc);
  300. if (m_nLinesTotal != 0) 
  301. {
  302.         INT nStart = (nPageNumber - 1) * m_nLinesPerPage;
  303.         INT nEnd = min (m_nLinesTotal - 1,
  304. nStart + m_nLinesPerPage - 1);
  305. nEnd = m_nLinesTotal - 1;
  306. //TRACE("End %dn",nEnd);
  307. //TRACE("Start %dn",nStart);
  308. //TRACE("pageno %dn",nPageNumber);
  309.         CString string;
  310.         CFont* pOldFont = pDC->SelectObject (pDoc->m_printerFont);
  311.         INT y;
  312.         for (INT i=nStart; i<=nEnd; i++)
  313. {
  314.             //FormatLine (i, string);
  315.             y = ((i - nStart) + PRINTMARGIN + 3) * m_cyPrinter;
  316.             pDC->TextOut (0, -y,m_DisplayData[i]);
  317. //TRACE("Data: %sn",m_DisplayData[i]);
  318.         }
  319.         pDC->SelectObject (pOldFont);
  320. //TRACE("y %dn",y);
  321.     }
  322. }
  323. void CImportView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) 
  324. {
  325. // TODO: Add your specialized code here and/or call the base class
  326. //CScrollView::OnPrepareDC(pDC, pInfo);
  327. CWinpeDoc* pDoc = GetDocument();
  328. ASSERT_VALID(pDoc);
  329. CScrollView::OnPrepareDC(pDC, pInfo);
  330. if (pInfo)
  331. {
  332. pDC->SetMapMode(MM_LOENGLISH);
  333. pDC->SelectObject(pDoc->m_printerFont);
  334. if (!pInfo->m_bPreview)
  335. pInfo->m_bContinuePrinting = m_keepprinting;
  336. }
  337. }
  338. void CImportView::OnPrint(CDC* pDC, CPrintInfo* pInfo) 
  339. {
  340. // TODO: Add your specialized code here and/or call the base class
  341. CSize size = pDC->GetTextExtent(m_DisplayData[0]);
  342. m_cyPrinter = size.cy;
  343. INT vert = pInfo->m_rectDraw.Height();
  344. vert = abs(vert);
  345. vert -= m_cyPrinter * (3 + (2 * PRINTMARGIN));
  346. m_nLinesPerPage = abs(vert) / size.cy - 1;
  347. int maxpage = m_nLinesTotal / m_nLinesPerPage;
  348. if (m_nLinesTotal % m_nLinesPerPage)
  349. maxpage++;
  350. pInfo->SetMaxPage(maxpage);
  351. m_cxWidth = pInfo->m_rectDraw.Width();
  352. //CScrollView::OnPrint(pDC, pInfo);
  353. PrintPageHeader (pDC, pInfo->m_nCurPage);
  354.     //PrintPage (pDC, pInfo->m_nCurPage);
  355. int i,x;
  356. INT marginlength = m_cyPrinter * (3 + (2 * PRINTMARGIN));
  357. for (i=0;i<m_nLinesPerPage;i++)
  358. {
  359. x = (pInfo->m_nCurPage -1) * m_nLinesPerPage + i;
  360. if (x >= m_nLinesTotal)
  361. {
  362. m_keepprinting = FALSE;
  363. break;
  364. }
  365. //pDC->TextOut (0, -i*(size.cy),m_DisplayData[x]);
  366. pDC->TextOut (0, (-i*(size.cy))-marginlength,
  367. m_DisplayData[x]);
  368. }
  369. }
  370. void CImportView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
  371. {
  372. // TODO: Add your specialized code here and/or call the base class
  373. CWinpeDoc* pDoc = GetDocument();
  374. ASSERT_VALID(pDoc);
  375. CClientDC dc(this);
  376. TEXTMETRIC tm;
  377. CFont* pOldFont = dc.SelectObject(pDoc->m_screenFont);
  378. dc.GetTextMetrics (&tm);
  379. m_cyScreen = tm.tmHeight + tm.tmExternalLeading;
  380. dc.SelectObject(pOldFont);
  381. //
  382. SetScrollSizes (MM_TEXT,
  383. CSize(0,m_nLinesTotal * m_cyScreen),
  384. CSize(0,m_cyScreen * 100),
  385. CSize (0,m_cyScreen));
  386. ScrollToPosition(CPoint (0,0));
  387. CRect rect;
  388. dc.GetClipBox(&rect);
  389. InvalidateRect(&rect);
  390. }