Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

119 lines
3.8 KiB

//////////////////////////////////////////////////////////////////////////////
//
// 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_