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 |