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

文件操作

开发平台:

Visual C++

  1. // winpeDoc.cpp : implementation of the CWinpeDoc class
  2. //
  3. #include "stdafx.h"
  4. #include "winpe.h"
  5. #include "winpeDoc.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CWinpeDoc
  13. IMPLEMENT_DYNCREATE(CWinpeDoc, CDocument)
  14. BEGIN_MESSAGE_MAP(CWinpeDoc, CDocument)
  15. //{{AFX_MSG_MAP(CWinpeDoc)
  16. ON_UPDATE_COMMAND_UI(ID_VIEWS_DEBUGDIR, OnUpdateViewsDebugdir)
  17. ON_UPDATE_COMMAND_UI(ID_VIEWS_DUMP, OnUpdateViewsDump)
  18. ON_UPDATE_COMMAND_UI(ID_VIEWS_EXPORTS, OnUpdateViewsExports)
  19. ON_UPDATE_COMMAND_UI(ID_VIEWS_HEADERS, OnUpdateViewsHeaders)
  20. ON_UPDATE_COMMAND_UI(ID_VIEWS_IMPORTS, OnUpdateViewsImports)
  21. ON_UPDATE_COMMAND_UI(ID_VIEWS_RESOURCES, OnUpdateViewsResources)
  22. ON_UPDATE_COMMAND_UI(ID_VIEWS_SECTNTBL, OnUpdateViewsSectntbl)
  23. //}}AFX_MSG_MAP
  24. END_MESSAGE_MAP()
  25. /////////////////////////////////////////////////////////////////////////////
  26. // CWinpeDoc construction/destruction
  27. CWinpeDoc::CWinpeDoc()
  28. {
  29. // TODO: add one-time construction code here
  30. m_nDocLength = 0;
  31. m_pFileData = 0;
  32. m_hFileMapping = 0;
  33. m_nFileType = 0;
  34. m_hFile = 0;
  35. m_printerFont = new CFont;
  36. m_screenFont = new CFont;
  37. CClientDC dc (AfxGetMainWnd());
  38. int nHeight = -((dc.GetDeviceCaps (LOGPIXELSY) * 10 ) / 72);
  39. m_screenFont->CreateFont(nHeight,
  40. 0,0,0,
  41. FW_NORMAL,
  42. 0,0,0,
  43. DEFAULT_CHARSET,
  44. OUT_CHARACTER_PRECIS,
  45. CLIP_CHARACTER_PRECIS,
  46. DEFAULT_QUALITY,
  47. DEFAULT_PITCH | FF_DONTCARE,
  48. "Courier New");
  49. nHeight = -((dc.GetDeviceCaps (LOGPIXELSY) * 12 ) / 72);
  50. m_printerFont->CreateFont (nHeight, 0, 0, 0, FW_NORMAL, 0, 0, 0,
  51.         DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS,
  52.         DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Courier New");
  53. TEXTMETRIC tm;
  54. CFont *pOldFont;
  55. pOldFont = dc.SelectObject(m_screenFont);
  56. dc.GetTextMetrics (&tm);
  57. m_cyScreen = tm.tmHeight + tm.tmExternalLeading;
  58. dc.SelectObject(pOldFont);
  59. //pOldFont = dc.SelectObject(&m_printerFont);
  60. //dc.GetTextMetrics (&tm);
  61. //m_cyPrinter = tm.tmHeight + tm.tmExternalLeading;
  62. //dc.SelectObject(pOldFont);
  63. }
  64. CWinpeDoc::~CWinpeDoc()
  65. {
  66. delete m_printerFont;
  67. delete m_screenFont;
  68. }
  69. BOOL CWinpeDoc::OnNewDocument()
  70. {
  71. if (!CDocument::OnNewDocument())
  72. return FALSE;
  73. // TODO: add reinitialization code here
  74. // (SDI documents will reuse this document)
  75. return TRUE;
  76. }
  77. /////////////////////////////////////////////////////////////////////////////
  78. // CWinpeDoc serialization
  79. void CWinpeDoc::Serialize(CArchive& ar)
  80. {
  81. if (ar.IsLoading())
  82. {
  83. // //CFile* pFile = ar.GetFile();
  84. // m_nDocLength = (UINT) pFile->GetLength();
  85. // try
  86. // {
  87. // m_pFileData = new BYTE[m_nDocLength];
  88. // }
  89. // catch (CMemoryException* e)
  90. // {
  91. // m_nDocLength = 0;
  92. // throw e;
  93. // }
  94. //
  95. // try
  96. // {
  97. // pFile->Read (m_pFileData,m_nDocLength);
  98. // }
  99. // catch (CFileException* e)
  100. // {
  101. // delete[] m_pFileData;
  102. // m_pFileData = NULL;
  103. // m_nDocLength = 0;
  104. // throw e;
  105. // }
  106. }
  107. else
  108. {
  109. // TODO: add storing code here
  110. }
  111. }
  112. /////////////////////////////////////////////////////////////////////////////
  113. // CWinpeDoc diagnostics
  114. #ifdef _DEBUG
  115. void CWinpeDoc::AssertValid() const
  116. {
  117. CDocument::AssertValid();
  118. }
  119. void CWinpeDoc::Dump(CDumpContext& dc) const
  120. {
  121. CDocument::Dump(dc);
  122. }
  123. #endif //_DEBUG
  124. /////////////////////////////////////////////////////////////////////////////
  125. // CWinpeDoc commands
  126. UINT CWinpeDoc::GetBytes(UINT nIndex,UINT nCount,PVOID pBuffer)
  127. {
  128. if (nIndex >= m_nDocLength)
  129. return 0;
  130. UINT nLength = nCount;
  131. if((nIndex + nCount) > m_nDocLength)
  132. nLength = m_nDocLength - nIndex;
  133. ::CopyMemory(pBuffer,m_pFileData + nIndex,nLength);
  134. return nLength;
  135. }
  136. UINT CWinpeDoc::GetDocumentLength()
  137. {
  138. return m_nDocLength;
  139. }
  140. void CWinpeDoc::DeleteContents() 
  141. {
  142. // TODO: Add your specialized code here and/or call the base class
  143. //if (m_pFileData != NULL)
  144. //{
  145. // delete[] m_pFileData;
  146. // m_pFileData = NULL;
  147. // m_nDocLength = 0;
  148. //}
  149. if (m_pFileData)
  150. {
  151. UnmapViewOfFile(m_pFileData);
  152. m_pFileData = NULL;
  153. }
  154. if (m_hFileMapping)
  155. {
  156. CloseHandle(m_hFileMapping);
  157. m_hFileMapping = NULL;
  158. }
  159. if (m_hFile)
  160. {
  161. if (m_hFile != INVALID_HANDLE_VALUE)
  162. {
  163. CloseHandle(m_hFile);
  164. m_nDocLength = 0;
  165. m_hFile = NULL;
  166. }
  167. }
  168. CWnd* mywnd = AfxGetMainWnd();
  169. if (mywnd) // after first time thru
  170. // dumpview always default view
  171. mywnd->SendMessage(WM_RESET_FRAMEVIEW,ID_VIEWS_DUMP,0);
  172. // must call base class
  173. CDocument::DeleteContents();
  174. }
  175. BOOL CWinpeDoc::OnOpenDocument(LPCTSTR lpszPathName) 
  176. {
  177. if (!CDocument::OnOpenDocument(lpszPathName))
  178. return FALSE;
  179. // TODO: Add your specialized creation code here
  180. m_pFileData = 0;
  181. m_hFileMapping = 0;
  182. m_nFileType = 0;
  183. m_nDocLength = 0;
  184. m_hFile = CreateFile(lpszPathName,GENERIC_READ,
  185. FILE_SHARE_READ,NULL,
  186. OPEN_EXISTING,
  187. FILE_ATTRIBUTE_NORMAL,
  188. (HANDLE)0);
  189. if (m_hFile == INVALID_HANDLE_VALUE)
  190. return FALSE;
  191. m_hFileMapping = CreateFileMapping(m_hFile,
  192. NULL,
  193. PAGE_READONLY,
  194. 0,0,NULL);
  195. if (m_hFileMapping == 0)
  196. return FALSE;
  197. m_pFileData = (LPBYTE)MapViewOfFile(m_hFileMapping,
  198. FILE_MAP_READ,
  199. 0,0,0);
  200. if (m_pFileData == 0)
  201. return FALSE;
  202. m_nDocLength = GetFileSize (m_hFile, NULL);
  203. m_nFileType = 0;
  204. CHAR *hit;
  205. hit = strstr(lpszPathName,".exe");
  206. if (hit != NULL)
  207. m_nFileType = FILETYPE_EXE;
  208. hit = strstr(lpszPathName,".EXE");
  209. if (hit != NULL)
  210. m_nFileType = FILETYPE_EXE;
  211. hit = strstr(lpszPathName,".dll");
  212. if (hit != NULL)
  213. m_nFileType = FILETYPE_DLL;
  214. hit = strstr(lpszPathName,".DLL");
  215. if (hit != NULL)
  216. m_nFileType = FILETYPE_DLL;
  217. m_Dump_Enabled = TRUE; // dump anything
  218. if (m_nFileType == 0)
  219. {
  220. m_DebugDir_Enabled = FALSE;
  221. m_Exports_Enabled = FALSE;
  222. m_Headers_Enabled = FALSE;
  223. m_Imports_Enabled = FALSE;
  224. m_Resources_Enabled = FALSE;
  225. m_Sections_Enabled = FALSE;
  226. }
  227. else
  228. {
  229. m_DebugDir_Enabled = TRUE;
  230. m_Exports_Enabled = TRUE;
  231. m_Headers_Enabled = TRUE;
  232. m_Imports_Enabled = TRUE;
  233. m_Resources_Enabled = TRUE;
  234. m_Sections_Enabled = TRUE;
  235. }
  236. return TRUE;
  237. }
  238. BYTE* CWinpeDoc::GetDocumentDataP()
  239. {
  240. return m_pFileData;
  241. }
  242. INT CWinpeDoc::GetOpenFileType()
  243. {
  244. return m_nFileType;
  245. }
  246. void CWinpeDoc::OnUpdateViewsDebugdir(CCmdUI* pCmdUI) 
  247. {
  248. // TODO: Add your command update UI handler code here
  249. pCmdUI->Enable(m_DebugDir_Enabled);
  250. pCmdUI->SetCheck(m_DebugDir_Checked);
  251. }
  252. void CWinpeDoc::OnUpdateViewsDump(CCmdUI* pCmdUI) 
  253. {
  254. // TODO: Add your command update UI handler code here
  255. pCmdUI->Enable(m_Dump_Enabled);
  256. pCmdUI->SetCheck(m_Dump_Checked);
  257. }
  258. void CWinpeDoc::OnUpdateViewsExports(CCmdUI* pCmdUI) 
  259. {
  260. // TODO: Add your command update UI handler code here
  261. pCmdUI->Enable(m_Exports_Enabled);
  262. pCmdUI->SetCheck(m_Exports_Checked);
  263. }
  264. void CWinpeDoc::OnUpdateViewsHeaders(CCmdUI* pCmdUI) 
  265. {
  266. // TODO: Add your command update UI handler code here
  267. pCmdUI->Enable(m_Headers_Enabled);
  268. pCmdUI->SetCheck(m_Headers_Checked);
  269. }
  270. void CWinpeDoc::OnUpdateViewsImports(CCmdUI* pCmdUI) 
  271. {
  272. // TODO: Add your command update UI handler code here
  273. pCmdUI->Enable(m_Imports_Enabled);
  274. pCmdUI->SetCheck(m_Imports_Checked);
  275. }
  276. void CWinpeDoc::OnUpdateViewsResources(CCmdUI* pCmdUI) 
  277. {
  278. // TODO: Add your command update UI handler code here
  279. pCmdUI->Enable(m_Resources_Enabled);
  280. pCmdUI->SetCheck(m_Resources_Checked);
  281. }
  282. void CWinpeDoc::OnUpdateViewsSectntbl(CCmdUI* pCmdUI) 
  283. {
  284. // TODO: Add your command update UI handler code here
  285. pCmdUI->Enable(m_Sections_Enabled);
  286. pCmdUI->SetCheck(m_Sections_Checked);
  287. }
  288. void CWinpeDoc::TurnChecksOff()
  289. {
  290. m_Dump_Checked = FALSE;
  291. m_DebugDir_Checked = FALSE;
  292. m_Imports_Checked = FALSE;
  293. m_Exports_Checked = FALSE;
  294. m_Resources_Checked = FALSE;
  295. m_Headers_Checked = FALSE;
  296. m_Sections_Checked = FALSE;
  297. }
  298. PIMAGE_SECTION_HEADER CWinpeDoc::GetEnclosingSectionHeader(DWORD rva,
  299.  PIMAGE_NT_HEADERS pNTHeader)
  300. {
  301. PIMAGE_SECTION_HEADER section = IMAGE_FIRST_SECTION(pNTHeader);
  302.     unsigned i;
  303.     
  304.     for ( i=0; i < pNTHeader->FileHeader.NumberOfSections; i++, section++ )
  305.     {
  306.         // Is the RVA within this section?
  307.         if ( (rva >= section->VirtualAddress) && 
  308.              (rva < (section->VirtualAddress + section->Misc.VirtualSize)))
  309.             return section;
  310.     }
  311.     
  312.     return 0;
  313. }
  314. void CWinpeDoc::SetDocPrtFont(LPLOGFONT lp)
  315. {
  316. delete m_printerFont;
  317. m_printerFont = new CFont;
  318. //m_printerFont.DeleteObject();
  319. m_printerFont->CreateFontIndirect(lp);
  320. }
  321. void CWinpeDoc::SetDocScrnFont(LPLOGFONT lp)
  322. {
  323. delete m_screenFont;
  324. m_screenFont = new CFont;
  325. //m_screenFont.DeleteObject();
  326. m_screenFont->CreateFontIndirect(lp);
  327. }