Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(345)

Side by Side Diff: courgette/disassembler_win32_x86.cc

Issue 8344037: Start refactoring to reduce executable type knowledge. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Fix comment. Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « courgette/disassembler_win32_x86.h ('k') | courgette/encode_decode_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "courgette/disassembler.h" 5 #include "courgette/disassembler_win32_x86.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/basictypes.h" 11 #include "base/basictypes.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 13
14 #include "courgette/assembly_program.h" 14 #include "courgette/assembly_program.h"
15 #include "courgette/courgette.h" 15 #include "courgette/courgette.h"
16 #include "courgette/encoded_program.h" 16 #include "courgette/encoded_program.h"
17 #include "courgette/image_info.h" 17 #include "courgette/image_info.h"
18 18
19 // COURGETTE_HISTOGRAM_TARGETS prints out a histogram of how frequently 19 // COURGETTE_HISTOGRAM_TARGETS prints out a histogram of how frequently
20 // different target addresses are referenced. Purely for debugging. 20 // different target addresses are referenced. Purely for debugging.
21 #define COURGETTE_HISTOGRAM_TARGETS 0 21 #define COURGETTE_HISTOGRAM_TARGETS 0
22 22
23 namespace courgette { 23 namespace courgette {
24 24
25 class DisassemblerWin32X86 : public Disassembler { 25 DisassemblerWin32X86::DisassemblerWin32X86(PEInfo* pe_info)
26 public: 26 : pe_info_(pe_info),
27 explicit DisassemblerWin32X86(PEInfo* pe_info) 27 incomplete_disassembly_(false) {
28 : pe_info_(pe_info), 28 }
29 incomplete_disassembly_(false) {
30 }
31
32 virtual bool Disassemble(AssemblyProgram* target);
33
34 virtual void Destroy() { delete this; }
35
36 protected:
37 PEInfo& pe_info() { return *pe_info_; }
38
39 CheckBool ParseFile(AssemblyProgram* target) WARN_UNUSED_RESULT;
40 bool ParseAbs32Relocs();
41 void ParseRel32RelocsFromSections();
42 void ParseRel32RelocsFromSection(const Section* section);
43
44 CheckBool ParseNonSectionFileRegion(uint32 start_file_offset,
45 uint32 end_file_offset, AssemblyProgram* program) WARN_UNUSED_RESULT;
46 CheckBool ParseFileRegion(const Section* section,
47 uint32 start_file_offset, uint32 end_file_offset,
48 AssemblyProgram* program) WARN_UNUSED_RESULT;
49
50 #if COURGETTE_HISTOGRAM_TARGETS
51 void HistogramTargets(const char* kind, const std::map<RVA, int>& map);
52 #endif
53
54 PEInfo* pe_info_;
55 bool incomplete_disassembly_; // 'true' if can leave out 'uninteresting' bits
56
57 std::vector<RVA> abs32_locations_;
58 std::vector<RVA> rel32_locations_;
59
60 #if COURGETTE_HISTOGRAM_TARGETS
61 std::map<RVA, int> abs32_target_rvas_;
62 std::map<RVA, int> rel32_target_rvas_;
63 #endif
64 };
65 29
66 bool DisassemblerWin32X86::Disassemble(AssemblyProgram* target) { 30 bool DisassemblerWin32X86::Disassemble(AssemblyProgram* target) {
67 if (!pe_info().ok()) 31 if (!pe_info().ok())
68 return false; 32 return false;
69 33
70 target->set_image_base(pe_info().image_base()); 34 target->set_image_base(pe_info().image_base());
71 35
72 if (!ParseAbs32Relocs()) 36 if (!ParseAbs32Relocs())
73 return false; 37 return false;
74 38
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after
403 } 367 }
404 std::cout << std::endl; 368 std::cout << std::endl;
405 someSkipped = false; 369 someSkipped = false;
406 } else { 370 } else {
407 someSkipped = true; 371 someSkipped = true;
408 } 372 }
409 } 373 }
410 } 374 }
411 #endif // COURGETTE_HISTOGRAM_TARGETS 375 #endif // COURGETTE_HISTOGRAM_TARGETS
412 376
413 Disassembler* Disassembler::MakeDisassemberWin32X86(PEInfo* pe_info) {
414 return new DisassemblerWin32X86(pe_info);
415 }
416
417 ////////////////////////////////////////////////////////////////////////////////
418
419 Status ParseWin32X86PE(const void* buffer, size_t length,
420 AssemblyProgram** output) {
421 *output = NULL;
422
423 PEInfo* pe_info = new PEInfo();
424 pe_info->Init(buffer, length);
425
426 if (!pe_info->ParseHeader()) {
427 delete pe_info;
428 return C_INPUT_NOT_RECOGNIZED;
429 }
430
431 Disassembler* disassembler = Disassembler::MakeDisassemberWin32X86(pe_info);
432 AssemblyProgram* program = new AssemblyProgram();
433
434 if (!disassembler->Disassemble(program)) {
435 delete program;
436 disassembler->Destroy();
437 delete pe_info;
438 return C_DISASSEMBLY_FAILED;
439 }
440
441 disassembler->Destroy();
442 delete pe_info;
443 *output = program;
444 return C_OK;
445 }
446
447 void DeleteAssemblyProgram(AssemblyProgram* program) {
448 delete program;
449 }
450
451 } // namespace courgette 377 } // namespace courgette
OLDNEW
« no previous file with comments | « courgette/disassembler_win32_x86.h ('k') | courgette/encode_decode_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698