view src/udis86.d @ 1:4a9dcbd9e54f

-files of 0.13 beta -fixes so that it now compiles with the current dmd version
author marton@basel.hu
date Tue, 05 Apr 2011 20:44:01 +0200
parents
children
line wrap: on
line source

/* -----------------------------------------------------------------------------
 * udis86.h
 *
 * converted to D by Jascha Wetzel
 *
 * Copyright (c) 2002, 2003, 2004 Vivek Mohan <vivek@sig9.com>
 * All rights reserved. See (LICENSE)
 * -----------------------------------------------------------------------------
 */

extern(C)
{

struct __nt_context { int esp; int info; int prev; int handler; int stable; int sindex; int ebp; };

/* -----------------------------------------------------------------------------
 * types.h
 *
 * Copyright (c) 2006, Vivek Mohan <vivek@sig9.com>
 * All rights reserved. See LICENSE
 * -----------------------------------------------------------------------------
 */

import std.c.stdio;

extern const char* ud_mnemonics[];

enum ud_mnemonic_code
{
  UD_Iaaa,
  UD_Iaad,
  UD_Iaam,
  UD_Iaas,
  UD_Iadc,
  UD_Iadd,
  UD_Iaddpd,
  UD_Iaddps,
  UD_Iaddsd,
  UD_Iaddss,
  UD_Iand,
  UD_Iandnpd,
  UD_Iandnps,
  UD_Iandpd,
  UD_Iandps,
  UD_Iarpl,
  UD_Ibound,
  UD_Ibsf,
  UD_Ibsr,
  UD_Ibswap,
  UD_Ibt,
  UD_Ibtc,
  UD_Ibtr,
  UD_Ibts,
  UD_Icall,
  UD_Icbw,
  UD_Icdqe,
  UD_Iclc,
  UD_Icld,
  UD_Iclflush,
  UD_Icli,
  UD_Iclts,
  UD_Icmc,
  UD_Icmovo,
  UD_Icmovno,
  UD_Icmovb,
  UD_Icmovnb,
  UD_Icmovz,
  UD_Icmovnz,
  UD_Icmovbe,
  UD_Icmovnbe,
  UD_Icmovs,
  UD_Icmovns,
  UD_Icmovp,
  UD_Icmovnp,
  UD_Icmovl,
  UD_Icmovnl,
  UD_Icmovle,
  UD_Icmovnle,
  UD_Icmp,
  UD_Icmppd,
  UD_Icmpps,
  UD_Icmps,
  UD_Icmpsb,
  UD_Icmpsd,
  UD_Icmpsq,
  UD_Icmpss,
  UD_Icmpsw,
  UD_Icmpxchg,
  UD_Icmpxchg8b,
  UD_Icomisd,
  UD_Icomiss,
  UD_Icpuid,
  UD_Icqd,
  UD_Icqo,
  UD_Icvtdq2pd,
  UD_Icvtdq2ps,
  UD_Icvtpd2dq,
  UD_Icvtpd2pi,
  UD_Icvtpd2ps,
  UD_Icvtpi2pd,
  UD_Icvtpi2ps,
  UD_Icvtps2dq,
  UD_Icvtps2pd,
  UD_Icvtps2pi,
  UD_Icvtsd2si,
  UD_Icvtsd2ss,
  UD_Icvtsi2sd,
  UD_Icvtsi2ss,
  UD_Icvtss2sd,
  UD_Icvtss2si,
  UD_Icvttpd2dq,
  UD_Icvttpd2pi,
  UD_Icvttps2dq,
  UD_Icvttps2pi,
  UD_Icvttsd2si,
  UD_Icvttsi2sd,
  UD_Icvttsi2ss,
  UD_Icvttss2si,
  UD_Icwd,
  UD_Icwde,
  UD_Icdq,
  UD_Idaa,
  UD_Idas,
  UD_Idec,
  UD_Idiv,
  UD_Idivpd,
  UD_Idivps,
  UD_Idivsd,
  UD_Idivss,
  UD_Iemms,
  UD_Ienter,
  UD_Iesc,
  UD_If2xm1,
  UD_Ifsxm1,
  UD_Ifabs,
  UD_Ifadd,
  UD_Ifaddp,
  UD_Ifbld,
  UD_Ifbstp,
  UD_Ifchs,
  UD_Ifclex,
  UD_Ifcmovb,
  UD_Ifcmovbe,
  UD_Ifcmove,
  UD_Ifcmovnb,
  UD_Ifcmovnbe,
  UD_Ifcmovne,
  UD_Ifcmovnu,
  UD_Ifcmovu,
  UD_Ifcom,
  UD_Ifcomi,
  UD_Ifcomp,
  UD_Ifcomip,
  UD_Ifcompp,
  UD_Ifcos,
  UD_Ifdecstp,
  UD_Ifdiv,
  UD_Ifdivp,
  UD_Ifdivr,
  UD_Ifdivrp,
  UD_Ifemms,
  UD_Iffree,
  UD_Ifiadd,
  UD_Ificom,
  UD_Ificomp,
  UD_Ifidiv,
  UD_Ifidivr,
  UD_Ifidw,
  UD_Ifidwr,
  UD_Ifild,
  UD_Ifimul,
  UD_Ifincstp,
  UD_Ifinit,
  UD_Ifist,
  UD_Ifistp,
  UD_Ifisub,
  UD_Ifisubr,
  UD_Ifld,
  UD_Ifld1,
  UD_Ifldcw,
  UD_Ifldenv,
  UD_Ifldl2e,
  UD_Ifldl2t,
  UD_Ifldlg2,
  UD_Ifldln2,
  UD_Ifldlpi,
  UD_Ifldx,
  UD_Ifldz,
  UD_Ifmul,
  UD_Ifmulp,
  UD_Ifnclex,
  UD_Ifncstp,
  UD_Ifninit,
  UD_Ifnop,
  UD_Ifnsave,
  UD_Ifnstcw,
  UD_Ifnstenv,
  UD_Ifnstsw,
  UD_Ifpatan,
  UD_Ifprem,
  UD_Ifprem1,
  UD_Ifptan,
  UD_Ifpxtract,
  UD_Ifrndint,
  UD_Ifrstor,
  UD_Ifsave,
  UD_Ifscale,
  UD_Ifsin,
  UD_Ifsincos,
  UD_Ifsqrt,
  UD_Ifst,
  UD_Ifstcw,
  UD_Ifstenv,
  UD_Ifstp,
  UD_Ifstsw,
  UD_Ifsub,
  UD_Ifsubp,
  UD_Ifsubr,
  UD_Ifsubrp,
  UD_Iftst,
  UD_Ifucom,
  UD_Ifucomi,
  UD_Ifucomip,
  UD_Ifucomp,
  UD_Ifucompp,
  UD_Ifwait,
  UD_Ifxam,
  UD_Ifxch,
  UD_Ifxrstor,
  UD_Ifxsave,
  UD_Ifxtract,
  UD_Ifyl2x,
  UD_Ifyl2xp1,
  UD_Ihlt,
  UD_Iidiv,
  UD_Iimul,
  UD_Iin,
  UD_Iinc,
  UD_Iins,
  UD_Iinsb,
  UD_Iinsd,
  UD_Iinsw,
  UD_Iint,
  UD_Iinto,
  UD_Iinvd,
  UD_Iinvlpg,
  UD_Iiretw,
  UD_Iiretd,
  UD_Iiretq,
  UD_Ijcxz,
  UD_Ijecxz,
  UD_Ijmp,
  UD_Ijrcxz,
  UD_Ijo,
  UD_Ijno,
  UD_Ijb,
  UD_Ijnb,
  UD_Ijz,
  UD_Ijnz,
  UD_Ijbe,
  UD_Ijnbe,
  UD_Ijs,
  UD_Ijns,
  UD_Ijp,
  UD_Ijnp,
  UD_Ijl,
  UD_Ijnl,
  UD_Ijle,
  UD_Ijnle,
  UD_Ilahf,
  UD_Ilar,
  UD_Ildmxcsr,
  UD_Ilds,
  UD_Ilea,
  UD_Ileave,
  UD_Iles,
  UD_Ilfence,
  UD_Ilfs,
  UD_Ilgdt,
  UD_Ilgs,
  UD_Ilidt,
  UD_Illdt,
  UD_Ilmsw,
  UD_Ilock,
  UD_Ilods,
  UD_Ilodsb,
  UD_Ilodsd,
  UD_Ilodsq,
  UD_Ilodsw,
  UD_Iloop,
  UD_Iloope,
  UD_Iloopn,
  UD_Iloopne,
  UD_Iloopnz,
  UD_Iloopz,
  UD_Ilsl,
  UD_Ilss,
  UD_Iltr,
  UD_Imaskmovdqu,
  UD_Imaskmovq,
  UD_Imaxpd,
  UD_Imaxps,
  UD_Imaxsd,
  UD_Imaxss,
  UD_Imfence,
  UD_Iminpd,
  UD_Iminps,
  UD_Iminsd,
  UD_Iminss,
  UD_Imov,
  UD_Imovapd,
  UD_Imovaps,
  UD_Imovd,
  UD_Imovdq2q,
  UD_Imovdqa,
  UD_Imovdqu,
  UD_Imovhlps,
  UD_Imovhpd,
  UD_Imovhps,
  UD_Imovlhps,
  UD_Imovlpd,
  UD_Imovlps,
  UD_Imovmskpd,
  UD_Imovmskps,
  UD_Imovnig,
  UD_Imovntdq,
  UD_Imovnti,
  UD_Imovntpd,
  UD_Imovntps,
  UD_Imovntq,
  UD_Imovq,
  UD_Imovq2dq,
  UD_Imovqa,
  UD_Imovs,
  UD_Imovsb,
  UD_Imovsd,
  UD_Imovsq,
  UD_Imovss,
  UD_Imovsw,
  UD_Imovsx,
  UD_Imovsxd,
  UD_Imovupd,
  UD_Imovups,
  UD_Imovzx,
  UD_Imul,
  UD_Imulpd,
  UD_Imulps,
  UD_Imulsd,
  UD_Imulss,
  UD_Ineg,
  UD_Inop,
  UD_Inot,
  UD_Ior,
  UD_Iorpd,
  UD_Iorps,
  UD_Iout,
  UD_Iouts,
  UD_Ioutsb,
  UD_Ioutsd,
  UD_Ioutsw,
  UD_Ipackssdw,
  UD_Ipacksswb,
  UD_Ipackusdw,
  UD_Ipackuswb,
  UD_Ipaddb,
  UD_Ipaddd,
  UD_Ipaddq,
  UD_Ipaddsb,
  UD_Ipaddsw,
  UD_Ipaddusb,
  UD_Ipaddusw,
  UD_Ipaddw,
  UD_Ipand,
  UD_Ipandn,
  UD_Ipavgb,
  UD_Ipavgusb,
  UD_Ipavgw,
  UD_Ipcmpeqb,
  UD_Ipcmpeqd,
  UD_Ipcmpeqw,
  UD_Ipcmpgtb,
  UD_Ipcmpgtd,
  UD_Ipcmpgtw,
  UD_Ipextrw,
  UD_Ipf2id,
  UD_Ipf2iw,
  UD_Ipfacc,
  UD_Ipfadd,
  UD_Ipfcmpeq,
  UD_Ipfcmpge,
  UD_Ipfcmpgt,
  UD_Ipfmax,
  UD_Ipfmin,
  UD_Ipfmul,
  UD_Ipfnacc,
  UD_Ipfpnacc,
  UD_Ipfrcp,
  UD_Ipfrcpit1,
  UD_Ipfrcpit2,
  UD_Ipfrsqit1,
  UD_Ipfrsqrt,
  UD_Ipfsub,
  UD_Ipfsubr,
  UD_Ipi2fd,
  UD_Ipi2fw,
  UD_Ipinsrw,
  UD_Ipmaddwd,
  UD_Ipmaxsw,
  UD_Ipmaxub,
  UD_Ipminsw,
  UD_Ipminub,
  UD_Ipmovmskb,
  UD_Ipmulhrw,
  UD_Ipmulhuw,
  UD_Ipmulhw,
  UD_Ipmullw,
  UD_Ipmuludq,
  UD_Ipop,
  UD_Ipopa,
  UD_Ipopad,
  UD_Ipopfw,
  UD_Ipopfd,
  UD_Ipopfq,
  UD_Ipor,
  UD_Iprefetch,
  UD_Ipsadbw,
  UD_Ipshufd,
  UD_Ipshufhw,
  UD_Ipshuflw,
  UD_Ipshufw,
  UD_Ipslld,
  UD_Ipslldq,
  UD_Ipsllq,
  UD_Ipsllw,
  UD_Ipsrad,
  UD_Ipsraw,
  UD_Ipsraq,
  UD_Ipsrld,
  UD_Ipsrldq,
  UD_Ipsrlq,
  UD_Ipsrlw,
  UD_Ipsubb,
  UD_Ipsubd,
  UD_Ipsubq,
  UD_Ipsubsb,
  UD_Ipsubsw,
  UD_Ipsubusb,
  UD_Ipsubusw,
  UD_Ipsubw,
  UD_Ipswapd,
  UD_Ipunpckhbw,
  UD_Ipunpckhdq,
  UD_Ipunpckhqdq,
  UD_Ipunpckhwd,
  UD_Ipunpcklbw,
  UD_Ipunpckldq,
  UD_Ipunpcklqdq,
  UD_Ipunpcklwd,
  UD_Ipush,
  UD_Ipusha,
  UD_Ipushad,
  UD_Ipushfw,
  UD_Ipushfd,
  UD_Ipushfq,
  UD_Ipxor,
  UD_Ircl,
  UD_Ircpps,
  UD_Ircpss,
  UD_Ircr,
  UD_Irdivisr,
  UD_Irdmsr,
  UD_Irdpmc,
  UD_Irdtsc,
  UD_Irep,
  UD_Irepne,
  UD_Iret,
  UD_Iretf,
  UD_Irol,
  UD_Iror,
  UD_Irsm,
  UD_Irsqrtps,
  UD_Irsqrtss,
  UD_Isahf,
  UD_Isal,
  UD_Isalc,
  UD_Isar,
  UD_Isbb,
  UD_Iscas,
  UD_Iscasb,
  UD_Iscasd,
  UD_Iscasq,
  UD_Iscasw,
  UD_Iseto,
  UD_Isetno,
  UD_Isetb,
  UD_Isetnb,
  UD_Isetz,
  UD_Isetnz,
  UD_Isetbe,
  UD_Isetnbe,
  UD_Isets,
  UD_Isetns,
  UD_Isetp,
  UD_Isetnp,
  UD_Isetl,
  UD_Isetnl,
  UD_Isetle,
  UD_Isetnle,
  UD_Isfence,
  UD_Isgdt,
  UD_Ishl,
  UD_Ishld,
  UD_Ishr,
  UD_Ishrd,
  UD_Ishufpd,
  UD_Ishufps,
  UD_Isidt,
  UD_Isldt,
  UD_Ismsw,
  UD_Isqrtpd,
  UD_Isqrtps,
  UD_Isqrtsd,
  UD_Isqrtss,
  UD_Istc,
  UD_Istd,
  UD_Isti,
  UD_Istmxcsr,
  UD_Istos,
  UD_Istosb,
  UD_Istosw,
  UD_Istosd,
  UD_Istr,
  UD_Isub,
  UD_Isubpd,
  UD_Isubps,
  UD_Isubsd,
  UD_Isubss,
  UD_Iswapgs,
  UD_Isyscall,
  UD_Isysenter,
  UD_Isysexit,
  UD_Isysret,
  UD_Itest,
  UD_Iucomisd,
  UD_Iucomiss,
  UD_Iud2,
  UD_Iunpckhpd,
  UD_Iunpckhps,
  UD_Iunpcklpd,
  UD_Iunpcklps,
  UD_Iverr,
  UD_Iverw,
  UD_Iwait,
  UD_Iwbinvd,
  UD_Iwrmsr,
  UD_Ixadd,
  UD_Ixchg,
  UD_Ixlat,
  UD_Ixlatb,
  UD_Ixor,
  UD_Ixorpd,
  UD_Ixorps,
  UD_Iinvalid,
  UD_Igrp,
  UD_Ia32,
  UD_Io32,
  UD_Ies,
  UD_Ifs,
  UD_Igs,
  UD_Ics,
  UD_Ids,
  UD_Iss,
  UD_Ix87,
  UD_I3dnow,
  UD_Idb,
  UD_Icmpxchg16b,
  UD_Istosq,
  UD_Iint3,
  UD_Imovsldup,
  UD_Imovshdup,
  UD_Imovddup,
  UD_Irdtscp,
  UD_Ivmrun,
  UD_Ivmmcall,
  UD_Ivmload,
  UD_Ivmsave,
  UD_Istgi,
  UD_Iclgi,
  UD_Iskinit,
  UD_Iinvlpga,
  UD_Ija,
  UD_Ijae,
  UD_Ijg,
  UD_Ijge,
  UD_Ijc,
  UD_Ijnc,
  UD_Ifisttp,
  UD_Iprefetchnta,
  UD_Iprefetcht0,
  UD_Iprefetcht1,
  UD_Iprefetcht2,
  UD_Icmovae,
  UD_Icmova,
  UD_Icmovge,
  UD_Icmovg,
  UD_Iseta,
  UD_Isetge,
  UD_Isetg,
  UD_Ipause,
  UD_Ina,
  UD_Ihaddpd,
  UD_Ihsubpd,
  UD_Iaddsubpd,
  UD_Ihaddps,
  UD_Ihsubps,
  UD_Iaddsubps,
  UD_Ilddqu,
  UD_Iint1,
  UD_Ivmcall,
  UD_Ivmlaunch,
  UD_Ivmresume,
  UD_Ivmxoff,
  UD_Imonitor,
  UD_Imwait,
  UD_Ivmptrld,
  UD_Ivmptrst,
  UD_Ivmclear,
  UD_Ivmxon,
  UD_Inone,
  UD_I3vil
}


/* -----------------------------------------------------------------------------
 * All possible "types" of objects in udis86. Order is Important!
 * -----------------------------------------------------------------------------
 */
enum ud_type
{
  UD_NONE,

  /* 8 bit GPRs */
  UD_R_AL,	UD_R_CL,	UD_R_DL,	UD_R_BL,
  UD_R_AH,	UD_R_CH,	UD_R_DH,	UD_R_BH,
  UD_R_SPL,	UD_R_BPL,	UD_R_SIL,	UD_R_DIL,
  UD_R_R8B,	UD_R_R9B,	UD_R_R10B,	UD_R_R11B,
  UD_R_R12B,	UD_R_R13B,	UD_R_R14B,	UD_R_R15B,

  /* 16 bit GPRs */
  UD_R_AX,	UD_R_CX,	UD_R_DX,	UD_R_BX,
  UD_R_SP,	UD_R_BP,	UD_R_SI,	UD_R_DI,
  UD_R_R8W,	UD_R_R9W,	UD_R_R10W,	UD_R_R11W,
  UD_R_R12W,	UD_R_R13W,	UD_R_R14W,	UD_R_R15W,

  /* 32 bit GPRs */
  UD_R_EAX,	UD_R_ECX,	UD_R_EDX,	UD_R_EBX,
  UD_R_ESP,	UD_R_EBP,	UD_R_ESI,	UD_R_EDI,
  UD_R_R8D,	UD_R_R9D,	UD_R_R10D,	UD_R_R11D,
  UD_R_R12D,	UD_R_R13D,	UD_R_R14D,	UD_R_R15D,

  /* 64 bit GPRs */
  UD_R_RAX,	UD_R_RCX,	UD_R_RDX,	UD_R_RBX,
  UD_R_RSP,	UD_R_RBP,	UD_R_RSI,	UD_R_RDI,
  UD_R_R8,	UD_R_R9,	UD_R_R10,	UD_R_R11,
  UD_R_R12,	UD_R_R13,	UD_R_R14,	UD_R_R15,

  /* segment registers */
  UD_R_ES,	UD_R_CS,	UD_R_SS,	UD_R_DS,
  UD_R_FS,	UD_R_GS,

  /* control registers*/
  UD_R_CR0,	UD_R_CR1,	UD_R_CR2,	UD_R_CR3,
  UD_R_CR4,	UD_R_CR5,	UD_R_CR6,	UD_R_CR7,
  UD_R_CR8,	UD_R_CR9,	UD_R_CR10,	UD_R_CR11,
  UD_R_CR12,	UD_R_CR13,	UD_R_CR14,	UD_R_CR15,

  /* debug registers */
  UD_R_DR0,	UD_R_DR1,	UD_R_DR2,	UD_R_DR3,
  UD_R_DR4,	UD_R_DR5,	UD_R_DR6,	UD_R_DR7,
  UD_R_DR8,	UD_R_DR9,	UD_R_DR10,	UD_R_DR11,
  UD_R_DR12,	UD_R_DR13,	UD_R_DR14,	UD_R_DR15,

  /* mmx registers */
  UD_R_MM0,	UD_R_MM1,	UD_R_MM2,	UD_R_MM3,
  UD_R_MM4,	UD_R_MM5,	UD_R_MM6,	UD_R_MM7,

  /* x87 registers */
  UD_R_ST0,	UD_R_ST1,	UD_R_ST2,	UD_R_ST3,
  UD_R_ST4,	UD_R_ST5,	UD_R_ST6,	UD_R_ST7,

  /* extended multimedia registers */
  UD_R_XMM0,	UD_R_XMM1,	UD_R_XMM2,	UD_R_XMM3,
  UD_R_XMM4,	UD_R_XMM5,	UD_R_XMM6,	UD_R_XMM7,
  UD_R_XMM8,	UD_R_XMM9,	UD_R_XMM10,	UD_R_XMM11,
  UD_R_XMM12,	UD_R_XMM13,	UD_R_XMM14,	UD_R_XMM15,

  UD_R_RIP,

  /* Operand Types */
  UD_OP_REG,	UD_OP_MEM,	UD_OP_PTR,	UD_OP_IMM,
  UD_OP_JIMM,	UD_OP_CONST
}

/* -----------------------------------------------------------------------------
 * struct ud_operand - Disassembled instruction Operand.
 * -----------------------------------------------------------------------------
 */
struct ptr_t
{
	ushort seg;
	uint off;
}
union lval_t
{
	byte		sbyte;
	ubyte		_ubyte;
	short		sword;
	ushort	uword;
	int		sdword;
	uint	udword;
	long		sqword;
	ulong	uqword;

	ptr_t ptr;
}
struct ud_operand
{
  ud_type		type;
  ubyte		size;
  lval_t lval;

  ud_type		base;
  ud_type		index;
  ubyte		offset;
  ubyte		scale;
};

/* -----------------------------------------------------------------------------
 * struct ud - The udis86 object.
 * -----------------------------------------------------------------------------
 */
struct ud
{
  int		(*inp_hook) (ud*);
  ubyte		inp_curr;
  ubyte		inp_fill;
  FILE*		inp_file;
  ubyte		inp_ctr;
  ubyte*	inp_buff;
  ubyte*	inp_buff_end;
  ubyte		inp_end;
  void		(*translator)(ud*);
  ulong		insn_offset;
  char		insn_hexcode[32];
  char		insn_buffer[64];
  uint		insn_fill;
  ubyte		dis_mode;
  ulong		pc;
  ubyte		vendor;
  map_entry*	mapen;
  ud_mnemonic_code	mnemonic;
  ud_operand	operand[3];
  ubyte		error;
  ubyte	 	pfx_rex;
  ubyte 		pfx_seg;
  ubyte 		pfx_opr;
  ubyte 		pfx_adr;
  ubyte 		pfx_lock;
  ubyte 		pfx_rep;
  ubyte 		pfx_repe;
  ubyte 		pfx_repne;
  ubyte 		pfx_insn;
  ubyte		default64;
  ubyte		opr_mode;
  ubyte		adr_mode;
  ubyte		br_far;
  ubyte		br_near;
  ubyte		c1;
  ubyte		c2;
  ubyte		c3;
  ubyte 		inp_cache[256];
  ubyte		inp_sess[64];

}

enum map_operand_type
{
  OP_NONE = 0,
  OP_A,
  OP_E,
  OP_M,
  OP_G,
  OP_I,
  OP_AL,
  OP_CL,
  OP_DL,
  OP_BL,
  OP_AH,
  OP_CH,
  OP_DH,
  OP_BH,
  OP_ALr8b,
  OP_CLr9b,
  OP_DLr10b,
  OP_BLr11b,
  OP_AHr12b,
  OP_CHr13b,
  OP_DHr14b,
  OP_BHr15b,
  OP_AX,
  OP_CX,
  OP_DX,
  OP_BX,
  OP_SI,
  OP_DI,
  OP_SP,
  OP_BP,
  OP_rAX,
  OP_rCX,
  OP_rDX,
  OP_rBX,
  OP_rSP,
  OP_rBP,
  OP_rSI,
  OP_rDI,
  OP_rAXr8,
  OP_rCXr9,
  OP_rDXr10,
  OP_rBXr11,
  OP_rSPr12,
  OP_rBPr13,
  OP_rSIr14,
  OP_rDIr15,
  OP_eAX,
  OP_eCX,
  OP_eDX,
  OP_eBX,
  OP_eSP,
  OP_eBP,
  OP_eSI,
  OP_eDI,
  OP_ES,
  OP_CS,
  OP_SS,
  OP_DS,
  OP_FS,
  OP_GS,
  OP_ST0,
  OP_ST1,
  OP_ST2,
  OP_ST3,
  OP_ST4,
  OP_ST5,
  OP_ST6,
  OP_ST7,
  OP_J,
  OP_S,
  OP_O,
  OP_I1,
  OP_I3,
  OP_V,
  OP_W,
  OP_Q,
  OP_P,
  OP_R,
  OP_C,
  OP_D,
  OP_VR,
  OP_PR
}

struct map_operand
{
  map_operand_type		type;
  ubyte 			size;
}

struct map_entry
{
  ud_mnemonic_code		mnemonic;
  map_operand		operand1;
  map_operand		operand2;
  map_operand		operand3;
  uint 			prefix;
}

/* -----------------------------------------------------------------------------
 * Type-definitions
 * -----------------------------------------------------------------------------
 */
alias ud_type 		ud_type_t;
alias ud_mnemonic_code	ud_mnemonic_code_t;

alias ud 		ud_t;
alias ud_operand 	ud_operand_t;

/*
#define UD_SYN_INTEL		ud_translate_intel
#define UD_SYN_ATT		ud_translate_att
#define UD_EOI			-1
#define UD_INP_CACHE_SZ		32
#define UD_VENDOR_AMD		0
#define UD_VENDOR_INTEL		1
*/

/* -----------------------------------------------------------------------------
 * extern.h
 *
 * Copyright (c) 2004, 2005, 2006, Vivek Mohan <vivek@sig9.com>
 * All rights reserved. See LICENSE
 * -----------------------------------------------------------------------------
 */

/* ============================= PUBLIC API ================================= */

extern void ud_init(ud*);

extern void ud_set_mode(ud*, ubyte);

extern void ud_set_pc(ud*, ulong);

extern void ud_set_input_hook(ud*, int (*)(ud*));

extern void ud_set_input_buffer(ud*, ubyte*, size_t);

extern void ud_set_input_file(ud*, FILE*);

extern void ud_set_vendor(ud*, ushort);

extern void ud_set_syntax(ud*, void function(ud*));

extern void ud_input_skip(ud*, size_t);

extern int ud_input_end(ud*);

extern uint ud_decode(ud*);

extern uint ud_disassemble(ud*);

extern void ud_translate_intel(ud*);

extern void ud_translate_att(ud*);

extern char* ud_insn_asm(ud* u);

extern ubyte* ud_insn_ptr(ud* u);

extern ulong ud_insn_off(ud*);

extern char* ud_insn_hex(ud*);

extern uint ud_insn_len(ud* u);

extern char* ud_lookup_mnemonic(ud_mnemonic_code c);

} // extern(C)