{-# LANGUAGE ForeignFunctionInterface , EmptyDataDecls #-} -- | Bare import of the @udis86@ C library. -- -- This module is not recommended for most users. What you see is what you get. -- The modules "Hdis86.IO" and "Hdis86.Pure" provide a more Haskell-friendly -- interface to the same functionality. -- -- If you want to use this module, see the @udis86@ documentation: -- -- Instruction opcodes are not enumerated here. You can convert between the -- C-level integer codes and the type @'Hdis86.Types.Opcode'@ using the latter's -- @'Enum'@ instance. module Hdis86.C where import Foreign import Foreign.C import Control.Monad ( liftM2 ) #include -- * The type @ud_t@ -- | Just a pointer tag, with no Haskell representation. data UD_t sizeof_ud_t :: Int sizeof_ud_t = (#size ud_t) -- * Callbacks type InputHook = IO CInt eoi :: CInt eoi = (#const UD_EOI) foreign import ccall "wrapper" wrap_InputHook :: InputHook -> IO (FunPtr InputHook) type Translator = Ptr UD_t -> IO () foreign import ccall "wrapper" wrap_Translator :: Translator -> IO (FunPtr Translator) -- * Imported functions foreign import ccall "ud_init" init :: Ptr UD_t -> IO () foreign import ccall "ud_set_input_hook" set_input_hook :: Ptr UD_t -> FunPtr InputHook -> IO () foreign import ccall "ud_set_input_buffer" set_input_buffer :: Ptr UD_t -> Ptr CChar -> CSize -> IO () foreign import ccall "ud_set_input_file" set_input_file :: Ptr UD_t -> Ptr CFile -> IO () foreign import ccall "ud_set_mode" set_mode :: Ptr UD_t -> (#type uint8_t) -> IO () foreign import ccall "ud_set_pc" set_pc :: Ptr UD_t -> (#type uint64_t) -> IO () foreign import ccall "ud_set_syntax" set_syntax :: Ptr UD_t -> FunPtr Translator -> IO () foreign import ccall "ud_set_vendor" set_vendor :: Ptr UD_t -> UD_vendor -> IO () foreign import ccall "ud_disassemble" disassemble :: Ptr UD_t -> IO CUInt foreign import ccall "ud_insn_len" insn_len :: Ptr UD_t -> IO CUInt foreign import ccall "ud_insn_off" insn_off :: Ptr UD_t -> IO (#type uint64_t) foreign import ccall "ud_insn_hex" insn_hex :: Ptr UD_t -> IO CString foreign import ccall "ud_insn_ptr" insn_ptr :: Ptr UD_t -> IO (Ptr (#type uint8_t)) foreign import ccall "ud_insn_asm" insn_asm :: Ptr UD_t -> IO CString foreign import ccall "ud_input_skip" input_skip :: Ptr UD_t -> CSize -> IO () foreign import ccall "&ud_translate_intel" translate_intel :: FunPtr Translator foreign import ccall "&ud_translate_att" translate_att :: FunPtr Translator -- * Struct accessors get_mnemonic :: Ptr UD_t -> IO CUInt get_mnemonic p = (#peek struct ud, mnemonic) p -- | Another pointer tag. data Operand get_operand1, get_operand2, get_operand3 :: Ptr UD_t -> Ptr Operand get_operand1 = (#ptr struct ud, operand[0]) get_operand2 = (#ptr struct ud, operand[1]) get_operand3 = (#ptr struct ud, operand[2]) get_type, get_base, get_index :: Ptr Operand -> IO UD_type get_type = (#peek struct ud_operand, type) get_base = (#peek struct ud_operand, base) get_index = (#peek struct ud_operand, index) get_size, get_offset, get_scale :: Ptr Operand -> IO (#type uint8_t) get_size = (#peek struct ud_operand, size) get_offset = (#peek struct ud_operand, offset) get_scale = (#peek struct ud_operand, scale) get_lval_u8 :: Ptr Operand -> IO Word8 get_lval_u8 = (#peek struct ud_operand, lval.ubyte) get_lval_u16 :: Ptr Operand -> IO Word16 get_lval_u16 = (#peek struct ud_operand, lval.uword) get_lval_u32 :: Ptr Operand -> IO Word32 get_lval_u32 = (#peek struct ud_operand, lval.udword) get_lval_u64 :: Ptr Operand -> IO Word64 get_lval_u64 = (#peek struct ud_operand, lval.uqword) get_lval_s8 :: Ptr Operand -> IO Int8 get_lval_s8 = (#peek struct ud_operand, lval.sbyte) get_lval_s16 :: Ptr Operand -> IO Int16 get_lval_s16 = (#peek struct ud_operand, lval.sword) get_lval_s32 :: Ptr Operand -> IO Int32 get_lval_s32 = (#peek struct ud_operand, lval.sdword) get_lval_s64 :: Ptr Operand -> IO Int64 get_lval_s64 = (#peek struct ud_operand, lval.sqword) get_lval_ptr :: Ptr Operand -> IO (Word16, Word32) get_lval_ptr p = liftM2 (,) ((#peek struct ud_operand, lval.ptr.seg) p) ((#peek struct ud_operand, lval.ptr.off) p) get_pfx_rex, get_pfx_seg, get_pfx_opr, get_pfx_adr, get_pfx_lock, get_pfx_rep, get_pfx_repe, get_pfx_repne :: Ptr UD_t -> IO (#type uint8_t) get_pfx_rex = (#peek ud_t, pfx_rex) get_pfx_seg = (#peek ud_t, pfx_seg) get_pfx_opr = (#peek ud_t, pfx_opr) get_pfx_adr = (#peek ud_t, pfx_adr) get_pfx_lock = (#peek ud_t, pfx_lock) get_pfx_rep = (#peek ud_t, pfx_rep) get_pfx_repe = (#peek ud_t, pfx_repe) get_pfx_repne = (#peek ud_t, pfx_repne) get_pc :: Ptr UD_t -> IO (#type uint64_t) get_pc = (#peek ud_t, pc) -- * Enumerations type UD_vendor = CUInt #enum UD_vendor,, UD_VENDOR_INTEL, UD_VENDOR_AMD type UD_type = CUInt #{enum UD_type,, UD_NONE, 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, 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, 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, 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, UD_R_ES, UD_R_CS, UD_R_SS, UD_R_DS, UD_R_FS, UD_R_GS, 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, 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, UD_R_MM0, UD_R_MM1, UD_R_MM2, UD_R_MM3, UD_R_MM4, UD_R_MM5, UD_R_MM6, UD_R_MM7, UD_R_ST0, UD_R_ST1, UD_R_ST2, UD_R_ST3, UD_R_ST4, UD_R_ST5, UD_R_ST6, UD_R_ST7, 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, UD_OP_REG, UD_OP_MEM, UD_OP_PTR, UD_OP_IMM, UD_OP_JIMM, UD_OP_CONST }