////////////////////////////////////////////////////////////////////////////// // // Module: detours.lib // File: disasm.h // Author: Doug Brubacher // // Detours for binary functions. Version 1.2. (Build 35) // Includes support for all x86 chips prior to the Pentium III. // // Copyright 1999, Microsoft Corporation // // http://research.microsoft.com/sn/detours // #pragma once #ifndef _DISASM_H_ #define _DISASM_H_ class CDetourDis { public: CDetourDis(PBYTE *ppbTarget, LONG *plExtra); PBYTE CopyInstruction(PBYTE pbDst, PBYTE pbSrc); static BOOL SanityCheckSystem(); public: struct COPYENTRY; typedef const COPYENTRY * REFCOPYENTRY; typedef PBYTE (CDetourDis::* COPYFUNC)(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc); enum { DYNAMIC = 0x1u, ADDRESS = 0x2u, NOENLARGE = 0x4u, SIB = 0x10u, NOTSIB = 0x0fu, }; struct COPYENTRY { ULONG nOpcode : 8; // Opcode ULONG nFixedSize : 3; // Fixed size of opcode ULONG nFixedSize16 : 3; // Fixed size when 16 bit operand ULONG nModOffset : 3; // Offset to mod/rm byte (0=none) LONG nRelOffset : 3; // Offset to relative target. ULONG nFlagBits : 4; // Flags for DYNAMIC, etc. COPYFUNC pfCopy; // Function pointer. }; protected: #define ENTRY_CopyBytes1 1, 1, 0, 0, 0, CopyBytes #define ENTRY_CopyBytes1Dynamic 1, 1, 0, 0, DYNAMIC, CopyBytes #define ENTRY_CopyBytes2 2, 2, 0, 0, 0, CopyBytes #define ENTRY_CopyBytes2Jump 2, 2, 0, 1, 0, CopyBytes #define ENTRY_CopyBytes2CantJump 2, 2, 0, 1, NOENLARGE, CopyBytes #define ENTRY_CopyBytes2Dynamic 2, 2, 0, 0, DYNAMIC, CopyBytes #define ENTRY_CopyBytes3 3, 3, 0, 0, 0, CopyBytes #define ENTRY_CopyBytes3Dynamic 3, 3, 0, 0, DYNAMIC, CopyBytes #define ENTRY_CopyBytes3Or5 5, 3, 0, 0, 0, CopyBytes #define ENTRY_CopyBytes3Or5Target 5, 3, 0, 1, 0, CopyBytes #define ENTRY_CopyBytes5Or7Dynamic 7, 5, 0, 0, DYNAMIC, CopyBytes #define ENTRY_CopyBytes3Or5Address 5, 3, 0, 0, ADDRESS, CopyBytes #define ENTRY_CopyBytes4 4, 4, 0, 0, 0, CopyBytes #define ENTRY_CopyBytes5 5, 5, 0, 0, 0, CopyBytes #define ENTRY_CopyBytes7 7, 7, 0, 0, 0, CopyBytes #define ENTRY_CopyBytes2Mod 2, 2, 1, 0, 0, CopyBytes #define ENTRY_CopyBytes2Mod1 3, 3, 1, 0, 0, CopyBytes #define ENTRY_CopyBytes2ModOperand 6, 4, 1, 0, 0, CopyBytes #define ENTRY_CopyBytes3Mod 3, 3, 2, 0, 0, CopyBytes #define ENTRY_CopyBytesPrefix 1, 1, 0, 0, 0, CopyBytesPrefix #define ENTRY_Copy0F 1, 1, 0, 0, 0, Copy0F #define ENTRY_Copy66 1, 1, 0, 0, 0, Copy66 #define ENTRY_Copy67 1, 1, 0, 0, 0, Copy67 #define ENTRY_CopyF6 0, 0, 0, 0, 0, CopyF6 #define ENTRY_CopyF7 0, 0, 0, 0, 0, CopyF7 #define ENTRY_CopyFF 0, 0, 0, 0, 0, CopyFF #define ENTRY_Invalid 1, 1, 0, 0, 0, Invalid #define ENTRY_End 0, 0, 0, 0, 0, NULL PBYTE CopyBytes(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc); PBYTE CopyBytesPrefix(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc); PBYTE Invalid(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc); PBYTE AdjustTarget(PBYTE pbDst, PBYTE pbSrc, LONG cbOp, LONG cbTargetOffset); VOID Set16BitOperand(); VOID Set32BitOperand(); VOID Set16BitAddress(); VOID Set32BitAddress(); protected: PBYTE Copy0F(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc); PBYTE Copy66(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc); PBYTE Copy67(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc); PBYTE CopyF6(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc); PBYTE CopyF7(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc); PBYTE CopyFF(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc); protected: static const COPYENTRY s_rceCopyTable[257]; static const COPYENTRY s_rceCopyTable0F[257]; static const BYTE s_rbModRm[256]; protected: BOOL m_b16BitOperand; BOOL m_b16BitAddress; PBYTE * m_ppbTarget; LONG * m_plExtra; LONG m_lScratchExtra; PBYTE m_pbScratchTarget; BYTE m_rbScratchDst[64]; }; #endif //_DISASM_H_