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

Unified Diff: courgette/disassembler_win32.cc

Issue 2055343002: Courgette: Add static method QuickDetect() to optimize program detection. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 months 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 side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698