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

文件操作

开发平台:

Visual C++

  1. // winpeView.cpp : implementation of the CDebugDirView class
  2. //
  3. #include "stdafx.h"
  4. #include "winpe.h"
  5. //#include "pefile.h"
  6. #include "winpeDoc.h"
  7. #include "DebugDirView.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CDebugDirView
  15. IMPLEMENT_DYNCREATE(CDebugDirView, CScrollView)
  16. BEGIN_MESSAGE_MAP(CDebugDirView, CScrollView)
  17. //{{AFX_MSG_MAP(CDebugDirView)
  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. // CDebugDirView construction/destruction
  27. CDebugDirView::CDebugDirView()
  28. {
  29. // TODO: add construction code here
  30. }
  31. CDebugDirView::~CDebugDirView()
  32. {
  33. }
  34. BOOL CDebugDirView::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. // CDebugDirView drawing
  42. void CDebugDirView::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. // CDebugDirView printing
  65. BOOL CDebugDirView::OnPreparePrinting(CPrintInfo* pInfo)
  66. {
  67. // default preparation
  68. return DoPreparePrinting(pInfo);
  69. }
  70. void CDebugDirView::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 CDebugDirView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  103. {
  104. // TODO: add cleanup after printing
  105. }
  106. /////////////////////////////////////////////////////////////////////////////
  107. // CDebugDirView diagnostics
  108. #ifdef _DEBUG
  109. void CDebugDirView::AssertValid() const
  110. {
  111. CScrollView::AssertValid();
  112. }
  113. void CDebugDirView::Dump(CDumpContext& dc) const
  114. {
  115. CScrollView::Dump(dc);
  116. }
  117. CWinpeDoc* CDebugDirView::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. // CDebugDirView message handlers
  125. int CDebugDirView::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 CDebugDirView::OnInitialUpdate() 
  133. {
  134. CWinpeDoc* pDoc = GetDocument();
  135. ASSERT_VALID(pDoc);
  136. pDoc->TurnChecksOff();
  137. pDoc->m_DebugDir_Checked = TRUE;
  138. DWORD nDocLength = pDoc->GetDocumentLength();
  139. if (nDocLength == 0)
  140. {
  141. m_nLinesTotal = 0;
  142. }
  143. else
  144. {
  145. m_nLinesTotal = GetDebugDir();
  146. m_nLinesTotal = GetSymbols();
  147. }
  148. CClientDC dc(this);
  149. TEXTMETRIC tm;
  150. CFont* pOldFont = dc.SelectObject(pDoc->m_screenFont);
  151. dc.GetTextMetrics (&tm);
  152. m_cyScreen = tm.tmHeight + tm.tmExternalLeading;
  153. dc.SelectObject(pOldFont);
  154. SetScrollSizes (MM_TEXT,
  155. CSize(0,m_nLinesTotal * m_cyScreen), //tot size
  156. CSize(0,m_cyScreen * 10),  //screen size 
  157. CSize (0,m_cyScreen)); //line size
  158. ScrollToPosition(CPoint (0,0));
  159. CScrollView::OnInitialUpdate();
  160. // TODO: Add your specialized code here and/or call the base class
  161. }
  162. INT CDebugDirView::GetSymbols()
  163. {
  164. PIMAGE_NT_HEADERS pNTHeader;
  165. PIMAGE_DOS_HEADER pDosHdr;
  166. DWORD base;
  167. BYTE * pfile;
  168. CString string;
  169. CString stringapnd;
  170. CWinpeDoc* pDoc;
  171. pDoc = GetDocument();
  172. pfile = pDoc->GetDocumentDataP();
  173. pDosHdr = (PIMAGE_DOS_HEADER)pfile;
  174. base = (DWORD)pfile;
  175. pNTHeader = MakePtr(PIMAGE_NT_HEADERS,
  176. pfile,pDosHdr->e_lfanew);
  177. if (pNTHeader->FileHeader.PointerToSymbolTable == 0)
  178. {
  179. string = "No COFF Symbol Table:";
  180. m_DisplayData.Add(string);
  181. return m_DisplayData.GetSize(); 
  182. }
  183.     PCOFFSymbolTable = MakePtr(PIMAGE_SYMBOL, base,
  184.                         pNTHeader->FileHeader.PointerToSymbolTable);
  185.     COFFSymbolCount = pNTHeader->FileHeader.NumberOfSymbols;
  186.     
  187.     DumpCOFFHeader();
  188.    
  189.     
  190.     
  191.     DumpLineNumbers( MakePtr(PIMAGE_LINENUMBER, PCOFFDebugInfo,
  192.                         PCOFFDebugInfo->LvaToFirstLinenumber),
  193.                         PCOFFDebugInfo->NumberOfLinenumbers);
  194.    
  195.     
  196.     
  197.     if ( pNTHeader->FileHeader.NumberOfSymbols) 
  198.       
  199.     {
  200.         DumpSymbolTable(PCOFFSymbolTable, COFFSymbolCount);
  201.        
  202.     }
  203.     string = "  ";
  204. m_DisplayData.Add(string);
  205. return m_DisplayData.GetSize(); 
  206. }
  207. INT CDebugDirView::GetDebugDir()
  208. {
  209. PIMAGE_DEBUG_DIRECTORY debugDir;
  210. PIMAGE_SECTION_HEADER header;
  211. PIMAGE_NT_HEADERS pNTHeader;
  212. PIMAGE_DOS_HEADER pDosHdr;
  213. DWORD offsetInto_rdata;
  214. DWORD va_debug_dir;
  215. DWORD size;
  216. //BOOL found;
  217. DWORD cDebugFormats;
  218. LPTSTR szDebugFormat;
  219.     UINT i;
  220. BYTE * pfile;
  221. CString string;
  222. CHAR line[128];
  223. CHAR *pLine;
  224. CWinpeDoc* pDoc;
  225. char *SzDebugFormats[] =
  226. {
  227. "UNKNOWN/BORLAND",
  228. "COFF",
  229. "CODEVIEW",
  230. "FPO",
  231. "MISC",
  232. "EXCEPTION",
  233. "FIXUP"
  234. };
  235. pDoc = GetDocument();
  236. pfile = pDoc->GetDocumentDataP();
  237. pDosHdr = (PIMAGE_DOS_HEADER)pfile;
  238. pNTHeader = MakePtr(PIMAGE_NT_HEADERS,pfile,pDosHdr->e_lfanew);
  239. // This line was so long that we had to break it up
  240.     va_debug_dir = pNTHeader->OptionalHeader.
  241.                         DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].
  242.                         VirtualAddress;
  243.     if ( va_debug_dir == 0 )  // no debug directory send msg.
  244. {
  245. string = "No Debug Directory";
  246. m_DisplayData.Add(string);
  247.         return 1;
  248. }
  249.     // If we found a .debug section, and the debug directory is at the
  250.     // beginning of this section, it looks like a Borland file
  251.     header = GetSectionHeader(".debug",pNTHeader);
  252.     if ( header && (header->VirtualAddress == va_debug_dir) )
  253.     {
  254.         debugDir = (PIMAGE_DEBUG_DIRECTORY)(header->PointerToRawData+pfile);
  255.         size = pNTHeader->OptionalHeader.
  256.                 DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].Size *
  257.                 sizeof(IMAGE_DEBUG_DIRECTORY);
  258.     }
  259.     else    // Look for microsoft debug directory in the .rdata section
  260.     {
  261.         header = GetSectionHeader(".rdata",pNTHeader);
  262.         if ( !header )
  263. { // no debug info send msg
  264. string = "No Debug Directory";
  265. m_DisplayData.Add(string);
  266. return 1;
  267.             
  268. }
  269.         size = pNTHeader->OptionalHeader.
  270.                         DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].Size;
  271.     
  272.         offsetInto_rdata = va_debug_dir - header->VirtualAddress;
  273.         debugDir = MakePtr(PIMAGE_DEBUG_DIRECTORY,pfile,
  274.                    header->PointerToRawData + offsetInto_rdata);
  275.     }
  276.     
  277. //
  278. // Dump the debug directory array
  279. //
  280.     cDebugFormats = size / sizeof(IMAGE_DEBUG_DIRECTORY);
  281.     
  282.     
  283.     if ( cDebugFormats == 0 )
  284. {
  285. string = "No Debug Directory";
  286. m_DisplayData.Add(string);
  287. return 1;
  288.      
  289. }
  290.     
  291. string = "Debug Formats";
  292. m_DisplayData.Add(string);
  293.     string = 
  294.     "  Type            Size     Address  FilePtr  Charactr TimeData Version";
  295. m_DisplayData.Add(string);
  296. string = 
  297.     "  --------------- -------- -------- -------- -------- -------- --------";
  298.     m_DisplayData.Add(string);
  299.     
  300.     for ( i=0; i < cDebugFormats; i++ )
  301.     {
  302.         szDebugFormat = (debugDir->Type <= 6)
  303.                         ? SzDebugFormats[debugDir->Type] : "???";
  304.         wsprintf(line,"  %-15s %08X %08X %08X %08X %08X %u.%02u",
  305.             szDebugFormat, debugDir->SizeOfData, debugDir->AddressOfRawData,
  306.             debugDir->PointerToRawData, debugDir->Characteristics,
  307.             debugDir->TimeDateStamp, debugDir->MajorVersion,
  308.             debugDir->MinorVersion);
  309. pLine = string.GetBuffer(strlen(line)+1);
  310. strcpy(pLine,line);
  311. string.ReleaseBuffer();
  312. m_DisplayData.Add(string);
  313. //
  314. // set us up for symbol dump.
  315. //
  316. if (debugDir->Type == IMAGE_DEBUG_TYPE_COFF)
  317. {
  318. PCOFFDebugInfo = (PIMAGE_COFF_SYMBOLS_HEADER)
  319. ((DWORD)pfile + debugDir->PointerToRawData);
  320. }
  321.         debugDir++;
  322.     }
  323. string = "  ";
  324. m_DisplayData.Add(string);
  325.         
  326.     
  327.     
  328.     return m_DisplayData.GetSize(); 
  329. }
  330. void CDebugDirView::DumpCOFFHeader()
  331. {
  332. CString string;
  333. CHAR *pLine;
  334. CHAR line[128];
  335. string = "COFF Debug Info Header:";
  336.     wsprintf(line,"  NumberOfSymbols:      %08X", PCOFFDebugInfo->NumberOfSymbols);
  337. pLine = string.GetBuffer(strlen(line)+1);
  338. strcpy(pLine,line);
  339. string.ReleaseBuffer();
  340. m_DisplayData.Add(string);
  341.     wsprintf(line,"  LvaToFirstSymbol:     %08X", PCOFFDebugInfo->LvaToFirstSymbol);
  342. pLine = string.GetBuffer(strlen(line)+1);
  343. strcpy(pLine,line);
  344. string.ReleaseBuffer();
  345. m_DisplayData.Add(string);
  346.     wsprintf(line,"  NumberOfLinenumbers:  %08X", PCOFFDebugInfo->NumberOfLinenumbers);
  347. pLine = string.GetBuffer(strlen(line)+1);
  348. strcpy(pLine,line);
  349. string.ReleaseBuffer();
  350. m_DisplayData.Add(string);
  351.     wsprintf(line,"  LvaToFirstLinenumber: %08X", PCOFFDebugInfo->LvaToFirstLinenumber);
  352. pLine = string.GetBuffer(strlen(line)+1);
  353. strcpy(pLine,line);
  354. string.ReleaseBuffer();
  355. m_DisplayData.Add(string);
  356.     wsprintf(line,"  RvaToFirstByteOfCode: %08X", PCOFFDebugInfo->RvaToFirstByteOfCode);
  357. pLine = string.GetBuffer(strlen(line)+1);
  358. strcpy(pLine,line);
  359. string.ReleaseBuffer();
  360. m_DisplayData.Add(string);
  361.     wsprintf(line,"  RvaToLastByteOfCode:  %08X", PCOFFDebugInfo->RvaToLastByteOfCode);
  362. pLine = string.GetBuffer(strlen(line)+1);
  363. strcpy(pLine,line);
  364. string.ReleaseBuffer();
  365. m_DisplayData.Add(string);
  366.     wsprintf(line,"  RvaToFirstByteOfData: %08X", PCOFFDebugInfo->RvaToFirstByteOfData);
  367. pLine = string.GetBuffer(strlen(line)+1);
  368. strcpy(pLine,line);
  369. string.ReleaseBuffer();
  370. m_DisplayData.Add(string);
  371.     wsprintf(line,"  RvaToLastByteOfData:  %08X", PCOFFDebugInfo->RvaToLastByteOfData);
  372. pLine = string.GetBuffer(strlen(line)+1);
  373. strcpy(pLine,line);
  374. string.ReleaseBuffer();
  375. m_DisplayData.Add(string);
  376. return;
  377. }
  378. void CDebugDirView::DumpLineNumbers(PIMAGE_LINENUMBER pln,DWORD count)
  379. {
  380. char buffer[64];
  381.     DWORD i;
  382. CString string;
  383. CHAR *pLine;
  384. CHAR line[128];
  385.     
  386.     string = "Line Numbers";
  387. m_DisplayData.Add(string);
  388.     
  389.     for (i=0; i < count; i++)
  390.     {
  391.         if ( pln->Linenumber == 0 ) // A symbol table index
  392.         {
  393.             buffer[0] = 0;
  394.             LookupSymbolName(pln->Type.SymbolTableIndex, buffer,
  395.                             sizeof(buffer));
  396.             wsprintf(line,"SymIndex: %X (%s)", pln->Type.SymbolTableIndex,
  397.                                              buffer);
  398. pLine = string.GetBuffer(strlen(line)+1);
  399. strcpy(pLine,line);
  400. string.ReleaseBuffer();
  401. m_DisplayData.Add(string);
  402.         }
  403.         else        // A regular line number
  404. {
  405.             wsprintf(line," Addr: %05X  Line: %04X",
  406.                 pln->Type.VirtualAddress, pln->Linenumber);
  407. pLine = string.GetBuffer(strlen(line)+1);
  408. strcpy(pLine,line);
  409. string.ReleaseBuffer();
  410. m_DisplayData.Add(string);
  411. }
  412.         pln++;
  413.     }
  414. }
  415. BOOL CDebugDirView::LookupSymbolName(DWORD index,LPTSTR buffer,UINT length)
  416. {
  417. LPTSTR stringTable;
  418.     if ( index >= COFFSymbolCount )
  419.         return FALSE;
  420.     
  421.     if ( PCOFFSymbolTable == 0 )
  422.         return FALSE;
  423.     
  424.     if ( PCOFFSymbolTable[index].N.Name.Short != 0 )
  425.     {
  426.         strncpy(buffer, (LPCTSTR)PCOFFSymbolTable[index].N.ShortName, min(8,length));
  427.         buffer[8] = 0;
  428.     }
  429.     else
  430.     {
  431.         stringTable = (LPTSTR)&PCOFFSymbolTable[COFFSymbolCount]; 
  432.         strncpy(buffer,
  433.                 stringTable + PCOFFSymbolTable[index].N.Name.Long, length);
  434.         buffer[length-1] = 0;
  435.     }
  436.     
  437.     return TRUE;
  438. }
  439. void CDebugDirView::DumpSymbolTable(PIMAGE_SYMBOL pSymbolTable,UINT cSymbols)
  440. {
  441. unsigned i;
  442.     LPTSTR stringTable;
  443.     char sectionName[10];
  444. CString string;
  445. CHAR *pLine;
  446. CHAR line[128];
  447.     
  448.     wsprintf(line,"Symbol Table - %X entries  (* = auxillary symbol)", cSymbols);
  449. pLine = string.GetBuffer(strlen(line)+1);
  450. strcpy(pLine,line);
  451. string.ReleaseBuffer();
  452. m_DisplayData.Add(string);
  453.     wsprintf(line,"%s",
  454.     "Indx Name                 Value    Section    cAux  Type    Storage");
  455. pLine = string.GetBuffer(strlen(line)+1);
  456. strcpy(pLine,line);
  457. string.ReleaseBuffer();
  458. m_DisplayData.Add(string);
  459. wsprintf(line,"%s",
  460.     "---- -------------------- -------- ---------- ----- ------- --------");
  461. pLine = string.GetBuffer(strlen(line)+1);
  462. strcpy(pLine,line);
  463. string.ReleaseBuffer();
  464. m_DisplayData.Add(string);
  465.     // The string table apparently starts right after the symbol table
  466.     stringTable = (LPTSTR)&pSymbolTable[cSymbols]; 
  467.         
  468.     for ( i=0; i < cSymbols; i++ )
  469.     {
  470.         wsprintf(line,"%04X ", i);
  471. pLine = string.GetBuffer(strlen(line)+1);
  472. strcpy(pLine,line);
  473. string.ReleaseBuffer();
  474. m_DisplayData.Add(string);
  475.         
  476.         if ( pSymbolTable->N.Name.Short != 0 )
  477. {
  478.             wsprintf(line,"%-20.8s", pSymbolTable->N.ShortName);
  479. }
  480.         else
  481. {
  482.             wsprintf(line,"%-20s", stringTable + pSymbolTable->N.Name.Long);
  483. }
  484.         pLine = string.GetBuffer(strlen(line)+1);
  485. strcpy(pLine,line);
  486. string.ReleaseBuffer();
  487. m_DisplayData.Add(string);
  488.         wsprintf(line," %08X", pSymbolTable->Value);
  489. pLine = string.GetBuffer(strlen(line)+1);
  490. strcpy(pLine,line);
  491. string.ReleaseBuffer();
  492. m_DisplayData.Add(string);
  493.     
  494.         GetSectionName(pSymbolTable->SectionNumber, sectionName,
  495.                         sizeof(sectionName));
  496.         wsprintf(line," sect:%s aux:%X type:%02X st:%s",
  497.                 sectionName,
  498.                 pSymbolTable->NumberOfAuxSymbols,
  499.                 pSymbolTable->Type,
  500.                 GetSZStorageClass(pSymbolTable->StorageClass) );
  501.         pLine = string.GetBuffer(strlen(line)+1);
  502. strcpy(pLine,line);
  503. string.ReleaseBuffer();
  504. m_DisplayData.Add(string);
  505.         if ( pSymbolTable->NumberOfAuxSymbols )
  506.             DumpAuxSymbols(pSymbolTable);
  507.         // Take into account any aux symbols
  508.         i += pSymbolTable->NumberOfAuxSymbols;
  509.         pSymbolTable += pSymbolTable->NumberOfAuxSymbols;
  510.         pSymbolTable++;
  511.     }
  512. }
  513. void CDebugDirView::GetSectionName(WORD section,LPTSTR buffer,UINT cbBuffer)
  514. {
  515. char tempbuffer[10];
  516.     
  517.     switch ( (SHORT)section )
  518.     {
  519.         case IMAGE_SYM_UNDEFINED: strcpy(tempbuffer, "UNDEF"); break;
  520.         case IMAGE_SYM_ABSOLUTE:  strcpy(tempbuffer, "ABS  "); break;
  521.         case IMAGE_SYM_DEBUG:     strcpy(tempbuffer, "DEBUG"); break;
  522.         default: sprintf(tempbuffer, "%-5X", section);
  523.     }
  524.     
  525.     strncpy(buffer, tempbuffer, cbBuffer-1);
  526. }
  527. LPTSTR CDebugDirView::GetSZStorageClass(BYTE storageClass)
  528. {
  529. // The names of the first group of possible symbol table storage classes
  530. char * SzStorageClass1[] = {
  531. "NULL","AUTOMATIC","EXTERNAL","STATIC","REGISTER","EXTERNAL_DEF","LABEL",
  532. "UNDEFINED_LABEL","MEMBER_OF_STRUCT","ARGUMENT","STRUCT_TAG",
  533. "MEMBER_OF_UNION","UNION_TAG","TYPE_DEFINITION","UNDEFINED_STATIC",
  534. "ENUM_TAG","MEMBER_OF_ENUM","REGISTER_PARAM","BIT_FIELD"
  535. };
  536. // The names of the second group of possible symbol table storage classes
  537. char * SzStorageClass2[] = {
  538. "BLOCK","FUNCTION","END_OF_STRUCT","FILE","SECTION","WEAK_EXTERNAL"
  539. };
  540. if ( storageClass <= IMAGE_SYM_CLASS_BIT_FIELD )
  541.         return SzStorageClass1[storageClass];
  542.     else if ( (storageClass >= IMAGE_SYM_CLASS_BLOCK)
  543.               && (storageClass <= IMAGE_SYM_CLASS_WEAK_EXTERNAL) )
  544.         return SzStorageClass2[storageClass-IMAGE_SYM_CLASS_BLOCK];
  545.     else
  546.         return "???";
  547. }
  548. void CDebugDirView::DumpAuxSymbols(PIMAGE_SYMBOL pSymbolTable)
  549. {
  550. CString string;
  551. CHAR *pLine;
  552. CHAR line[128];
  553. PIMAGE_AUX_SYMBOL auxSym;
  554.     
  555.     auxSym = (PIMAGE_AUX_SYMBOL)(pSymbolTable+1);
  556.     
  557.     if ( pSymbolTable->StorageClass == IMAGE_SYM_CLASS_FILE )
  558.         wsprintf(line,"     * %s", auxSym);
  559.     else 
  560. if ( (pSymbolTable->StorageClass == IMAGE_SYM_CLASS_EXTERNAL) )
  561. {
  562. if ( (pSymbolTable->Type & 0xF0) == (IMAGE_SYM_DTYPE_FUNCTION << 4))
  563. {   
  564. wsprintf(line,"     * tag: %04X  size: %04X  Line #'s: %08X  next fn: %04X",
  565. auxSym->Sym.TagIndex, auxSym->Sym.Misc.TotalSize,
  566. auxSym->Sym.FcnAry.Function.PointerToLinenumber,
  567. auxSym->Sym.FcnAry.Function.PointerToNextFunction);
  568. }
  569. }
  570.     else
  571. if ( (pSymbolTable->StorageClass == IMAGE_SYM_CLASS_STATIC) )
  572. {
  573. wsprintf(line,
  574. "     * Section: %04X  Len: %05X  Relocs: %04X  LineNums: %04X",
  575. auxSym->Section.Number, auxSym->Section.Length,
  576. auxSym->Section.NumberOfRelocations,
  577. auxSym->Section.NumberOfLinenumbers);
  578. }
  579. pLine = string.GetBuffer(strlen(line)+1);
  580. strcpy(pLine,line);
  581. string.ReleaseBuffer();
  582. m_DisplayData.Add(string);
  583. }
  584. PIMAGE_SECTION_HEADER CDebugDirView::GetSectionHeader(LPTSTR name,PIMAGE_NT_HEADERS pNTHeader)
  585. {
  586. PIMAGE_SECTION_HEADER section = IMAGE_FIRST_SECTION(pNTHeader);
  587.     unsigned i;
  588.     
  589.     for ( i=0; i < pNTHeader->FileHeader.NumberOfSections; i++, section++ )
  590.     {
  591.         if ( strnicmp((LPCTSTR)section->Name, name, IMAGE_SIZEOF_SHORT_NAME) == 0 )
  592.             return section;
  593.     }
  594.     
  595.     return 0;
  596. }
  597. void CDebugDirView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) 
  598. {
  599. // TODO: Add your specialized code here and/or call the base class
  600. CWinpeDoc* pDoc = GetDocument();
  601. ASSERT_VALID(pDoc);
  602. CScrollView::OnPrepareDC(pDC, pInfo);
  603. if (pInfo)
  604. {
  605. pDC->SetMapMode(MM_LOENGLISH);
  606. pDC->SelectObject(pDoc->m_printerFont);
  607. }
  608. }
  609. void CDebugDirView::OnPrint(CDC* pDC, CPrintInfo* pInfo) 
  610. {
  611. // TODO: Add your specialized code here and/or call the base class
  612. //CScrollView::OnPrint(pDC, pInfo);
  613. PrintPageHeader (pDC, pInfo->m_nCurPage);
  614.     PrintPage (pDC, pInfo->m_nCurPage);
  615. }
  616. void CDebugDirView::PrintPageHeader (CDC* pDC, UINT nPageNumber)
  617. {
  618. CWinpeDoc* pDoc = GetDocument();
  619. ASSERT_VALID(pDoc);
  620. CString strHeader = GetDocument ()->GetPathName ();
  621.     if (strHeader.GetLength () > 68)
  622.         strHeader = GetDocument ()->GetTitle ();
  623.     CString strPageNumber;
  624.     strPageNumber.Format ("Page %d", nPageNumber);
  625.     UINT nSpaces = 81 - strPageNumber.GetLength () -
  626.         strHeader.GetLength ();
  627.     for (UINT i=0; i<nSpaces; i++)
  628.         strHeader += ' ';
  629.     strHeader += strPageNumber;
  630.     INT y = m_cyPrinter * PRINTMARGIN;
  631.     CFont* pOldFont = pDC->SelectObject (pDoc->m_printerFont);
  632.     
  633. pDC->TextOut (0, -y, strHeader);
  634.     y += (m_cyPrinter * 3) / 2;
  635. pDC->MoveTo (0, -y);
  636.     pDC->LineTo (m_cxWidth, -y);
  637.     pDC->SelectObject (pOldFont);
  638. }
  639. void CDebugDirView::PrintPage(CDC* pDC, UINT nPageNumber)
  640. {
  641. CWinpeDoc* pDoc = GetDocument();
  642. ASSERT_VALID(pDoc);
  643. if (m_nLinesTotal != 0) {
  644.         INT nStart = (nPageNumber - 1) * m_nLinesPerPage;
  645.         INT nEnd = min (m_nLinesTotal - 1, nStart + m_nLinesPerPage - 1);
  646.         CString string;
  647.         CFont* pOldFont = pDC->SelectObject (pDoc->m_printerFont);
  648.         INT y;
  649.         for (INT i=nStart; i<=nEnd; i++) {
  650.             //FormatLine (i, string);
  651.             y = ((i - nStart) + PRINTMARGIN + 3) * m_cyPrinter;
  652.             pDC->TextOut (0, -y,m_DisplayData[i]);
  653.         }
  654.         pDC->SelectObject (pOldFont);
  655.     }
  656. }
  657. void CDebugDirView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
  658. {
  659. // TODO: Add your specialized code here and/or call the base class
  660. CWinpeDoc* pDoc = GetDocument();
  661. ASSERT_VALID(pDoc);
  662. CClientDC dc(this);
  663. TEXTMETRIC tm;
  664. CFont* pOldFont = dc.SelectObject(pDoc->m_screenFont);
  665. dc.GetTextMetrics (&tm);
  666. m_cyScreen = tm.tmHeight + tm.tmExternalLeading;
  667. dc.SelectObject(pOldFont);
  668. //
  669. SetScrollSizes (MM_TEXT,
  670. CSize(0,m_nLinesTotal * m_cyScreen),
  671. CSize(0,m_cyScreen * 100),
  672. CSize (0,m_cyScreen));
  673. ScrollToPosition(CPoint (0,0));
  674. CRect rect;
  675. dc.GetClipBox(&rect);
  676. InvalidateRect(&rect);
  677. }