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

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: Propagate uint8_t* to unittests and Nits 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..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);
}

Powered by Google App Engine
This is Rietveld 408576698