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

文件操作

开发平台:

Visual C++

  1. // winpeView.cpp : implementation of the CResourceSView class
  2. //
  3. #include "stdafx.h"
  4. #include "winpe.h"
  5. //#include "pefile.h"
  6. #include "winpeDoc.h"
  7. #include "resourcesview.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CResourceSView
  15. IMPLEMENT_DYNCREATE(CResourceSView, CScrollView)
  16. BEGIN_MESSAGE_MAP(CResourceSView, CScrollView)
  17. //{{AFX_MSG_MAP(CResourceSView)
  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. // CResourceSView construction/destruction
  27. CResourceSView::CResourceSView()
  28. {
  29. // TODO: add construction code here
  30. }
  31. CResourceSView::~CResourceSView()
  32. {
  33. }
  34. BOOL CResourceSView::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. // CResourceSView drawing
  42. void CResourceSView::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. // CResourceSView printing
  65. BOOL CResourceSView::OnPreparePrinting(CPrintInfo* pInfo)
  66. {
  67. // default preparation
  68. return DoPreparePrinting(pInfo);
  69. }
  70. void CResourceSView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
  71. {
  72. // TODO: add extra initialization before printing
  73. CWinpeDoc* pDoc = GetDocument();
  74. ASSERT_VALID(pDoc);
  75. pDC->SetMapMode(MM_LOENGLISH);
  76.     CFont* pOldFont = pDC->SelectObject (pDoc->m_printerFont);
  77.     
  78.     CSize size = pDC->GetTextExtent ("---------1---------2---------" 
  79.         "3---------4---------5---------6---------7---------8-", 81);
  80.     pDC->SelectObject (pOldFont);
  81. //
  82. // Get height and width then convert to logical
  83. //
  84. CSize vsz; // vertres horzres
  85. vsz.cy = pDC->GetDeviceCaps(VERTRES);
  86. vsz.cx = pDC->GetDeviceCaps(HORZRES);
  87. pDC->DPtoLP(&vsz);
  88. m_cyPrinter = size.cy;
  89. m_cxOffset = (vsz.cx - size.cx) / 2;
  90.     m_cxWidth = size.cx;
  91. //
  92.     //
  93. //
  94.     m_nLinesPerPage = (vsz.cy -
  95.         (m_cyPrinter * (3 + (2 * PRINTMARGIN)))) / m_cyPrinter;
  96.     UINT nMaxPage = max (1, (m_nLinesTotal + (m_nLinesPerPage - 1)) /
  97.         m_nLinesPerPage);
  98. if (m_nLinesTotal + (m_nLinesPerPage - 1) % m_nLinesPerPage)
  99. nMaxPage++;
  100.     pInfo->SetMaxPage (nMaxPage);
  101. }
  102. void CResourceSView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  103. {
  104. // TODO: add cleanup after printing
  105. }
  106. /////////////////////////////////////////////////////////////////////////////
  107. // CResourceSView diagnostics
  108. #ifdef _DEBUG
  109. void CResourceSView::AssertValid() const
  110. {
  111. CScrollView::AssertValid();
  112. }
  113. void CResourceSView::Dump(CDumpContext& dc) const
  114. {
  115. CScrollView::Dump(dc);
  116. }
  117. CWinpeDoc* CResourceSView::GetDocument() // non-debug version is inline
  118. {
  119. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CWinpeDoc)));
  120. return (CWinpeDoc*)m_pDocument;
  121. }
  122. #endif //_DEBUG
  123. /////////////////////////////////////////////////////////////////////////////
  124. // CResourceSView message handlers
  125. int CResourceSView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  126. {
  127. if (CScrollView::OnCreate(lpCreateStruct) == -1)
  128. return -1;
  129. // TODO: Add your specialized creation code here
  130. return 0;
  131. }
  132. void CResourceSView::OnInitialUpdate() 
  133. {
  134. CWinpeDoc* pDoc = GetDocument();
  135. ASSERT_VALID(pDoc);
  136. pDoc->TurnChecksOff();
  137. pDoc->m_Resources_Checked = TRUE;
  138. DWORD nDocLength = pDoc->GetDocumentLength();
  139. if (nDocLength == 0)
  140. {
  141. m_nLinesTotal = 0;
  142. }
  143. else
  144. {
  145. m_nLinesTotal = GetResourceSection();
  146. }
  147. SetScrollSizes (MM_TEXT,
  148. CSize(0,m_nLinesTotal * pDoc->m_cyScreen), //tot size
  149. CSize(0,pDoc->m_cyScreen * 10),  //screen size 
  150. CSize (0,pDoc->m_cyScreen)); //line size
  151. ScrollToPosition(CPoint (0,0));
  152. CScrollView::OnInitialUpdate();
  153. // TODO: Add your specialized code here and/or call the base class
  154. }
  155. INT CResourceSView::GetResourceSection()
  156. {
  157. PIMAGE_RESOURCE_DIRECTORY prd;
  158. PIMAGE_NT_HEADERS pNTHeader;
  159. PIMAGE_DOS_HEADER pDosHdr;
  160. BYTE * pfile;
  161. CString string;
  162. CWinpeDoc* pDoc;
  163. pDoc = GetDocument();
  164. pfile = pDoc->GetDocumentDataP();
  165. pDosHdr = (PIMAGE_DOS_HEADER)pfile;
  166. pNTHeader = MakePtr(PIMAGE_NT_HEADERS,pfile,pDosHdr->e_lfanew);
  167. //prd = (PIMAGE_RESOURCE_DIRECTORY)ImageDirectoryOffset(pfile,IMAGE_DIRECTORY_ENTRY_RESOURCE);
  168. prd = (PIMAGE_RESOURCE_DIRECTORY)GetSectionPtr(".rsrc",pNTHeader,(DWORD)pfile);
  169. if (prd == NULL)
  170. {
  171. string = "No Resources Found";
  172. m_DisplayData.Add(string);
  173. return 1;
  174. }
  175.         
  176.     DumpResourceDirectory(prd,(DWORD)prd,0,0);
  177.     
  178.     return m_DisplayData.GetSize(); 
  179. }
  180. void CResourceSView::DumpResourceDirectory(PIMAGE_RESOURCE_DIRECTORY resDir,
  181.    DWORD resourceBase,
  182.    DWORD level,
  183.    DWORD resourceType)
  184. {
  185. PIMAGE_RESOURCE_DIRECTORY_ENTRY resDirEntry;
  186.     char szType[64];
  187.     UINT i;
  188. CString string;
  189. CString indent;
  190. CHAR line[128];
  191. CHAR *pLine;
  192. indent.Empty();
  193.     // Spit out the spacing for the level indentation
  194.     for ( i=0; i < level; i++ )
  195. {
  196.         indent += "    ";
  197. }
  198. m_DisplayData.Add(string);
  199.     // Level 1 resources are the resource types
  200.     if ( level == 1 && !(resourceType & IMAGE_RESOURCE_NAME_IS_STRING) )
  201.     {
  202.         GetResourceTypeName( resourceType, szType, sizeof(szType) );
  203.     }
  204.     else    // Just print out the regular id or name
  205.     {
  206.         GetResourceNameFromId( resourceType, resourceBase, szType,
  207.                                sizeof(szType) );
  208.     }
  209.     
  210.     wsprintf(line,
  211.         "ResDir (%s) Named:%02X ID:%02X TimeDate:%08X Vers:%u.%02u Char:%X",
  212.         szType, resDir->NumberOfNamedEntries, resDir->NumberOfIdEntries,
  213.         resDir->TimeDateStamp, resDir->MajorVersion,
  214.         resDir->MinorVersion,resDir->Characteristics);
  215. pLine = string.GetBuffer(strlen(line)+1);
  216. strcpy(pLine,line);
  217. string.ReleaseBuffer();
  218. indent += string;
  219. m_DisplayData.Add(indent);
  220.     resDirEntry = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)(resDir+1);
  221.     
  222.     for ( i=0; i < resDir->NumberOfNamedEntries; i++, resDirEntry++ )
  223.         DumpResourceEntry(resDirEntry, resourceBase, level+1);
  224.     for ( i=0; i < resDir->NumberOfIdEntries; i++, resDirEntry++ )
  225.         DumpResourceEntry(resDirEntry, resourceBase, level+1);
  226. }
  227. void CResourceSView::GetResourceTypeName(DWORD type,
  228.  LPTSTR buffer,
  229.  UINT cBytes)
  230. {
  231. char *SzResourceTypes[] = 
  232. {
  233. "???_0", "CURSOR", "BITMAP", "ICON", "MENU", "DIALOG", "STRING", "FONTDIR",
  234. "FONT", "ACCELERATORS", "RCDATA", "MESSAGETABLE", "GROUP_CURSOR",
  235. "???_13", "GROUP_ICON", "???_15", "VERSION"
  236. };
  237. // Get an ASCII string representing a resource type
  238.     if ( type <= 16 )
  239.         strncpy(buffer, SzResourceTypes[type], cBytes);
  240.     else
  241.         sprintf(buffer, "%X", type);
  242. }
  243. void CResourceSView::GetResourceNameFromId(DWORD id,
  244.    DWORD resourceBase,
  245.    LPTSTR buffer,
  246.    UINT cBytes)
  247. {
  248. PIMAGE_RESOURCE_DIR_STRING_U prdsu;
  249.     // If it's a regular ID, just format it.
  250.     if ( !(id & IMAGE_RESOURCE_NAME_IS_STRING) )
  251.     {
  252.         sprintf(buffer, "%X", id);
  253.         return;
  254.     }
  255.     
  256.     id &= 0x7FFFFFFF;
  257.     prdsu = (PIMAGE_RESOURCE_DIR_STRING_U)(resourceBase + id);
  258.     // prdsu->Length is the number of unicode characters
  259.     WideCharToMultiByte(CP_ACP, 0, prdsu->NameString, prdsu->Length,
  260.                         buffer, cBytes, 0, 0);
  261.     buffer[ min(cBytes-1,prdsu->Length) ] = 0;  // Null terminate it!!!
  262. }
  263. void CResourceSView::DumpResourceEntry(PIMAGE_RESOURCE_DIRECTORY_ENTRY resDirEntry, DWORD resourceBase,DWORD level)
  264. {
  265. CHAR line[128];
  266. CHAR *pLine;
  267. CString string;
  268. CString indent;
  269. UINT i;
  270.     char nameBuffer[128];
  271.     PIMAGE_RESOURCE_DATA_ENTRY pResDataEntry;
  272.     
  273.     if ( resDirEntry->OffsetToData & IMAGE_RESOURCE_DATA_IS_DIRECTORY )
  274.     {
  275.         DumpResourceDirectory( (PIMAGE_RESOURCE_DIRECTORY)
  276.             ((resDirEntry->OffsetToData & 0x7FFFFFFF) + resourceBase),
  277.             resourceBase, level, resDirEntry->Name);
  278.         return;
  279.     }
  280.     // Spit out the spacing for the level indentation
  281. indent.Empty();
  282.     for ( i=0; i < level; i++ )
  283.         indent += "   ";
  284.     if ( resDirEntry->Name & IMAGE_RESOURCE_NAME_IS_STRING )
  285.     {
  286.         GetResourceNameFromId(resDirEntry->Name, resourceBase, nameBuffer,
  287.                               sizeof(nameBuffer));
  288.         wsprintf(line,"Name: %s  DataEntryOffs: %08X",
  289.             nameBuffer, resDirEntry->OffsetToData);
  290. pLine = string.GetBuffer(strlen(line)+1);
  291. strcpy(pLine,line);
  292. string.ReleaseBuffer();
  293. indent += string;
  294. m_DisplayData.Add(indent);
  295.     }
  296.     else
  297.     {
  298.         wsprintf(line,"ID: %08X  DataEntryOffs: %08X",
  299.                 resDirEntry->Name, resDirEntry->OffsetToData);
  300. pLine = string.GetBuffer(strlen(line)+1);
  301. strcpy(pLine,line);
  302. string.ReleaseBuffer();
  303. indent += string;
  304. m_DisplayData.Add(indent);
  305.     }
  306.     
  307.     // the resDirEntry->OffsetToData is a pointer to an
  308.     // IMAGE_RESOURCE_DATA_ENTRY.  Go dump out that information.  First,
  309.     // spit out the proper indentation
  310. indent.Empty();
  311.     for ( i=0; i < level; i++ )
  312.         indent += "    ";
  313.     
  314.     pResDataEntry = (PIMAGE_RESOURCE_DATA_ENTRY)
  315.                     (resourceBase + resDirEntry->OffsetToData);
  316.     wsprintf(line,"Offset: %05X  Size: %05X  CodePage: %X",
  317.             pResDataEntry->OffsetToData, pResDataEntry->Size,
  318.             pResDataEntry->CodePage);
  319. pLine = string.GetBuffer(strlen(line)+1);
  320. strcpy(pLine,line);
  321. string.ReleaseBuffer();
  322. indent += string;
  323. m_DisplayData.Add(indent);
  324. m_DisplayData.Add(" ");
  325. }
  326. LPVOID CResourceSView::GetSectionPtr(LPTSTR name,PIMAGE_NT_HEADERS pNTHeader,DWORD imageBase)
  327. {
  328. PIMAGE_SECTION_HEADER section = IMAGE_FIRST_SECTION(pNTHeader);
  329.     unsigned i;
  330.     
  331.     for ( i=0; i < pNTHeader->FileHeader.NumberOfSections; i++, section++ )
  332.     {
  333.         if ( strnicmp((LPCTSTR)section->Name, name, IMAGE_SIZEOF_SHORT_NAME) == 0 )
  334.             return (LPVOID)(section->PointerToRawData + imageBase);
  335.     }
  336.     
  337.     return 0;
  338. }
  339. void CResourceSView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) 
  340. {
  341. // TODO: Add your specialized code here and/or call the base class
  342. CWinpeDoc* pDoc = GetDocument();
  343. ASSERT_VALID(pDoc);
  344. CScrollView::OnPrepareDC(pDC, pInfo);
  345. if (pInfo)
  346. {
  347. pDC->SetMapMode(MM_LOENGLISH);
  348. pDC->SelectObject(pDoc->m_printerFont);
  349. }
  350. }
  351. void CResourceSView::OnPrint(CDC* pDC, CPrintInfo* pInfo) 
  352. {
  353. // TODO: Add your specialized code here and/or call the base class
  354. PrintPageHeader (pDC, pInfo->m_nCurPage);
  355.     PrintPage (pDC, pInfo->m_nCurPage);
  356. //CScrollView::OnPrint(pDC, pInfo);
  357. }
  358. void CResourceSView::PrintPageHeader(CDC* pDC, UINT nPageNumber)
  359. {
  360. CWinpeDoc* pDoc = GetDocument();
  361. ASSERT_VALID(pDoc);
  362. CString strHeader = GetDocument ()->GetPathName ();
  363.     if (strHeader.GetLength () > 68)
  364.         strHeader = GetDocument ()->GetTitle ();
  365.     CString strPageNumber;
  366.     strPageNumber.Format ("Page %d", nPageNumber);
  367.     UINT nSpaces = 81 - strPageNumber.GetLength () -
  368.         strHeader.GetLength ();
  369.     for (UINT i=0; i<nSpaces; i++)
  370.         strHeader += ' ';
  371.     strHeader += strPageNumber;
  372.     INT y = m_cyPrinter * PRINTMARGIN;
  373.     CFont* pOldFont = pDC->SelectObject (pDoc->m_printerFont);
  374.     //pDC->TextOut (m_cxOffset, -y, strHeader);
  375. pDC->TextOut (0, -y, strHeader);
  376.     y += (m_cyPrinter * 3) / 2;
  377.     //pDC->MoveTo (m_cxOffset, -y);
  378. pDC->MoveTo (0, -y);
  379.     pDC->LineTo (m_cxWidth, -y);
  380. //pDC->LineTo (0, -y);
  381.     pDC->SelectObject (pOldFont);
  382. }
  383. void CResourceSView::PrintPage(CDC* pDC, UINT nPageNumber)
  384. {
  385. CWinpeDoc* pDoc = GetDocument();
  386. ASSERT_VALID(pDoc);
  387. if (m_nLinesTotal != 0) {
  388.         INT nStart = (nPageNumber - 1) * m_nLinesPerPage;
  389.         INT nEnd = min (m_nLinesTotal - 1, nStart + m_nLinesPerPage - 1);
  390.         CString string;
  391.         CFont* pOldFont = pDC->SelectObject (pDoc->m_printerFont);
  392.         INT y;
  393.         for (INT i=nStart; i<=nEnd; i++) {
  394.             //FormatLine (i, string);
  395.             y = ((i - nStart) + PRINTMARGIN + 3) * m_cyPrinter;
  396.             //pDC->TextOut (m_cxOffset, -y, string);
  397. pDC->TextOut (0, -y, m_DisplayData[i]);
  398.         }
  399.         pDC->SelectObject (pOldFont);
  400.     }
  401. }
  402. void CResourceSView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
  403. {
  404. // TODO: Add your specialized code here and/or call the base class
  405. CWinpeDoc* pDoc = GetDocument();
  406. ASSERT_VALID(pDoc);
  407. CClientDC dc(this);
  408. TEXTMETRIC tm;
  409. CFont* pOldFont = dc.SelectObject(pDoc->m_screenFont);
  410. dc.GetTextMetrics (&tm);
  411. INT m_cyScreen = tm.tmHeight + tm.tmExternalLeading;
  412. dc.SelectObject(pOldFont);
  413. //
  414. SetScrollSizes (MM_TEXT,
  415. CSize(0,m_nLinesTotal * m_cyScreen),
  416. CSize(0,m_cyScreen * 100),
  417. CSize (0,m_cyScreen));
  418. ScrollToPosition(CPoint (0,0));
  419. CRect rect;
  420. dc.GetClipBox(&rect);
  421. InvalidateRect(&rect);
  422. }