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

Side by Side Diff: courgette/disassembler.cc

Issue 8166013: Further refactoring, move ImageInfo into Disassembler/DisassemblerWin32X86. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Rebase over other changes, fix nit. Created 9 years, 1 month 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.h ('k') | courgette/disassembler_win32_x86.h » ('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.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/disassembler_win32_x86.h" 16 #include "courgette/disassembler_win32_x86.h"
17 #include "courgette/encoded_program.h" 17 #include "courgette/encoded_program.h"
18 #include "courgette/image_info.h"
19 18
20 // COURGETTE_HISTOGRAM_TARGETS prints out a histogram of how frequently 19 // COURGETTE_HISTOGRAM_TARGETS prints out a histogram of how frequently
21 // different target addresses are referenced. Purely for debugging. 20 // different target addresses are referenced. Purely for debugging.
22 #define COURGETTE_HISTOGRAM_TARGETS 0 21 #define COURGETTE_HISTOGRAM_TARGETS 0
23 22
24 namespace courgette { 23 namespace courgette {
25 24
26 //////////////////////////////////////////////////////////////////////////////// 25 ////////////////////////////////////////////////////////////////////////////////
27 26
28 ExecutableType DetectExecutableType(const void* buffer, size_t length) { 27 Disassembler* DetectDisassembler(const void* buffer, size_t length) {
28 Disassembler* disassembler = NULL;
29 29
30 bool parsed = false; 30 disassembler = new DisassemblerWin32X86(buffer, length);
31 if (disassembler->ParseHeader())
32 return disassembler;
31 33
32 PEInfo* pe_info = new PEInfo(); 34 delete disassembler;
33 pe_info->Init(buffer, length);
34 parsed = pe_info->ParseHeader();
35 delete pe_info;
36 35
37 if (parsed) 36 return NULL;
38 return WIN32_X86; 37 }
39 38
40 return UNKNOWN; 39 Status DetectExecutableType(const void* buffer, size_t length,
40 ExecutableType* type,
41 size_t* detected_length) {
42
43 Disassembler* disassembler = DetectDisassembler(buffer, length);
44
45 if (disassembler) {
46 *type = disassembler->kind();
47 *detected_length = disassembler->length();
48 delete disassembler;
49 return C_OK;
50 }
51
52 // We failed to detect anything
53 *type = UNKNOWN;
54 *detected_length = 0;
55 return C_INPUT_NOT_RECOGNIZED;
41 } 56 }
42 57
43 Status ParseDetectedExecutable(const void* buffer, size_t length, 58 Status ParseDetectedExecutable(const void* buffer, size_t length,
44 AssemblyProgram** output) { 59 AssemblyProgram** output) {
45 *output = NULL; 60 *output = NULL;
46 61
47 PEInfo* pe_info = new PEInfo(); 62 Disassembler* disassembler = DetectDisassembler(buffer, length);
48 pe_info->Init(buffer, length);
49 63
50 if (!pe_info->ParseHeader()) { 64 if (!disassembler) {
51 delete pe_info;
52 return C_INPUT_NOT_RECOGNIZED; 65 return C_INPUT_NOT_RECOGNIZED;
53 } 66 }
54 67
55 Disassembler* disassembler = new DisassemblerWin32X86(pe_info);
56 AssemblyProgram* program = new AssemblyProgram(); 68 AssemblyProgram* program = new AssemblyProgram();
57 69
58 if (!disassembler->Disassemble(program)) { 70 if (!disassembler->Disassemble(program)) {
59 delete program; 71 delete program;
60 delete disassembler; 72 delete disassembler;
61 delete pe_info;
62 return C_DISASSEMBLY_FAILED; 73 return C_DISASSEMBLY_FAILED;
63 } 74 }
64 75
65 delete disassembler; 76 delete disassembler;
66 delete pe_info;
67 *output = program; 77 *output = program;
68 return C_OK; 78 return C_OK;
69 } 79 }
70 80
71 void DeleteAssemblyProgram(AssemblyProgram* program) { 81 void DeleteAssemblyProgram(AssemblyProgram* program) {
72 delete program; 82 delete program;
73 } 83 }
74 84
85 Disassembler::Disassembler(const void* start, size_t length)
86 : failure_reason_("uninitialized") {
87
88 start_ = reinterpret_cast<const uint8*>(start);
89 length_ = length;
90 end_ = start_ + length_;
91 };
92
93 Disassembler::~Disassembler() {};
94
95 const uint8* Disassembler::OffsetToPointer(size_t offset) const {
96 assert(start_ + offset <= end_);
97 return start_ + offset;
98 }
99
100 bool Disassembler::Good() {
101 failure_reason_ = NULL;
102 return true;
103 }
104
105 bool Disassembler::Bad(const char* reason) {
106 failure_reason_ = reason;
107 return false;
108 }
109
110 void Disassembler::ReduceLength(size_t reduced_length) {
111 if (reduced_length < length_)
112 length_ = reduced_length;
113 }
114
75 } // namespace courgette 115 } // namespace courgette
OLDNEW
« no previous file with comments | « courgette/disassembler.h ('k') | courgette/disassembler_win32_x86.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698