Chromium Code Reviews| Index: courgette/disassembler_win32.cc |
| diff --git a/courgette/disassembler_win32.cc b/courgette/disassembler_win32.cc |
| index 029284e46974818f3482fd437bff28660fde2b17..dd141093ca57e9ae0307062a0410b6a94f70d1e9 100644 |
| --- a/courgette/disassembler_win32.cc |
| +++ b/courgette/disassembler_win32.cc |
| @@ -19,7 +19,7 @@ |
| namespace courgette { |
| -DisassemblerWin32::DisassemblerWin32(const void* start, size_t length) |
| +DisassemblerWin32::DisassemblerWin32(const uint8_t* start, size_t length) |
| : Disassembler(start, length) {} |
| RVA DisassemblerWin32::FileOffsetToRVA(FileOffset file_offset) const { |
| @@ -338,6 +338,37 @@ std::string DisassemblerWin32::SectionName(const Section* section) { |
| return name; |
| } |
| +// static |
| +bool DisassemblerWin32::QuickDetect(const uint8_t* start, |
| + size_t length, |
| + uint16_t magic) { |
| + if (length < kOffsetOfFileAddressOfNewExeHeader + 4 /* size */) |
| + return false; |
| + |
| + // Have 'MZ' magic for a DOS header? |
| + if (start[0] != 'M' || start[1] != 'Z') |
| + return false; |
| + |
| + FileOffset file_offset = static_cast<FileOffset>( |
| + ReadU32(start, kOffsetOfFileAddressOfNewExeHeader)); |
| + if (file_offset >= length || file_offset % 8 != 0) |
| + return false; |
| + const uint8_t* const pe_header = start + file_offset; |
| + const size_t kMinPEHeaderSize = 4 /*signature*/ + kSizeOfCoffHeader; |
| + if (pe_header <= start || pe_header + kMinPEHeaderSize >= start + length) |
| + return false; |
| + |
| + const uint8_t* optional_header = pe_header + 4 + kSizeOfCoffHeader; |
| + |
|
huangs
2016/06/15 00:13:05
NIT: Remove this new line.
etiennep
2016/06/15 20:38:06
Done.
|
| + // Check we can read the magic. |
| + if (optional_header + 2 >= start + length) |
| + return false; |
| + if (magic != ReadU16(optional_header, 0)) |
| + return false; |
| + |
| + return true; |
| +} |
| + |
| RvaVisitor* DisassemblerWin32::CreateAbs32TargetRvaVisitor() { |
| return new RvaVisitor_Abs32(abs32_locations_, *this); |
| } |