Chromium Code Reviews| Index: courgette/disassembler_win32.cc |
| diff --git a/courgette/disassembler_win32.cc b/courgette/disassembler_win32.cc |
| index 029284e46974818f3482fd437bff28660fde2b17..1c7008cbd4f928b44ffe8589ae8ddd96c3e4a917 100644 |
| --- a/courgette/disassembler_win32.cc |
| +++ b/courgette/disassembler_win32.cc |
| @@ -653,4 +653,36 @@ bool DisassemblerWin32::ReadDataDirectory(int index, |
| } |
| } |
| +bool DisassemblerWin32::QuickDetects(const uint8_t* start, |
|
huangs
2016/06/10 21:10:22
Move to line 341 for consistent ordering with head
etiennep
2016/06/13 17:50:21
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) |
| + return false; |
| + const uint8_t* const pe_header = start + file_offset; |
| + const size_t kMinPEHeaderSize = 4 /*signature*/ + kSizeOfCoffHeader; |
| + if (pe_header <= start || pe_header >= start + length - kMinPEHeaderSize) |
|
huangs
2016/06/10 21:10:22
NIT: I'd prefer
pe_header + kMinPEHeaderSize >= st
etiennep
2016/06/13 17:50:21
Done.
|
| + return false; |
| + if (file_offset % 8 != 0) |
|
huangs
2016/06/10 21:10:22
Can combine this condition via || with "file_offse
etiennep
2016/06/13 17:50:21
Done.
|
| + 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; |
| +} |
| + |
| } // namespace courgette |