120 lines
3.8 KiB
C
120 lines
3.8 KiB
C
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// 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_
|