Chromium Code Reviews| Index: courgette/disassembler_win32.cc |
| diff --git a/courgette/disassembler_win32.cc b/courgette/disassembler_win32.cc |
| index 029284e46974818f3482fd437bff28660fde2b17..65bf1ae68fda47a85a5e307ac4dd717fa238596c 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,36 @@ std::string DisassemblerWin32::SectionName(const Section* section) { |
| return name; |
| } |
| +bool DisassemblerWin32::QuickDetect(const uint8_t* start, |
|
huangs
2016/06/13 18:30:28
NIT:
// static
etiennep
2016/06/14 21:16:37
Done.
|
| + 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; |
| + |
| + // 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); |
| } |