@@ -185,7 +185,17 @@ static VOID LeaveCritSec() {
185
185
// jump tables, etc.
186
186
// =========================================================================
187
187
static PBYTE SkipJumps (PBYTE pbCode) {
188
+ PBYTE pbOrgCode = pbCode;
188
189
#ifdef _M_IX86_X64
190
+ #ifdef _M_IX86
191
+ // mov edi,edi: hot patch point
192
+ if (pbCode[0 ] == 0x8b && pbCode[1 ] == 0xff )
193
+ pbCode += 2 ;
194
+ // push ebp; mov ebp, esp; pop ebp;
195
+ // "collapsed" stackframe generated by MSVC
196
+ if (pbCode[0 ] == 0x55 && pbCode[1 ] == 0x8b && pbCode[2 ] == 0xec && pbCode[3 ] == 0x5d )
197
+ pbCode += 4 ;
198
+ #endif
189
199
if (pbCode[0 ] == 0xff && pbCode[1 ] == 0x25 ) {
190
200
#ifdef _M_IX86
191
201
// on x86 we have an absolute pointer...
@@ -214,7 +224,7 @@ static PBYTE SkipJumps(PBYTE pbCode) {
214
224
#else
215
225
#error unsupported platform
216
226
#endif
217
- return pbCode ;
227
+ return pbOrgCode ;
218
228
}
219
229
220
230
// =========================================================================
@@ -563,7 +573,7 @@ static DWORD DisassembleAndSkip(PVOID pFunction, DWORD dwMinLen, MHOOKS_PATCHDAT
563
573
564
574
ODPRINTF ((L" mhooks: DisassembleAndSkip: Disassembling %p" , pLoc));
565
575
while ( (dwRet < dwMinLen) && (pins = GetInstruction (&dis, (ULONG_PTR)pLoc, pLoc, dwFlags)) ) {
566
- ODPRINTF ((" mhooks: DisassembleAndSkip: %p: %s" , pLoc, pins->String ));
576
+ ODPRINTF ((" mhooks: DisassembleAndSkip: %p:(0x%2.2x) %s" , pLoc, pins-> Length , pins->String ));
567
577
if (pins->Type == ITYPE_RET ) break ;
568
578
if (pins->Type == ITYPE_BRANCH ) break ;
569
579
if (pins->Type == ITYPE_BRANCHCC) break ;
0 commit comments