mirror of https://github.com/lianthony/NT4.0
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.
129 lines
3.1 KiB
129 lines
3.1 KiB
/***********************************************************************
|
|
* Microsoft Puma
|
|
*
|
|
* Microsoft Confidential. Copyright 1994-1996 Microsoft Corporation.
|
|
*
|
|
* Component:
|
|
*
|
|
* File: x86.h
|
|
*
|
|
* File Comments:
|
|
*
|
|
*
|
|
***********************************************************************/
|
|
|
|
class ostream;
|
|
struct OPCD;
|
|
|
|
|
|
struct _IMAGE_RUNTIME_FUNCTION_ENTRY;
|
|
|
|
enum TRMTX86
|
|
{
|
|
trmtx86Unknown,
|
|
trmtx86FallThrough,
|
|
trmtx86Trap,
|
|
trmtx86TrapCc,
|
|
trmtx86JmpShort,
|
|
trmtx86JmpNear,
|
|
trmtx86JmpFar,
|
|
trmtx86JmpInd,
|
|
trmtx86Ret,
|
|
trmtx86Iret,
|
|
trmtx86JmpCcShort,
|
|
trmtx86JmpCcNear,
|
|
trmtx86Loop,
|
|
trmtx86Jcxz,
|
|
trmtx86CallNear16,
|
|
trmtx86CallNear32,
|
|
trmtx86CallFar,
|
|
trmtx86CallInd,
|
|
};
|
|
|
|
|
|
class DISX86 : public DIS
|
|
{
|
|
public:
|
|
DISX86(ARCHT);
|
|
|
|
enum REG
|
|
{
|
|
regEax = 0,
|
|
regEcx = 1,
|
|
regEdx = 2,
|
|
regEbx = 3,
|
|
regEsp = 4,
|
|
regEbp = 5,
|
|
regEsi = 6,
|
|
regEdi = 7,
|
|
};
|
|
|
|
// Methods inherited from DIS
|
|
|
|
ADDR AddrAddress() const;
|
|
ADDR AddrJumpTable() const;
|
|
ADDR AddrOperand(size_t) const;
|
|
ADDR AddrTarget() const;
|
|
size_t Cb() const;
|
|
size_t CbDisassemble(ADDR, const BYTE *, size_t);
|
|
size_t CbJumpEntry() const;
|
|
size_t CbGenerateLoadAddress(BYTE *, size_t, size_t * = NULL) const;
|
|
size_t CbMemoryReference() const;
|
|
size_t CchFormatAddr(ADDR, char *, size_t) const;
|
|
size_t CchFormatBytes(char *, size_t) const;
|
|
size_t CchFormatBytesMax() const;
|
|
size_t CchFormatInstr(char *, size_t) const;
|
|
size_t Coperand() const;
|
|
void FormatAddr(ostream&, ADDR) const;
|
|
void FormatInstr(ostream&) const;
|
|
MEMREFT Memreft() const;
|
|
TRMT Trmt() const;
|
|
TRMTA Trmta() const;
|
|
|
|
private:
|
|
enum OPRNDT;
|
|
|
|
const BYTE *m_pbCur;
|
|
size_t m_cbMax;
|
|
|
|
size_t m_cb;
|
|
BYTE m_rgbInstr[16];
|
|
|
|
const struct OPCD *m_popcd;
|
|
|
|
bool m_fAddress32;
|
|
bool m_fOperand32;
|
|
BYTE m_bSegOverride;
|
|
BYTE m_bPrefix;
|
|
|
|
bool m_fAddrOverride;
|
|
bool m_fOperOverride;
|
|
|
|
size_t m_ibOp;
|
|
size_t m_ibModrm;
|
|
size_t m_cbModrm;
|
|
size_t m_ibImmed;
|
|
TRMTX86 m_trmtx86;
|
|
|
|
ADDR AddrJumpTable16() const;
|
|
ADDR AddrJumpTable32() const;
|
|
ADDR AddrOperandModrm16() const;
|
|
ADDR AddrOperandModrm32() const;
|
|
size_t CbGenerateLea(BYTE *, size_t, size_t * = NULL) const;
|
|
size_t CbGenerateMovOffset(BYTE *, size_t, size_t * = NULL) const;
|
|
size_t CbGenerateMovXDi(BYTE *, size_t) const;
|
|
size_t CbGenerateMovXSi(BYTE *, size_t) const;
|
|
bool FDisassembleModrm16(BYTE);
|
|
bool FDisassembleModrm32(BYTE);
|
|
void FormatHex(ostream&, DWORD) const;
|
|
void FormatModrm16(ostream&, unsigned, bool) const;
|
|
void FormatModrm32(ostream&, unsigned, bool) const;
|
|
void FormatOperand(ostream&, enum OPRNDT, unsigned) const;
|
|
void FormatOpSize(ostream&, unsigned cb) const;
|
|
void FormatRegister(ostream&, int, unsigned) const;
|
|
void FormatSegOverride(ostream&) const;
|
|
bool FValidOperand(size_t) const;
|
|
size_t IbDispModrm16() const;
|
|
size_t IbDispModrm32() const;
|
|
size_t IbDispOffset() const;
|
|
};
|