Index: lib/interception/interception_win.cc =================================================================== --- lib/interception/interception_win.cc +++ lib/interception/interception_win.cc @@ -202,6 +202,29 @@ return true; } +static const u8 kHintNop10Bytes[] = { + 0x66, 0x66, 0x0F, 0x1F, 0x84, + 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +template +static bool FunctionHasPrefix(uptr address, const T &pattern) { + u8* function = (u8*)address - sizeof(pattern); + for (size_t i = 0; i < sizeof(pattern); ++i) + if (function[i] != pattern[i]) + return false; + return true; +} + +static bool FunctionHasPadding(uptr address, uptr size) { + if (IsMemoryPadding(address - size, size)) + return true; + if (size <= sizeof(kHintNop10Bytes) && + FunctionHasPrefix(address, kHintNop10Bytes)) + return true; + return false; +} + static void WritePadding(uptr from, uptr size) { _memset((void*)from, 0xCC, (size_t)size); } @@ -617,7 +640,7 @@ // Validate that the function is hot patchable. size_t instruction_size = GetInstructionSize(old_func); if (instruction_size < kShortJumpInstructionLength || - !IsMemoryPadding(header, kHotPatchHeaderLen)) + !FunctionHasPadding(old_func, kHotPatchHeaderLen)) return false; if (orig_old_func) {