Attribute VB_Name = "uc_def"
Option Explicit

'Unicorn Engine x86 32bit wrapper class for vb6

'Contributed by: FireEye FLARE team
'Author:         David Zimmer <david.zimmer@fireeye.com>, <dzzie@yahoo.com>
'License:        Apache 2.0

' supported api:
'        ucs_version
'        ucs_arch_supported
'        ucs_open
'        ucs_close
'        uc_reg_write
'        uc_reg_read
'        uc_mem_write
'        UC_MEM_READ
'        uc_emu_start
'        uc_emu_stop
'        ucs_hook_add
'        uc_mem_map
'        uc_hook_del
'        uc_mem_regions
'        uc_mem_map_ptr
'        uc_context_alloc
'        uc_free
'        uc_context_save
'        uc_context_restore
'        uc_mem_unmap
'        uc_mem_protect
'        uc_strerror
'        uc_errno

' supported hooks:
'        UC_HOOK_CODE
'        UC_HOOK_BLOCK
'        memory READ/WRITE/FETCH
'        invalid memory access
'        interrupts
'
' bonus:
'        disasm_addr     (32bit only uses libdasm)
'        mem_write_block (map and write data auto handles alignment)
'        get_memMap      (wrapper for uc_mem_regions)
'
'

'sample supports multiple instances, required since callbacks must be in a shared module
Global instances As New Collection
Global UNICORN_PATH As String
Global DYNLOAD As Long

Public Enum uc_arch
    UC_ARCH_ARM = 1    ' ARM architecture (including Thumb, Thumb-2)
    UC_ARCH_ARM64 = 2  ' ARM-64, also called AArch64okok
    UC_ARCH_MIPS = 3   ' Mips architecture
    UC_ARCH_X86 = 4    ' X86 architecture (including x86 & x86-64)
    UC_ARCH_PPC = 5    ' PowerPC architecture (currently unsupported)
    UC_ARCH_SPARC = 6  ' Sparc architecture
    UC_ARCH_M68K = 7   ' M68K architecture
    UC_ARCH_RISCV = 8  ' RISCV architecture
    UC_ARCH_MAX = 9
End Enum

Public Enum uc_prot
   UC_PROT_NONE = 0
   UC_PROT_READ = 1
   UC_PROT_WRITE = 2
   UC_PROT_EXEC = 4
   UC_PROT_ALL = 7
End Enum

Public Enum uc_err
    uc_err_ok = 0               ' No error: everything was fine
    UC_ERR_NOMEM = 1            ' Out-Of-Memory error: uc_open(), uc_emulate()
    UC_ERR_ARCH = 2             ' Unsupported architecture: uc_open()
    UC_ERR_HANDLE = 3           ' Invalid handle
    UC_ERR_MODE = 4             ' Invalid/unsupported mode: uc_open()
    UC_ERR_VERSION = 5          ' Unsupported version (bindings)
    UC_ERR_READ_UNMAPPED = 6    ' Quit emulation due to READ on unmapped memory: uc_emu_start()
    UC_ERR_WRITE_UNMAPPED = 7   ' Quit emulation due to WRITE on unmapped memory: uc_emu_start()
    UC_ERR_FETCH_UNMAPPED = 8   ' Quit emulation due to FETCH on unmapped memory: uc_emu_start()
    UC_ERR_HOOK = 9             ' Invalid hook type: uc_hook_add()
    UC_ERR_INSN_INVALID = 10    ' Quit emulation due to invalid instruction: uc_emu_start()
    UC_ERR_MAP = 11             ' Invalid memory mapping: uc_mem_map()
    UC_ERR_WRITE_PROT = 12      ' Quit emulation due to UC_MEM_WRITE_PROT violation: uc_emu_start()
    UC_ERR_READ_PROT = 13       ' Quit emulation due to UC_MEM_READ_PROT violation: uc_emu_start()
    UC_ERR_FETCH_PROT = 14      ' Quit emulation due to UC_MEM_FETCH_PROT violation: uc_emu_start()
    UC_ERR_ARG = 15             ' Inavalid argument provided to uc_xxx function (See specific function API)
    UC_ERR_READ_UNALIGNED = 16  ' Unaligned read
    UC_ERR_WRITE_UNALIGNED = 17 ' Unaligned write
    UC_ERR_FETCH_UNALIGNED = 18 ' Unaligned fetch
    UC_ERR_HOOK_EXIST = 19      ' hook for this event already existed
    UC_ERR_RESOURCE = 20        ' Insufficient resource: uc_emu_start()
    UC_ERR_EXCEPTION = 21       ' Unhandled CPU exception
End Enum

' All type of memory accesses for UC_HOOK_MEM_*
Public Enum uc_mem_type
    UC_MEM_READ = 16           ' Memory is read from
    uc_mem_write = 17          ' Memory is written to
    UC_MEM_FETCH = 18          ' Memory is fetched
    UC_MEM_READ_UNMAPPED = 19  ' Unmapped memory is read from
    UC_MEM_WRITE_UNMAPPED = 20 ' Unmapped memory is written to
    UC_MEM_FETCH_UNMAPPED = 21 ' Unmapped memory is fetched
    UC_MEM_WRITE_PROT = 22     ' Write to write protected, but mapped, memory
    UC_MEM_READ_PROT = 23      ' Read from read protected, but mapped, memory
    UC_MEM_FETCH_PROT = 24     ' Fetch from non-executable, but mapped, memory
    UC_MEM_READ_AFTER = 25     ' Memory is read from (successful access)
End Enum

Public Enum uc_mode                   'from /bindings/dotnet/common.fs
     UC_MODE_LITTLE_ENDIAN = 0        'little-endian mode (default mode)
     UC_MODE_BIG_ENDIAN = 1073741824  'big-endian mode
'     UC_MODE_ARM = 0                  'ARM mode
'     UC_MODE_THUMB = 16               'THUMB mode (including Thumb-2)
'     UC_MODE_MCLASS = 32              'ARM's Cortex-M series (currently unsupported)
'     UC_MODE_V8 = 64                  'ARMv8 A32 encodings for ARM (currently unsupported)
'     UC_MODE_MICRO = 16               'MicroMips mode (currently unsupported)
'     UC_MODE_MIPS3 = 32               'Mips III ISA (currently unsupported)
'     UC_MODE_MIPS32R6 = 64            'Mips32r6 ISA (currently unsupported)
'     UC_MODE_MIPS32 = 4               'Mips32 ISA
'     UC_MODE_MIPS64 = 8               'Mips64 ISA
     UC_MODE_16 = 2                   '16-bit mode
     UC_MODE_32 = 4                   '32-bit mode
     UC_MODE_64 = 8                   '64-bit mode
'     UC_MODE_PPC32 = 4                '32-bit mode (currently unsupported)
'     UC_MODE_PPC64 = 8                '64-bit mode (currently unsupported)
'     UC_MODE_QPX = 16                 'Quad Processing eXtensions mode (currently unsupported)
'     UC_MODE_SPARC32 = 4              '32-bit mode
'     UC_MODE_SPARC64 = 8              '64-bit mode
'     UC_MODE_V9 = 16                  'SparcV9 mode (currently unsupported)
'     UC_MODE_RISCV32 = 4              '32-bit mode
'     UC_MODE_RISCV64 = 8              '64-bit mode
End Enum

Public Enum uc_hook_type              'from /bindings/dotnet/common.fs
     UC_HOOK_INTR = 1                 ' Hook all interrupt/syscall events
     UC_HOOK_INSN = 2                 ' Hook a particular instruction
     UC_HOOK_CODE = 4                 ' Hook a range of code
     UC_HOOK_BLOCK = 8                ' Hook basic blocks
     UC_HOOK_MEM_READ_UNMAPPED = 16   ' Hook for memory read on unmapped memory
     UC_HOOK_MEM_WRITE_UNMAPPED = 32  ' Hook for invalid memory write events
     UC_HOOK_MEM_FETCH_UNMAPPED = 64  ' Hook for invalid memory fetch for execution events
     UC_HOOK_MEM_READ_PROT = 128      ' Hook for memory read on read-protected memory
     UC_HOOK_MEM_WRITE_PROT = 256     ' Hook for memory write on write-protected memory
     UC_HOOK_MEM_FETCH_PROT = 512     ' Hook for memory fetch on non-executable memory
     UC_HOOK_MEM_READ = 1024          ' Hook memory read events.
     UC_HOOK_MEM_WRITE = 2048         ' Hook memory write events.
     UC_HOOK_MEM_FETCH = 4096         ' Hook memory fetch for execution events
     UC_HOOK_MEM_READ_AFTER = 8192    ' Hook memory read events, but only successful access.(triggered after successful read.)
     UC_HOOK_MEM_UNMAPPED = 112
     UC_HOOK_MEM_PROT = 896
     UC_HOOK_MEM_READ_INVALID = 144
     UC_HOOK_MEM_WRITE_INVALID = 288
     UC_HOOK_MEM_FETCH_INVALID = 576
     UC_HOOK_MEM_INVALID = 1008
     UC_HOOK_MEM_VALID = 7168
End Enum

Public Enum hookCatagory
    hc_code = 0
    hc_block = 1
    hc_inst = 2
    hc_int = 3
    hc_mem = 4
    hc_memInvalid = 5
End Enum

Public Enum uc_x86_reg
     UC_X86_REG_INVALID = 0
     UC_X86_REG_AH = 1
     UC_X86_REG_AL = 2
     UC_X86_REG_AX = 3
     UC_X86_REG_BH = 4
     UC_X86_REG_Bl = 5
     UC_X86_REG_BP = 6
     UC_X86_REG_BPL = 7
     UC_X86_REG_BX = 8
     UC_X86_REG_CH = 9
     UC_X86_REG_CL = 10
     UC_X86_REG_CS = 11
     UC_X86_REG_CX = 12
     UC_X86_REG_DH = 13
     UC_X86_REG_DI = 14
     UC_X86_REG_DIL = 15
     UC_X86_REG_DL = 16
     UC_X86_REG_DS = 17
     UC_X86_REG_DX = 18
     UC_X86_REG_EAX = 19
     UC_X86_REG_EBP = 20
     UC_X86_REG_EBX = 21
     UC_X86_REG_ECX = 22
     UC_X86_REG_EDI = 23
     UC_X86_REG_EDX = 24
     UC_X86_REG_EFLAGS = 25
     UC_X86_REG_EIP = 26
     UC_X86_REG_EIZ = 27
     UC_X86_REG_ES = 28
     UC_X86_REG_ESI = 29
     UC_X86_REG_ESP = 30
     UC_X86_REG_FPSW = 31
     UC_X86_REG_FS = 32
     UC_X86_REG_GS = 33
     UC_X86_REG_IP = 34
     UC_X86_REG_RAX = 35
     UC_X86_REG_RBP = 36
     UC_X86_REG_RBX = 37
     UC_X86_REG_RCX = 38
     UC_X86_REG_RDI = 39
     UC_X86_REG_RDX = 40
     UC_X86_REG_RIP = 41
     UC_X86_REG_RIZ = 42
     UC_X86_REG_RSI = 43
     UC_X86_REG_RSP = 44
     UC_X86_REG_SI = 45
     UC_X86_REG_SIL = 46
     UC_X86_REG_SP = 47
     UC_X86_REG_SPL = 48
     UC_X86_REG_SS = 49
     UC_X86_REG_CR0 = 50
     UC_X86_REG_CR1 = 51
     UC_X86_REG_CR2 = 52
     UC_X86_REG_CR3 = 53
     UC_X86_REG_CR4 = 54
     UC_X86_REG_CR5 = 55
     UC_X86_REG_CR6 = 56
     UC_X86_REG_CR7 = 57
     UC_X86_REG_CR8 = 58
     UC_X86_REG_CR9 = 59
     UC_X86_REG_CR10 = 60
     UC_X86_REG_CR11 = 61
     UC_X86_REG_CR12 = 62
     UC_X86_REG_CR13 = 63
     UC_X86_REG_CR14 = 64
     UC_X86_REG_CR15 = 65
     UC_X86_REG_DR0 = 66
     UC_X86_REG_DR1 = 67
     UC_X86_REG_DR2 = 68
     UC_X86_REG_DR3 = 69
     UC_X86_REG_DR4 = 70
     UC_X86_REG_DR5 = 71
     UC_X86_REG_DR6 = 72
     UC_X86_REG_DR7 = 73
     UC_X86_REG_DR8 = 74
     UC_X86_REG_DR9 = 75
     UC_X86_REG_DR10 = 76
     UC_X86_REG_DR11 = 77
     UC_X86_REG_DR12 = 78
     UC_X86_REG_DR13 = 79
     UC_X86_REG_DR14 = 80
     UC_X86_REG_DR15 = 81
     UC_X86_REG_FP0 = 82
     UC_X86_REG_FP1 = 83
     UC_X86_REG_FP2 = 84
     UC_X86_REG_FP3 = 85
     UC_X86_REG_FP4 = 86
     UC_X86_REG_FP5 = 87
     UC_X86_REG_FP6 = 88
     UC_X86_REG_FP7 = 89
     UC_X86_REG_K0 = 90
     UC_X86_REG_K1 = 91
     UC_X86_REG_K2 = 92
     UC_X86_REG_K3 = 93
     UC_X86_REG_K4 = 94
     UC_X86_REG_K5 = 95
     UC_X86_REG_K6 = 96
     UC_X86_REG_K7 = 97
     UC_X86_REG_MM0 = 98
     UC_X86_REG_MM1 = 99
     UC_X86_REG_MM2 = 100
     UC_X86_REG_MM3 = 101
     UC_X86_REG_MM4 = 102
     UC_X86_REG_MM5 = 103
     UC_X86_REG_MM6 = 104
     UC_X86_REG_MM7 = 105
     UC_X86_REG_R8 = 106
     UC_X86_REG_R9 = 107
     UC_X86_REG_R10 = 108
     UC_X86_REG_R11 = 109
     UC_X86_REG_R12 = 110
     UC_X86_REG_R13 = 111
     UC_X86_REG_R14 = 112
     UC_X86_REG_R15 = 113
     UC_X86_REG_ST0 = 114
     UC_X86_REG_ST1 = 115
     UC_X86_REG_ST2 = 116
     UC_X86_REG_ST3 = 117
     UC_X86_REG_ST4 = 118
     UC_X86_REG_ST5 = 119
     UC_X86_REG_ST6 = 120
     UC_X86_REG_ST7 = 121
     UC_X86_REG_XMM0 = 122
     UC_X86_REG_XMM1 = 123
     UC_X86_REG_XMM2 = 124
     UC_X86_REG_XMM3 = 125
     UC_X86_REG_XMM4 = 126
     UC_X86_REG_XMM5 = 127
     UC_X86_REG_XMM6 = 128
     UC_X86_REG_XMM7 = 129
     UC_X86_REG_XMM8 = 130
     UC_X86_REG_XMM9 = 131
     UC_X86_REG_XMM10 = 132
     UC_X86_REG_XMM11 = 133
     UC_X86_REG_XMM12 = 134
     UC_X86_REG_XMM13 = 135
     UC_X86_REG_XMM14 = 136
     UC_X86_REG_XMM15 = 137
     UC_X86_REG_XMM16 = 138
     UC_X86_REG_XMM17 = 139
     UC_X86_REG_XMM18 = 140
     UC_X86_REG_XMM19 = 141
     UC_X86_REG_XMM20 = 142
     UC_X86_REG_XMM21 = 143
     UC_X86_REG_XMM22 = 144
     UC_X86_REG_XMM23 = 145
     UC_X86_REG_XMM24 = 146
     UC_X86_REG_XMM25 = 147
     UC_X86_REG_XMM26 = 148
     UC_X86_REG_XMM27 = 149
     UC_X86_REG_XMM28 = 150
     UC_X86_REG_XMM29 = 151
     UC_X86_REG_XMM30 = 152
     UC_X86_REG_XMM31 = 153
     UC_X86_REG_YMM0 = 154
     UC_X86_REG_YMM1 = 155
     UC_X86_REG_YMM2 = 156
     UC_X86_REG_YMM3 = 157
     UC_X86_REG_YMM4 = 158
     UC_X86_REG_YMM5 = 159
     UC_X86_REG_YMM6 = 160
     UC_X86_REG_YMM7 = 161
     UC_X86_REG_YMM8 = 162
     UC_X86_REG_YMM9 = 163
     UC_X86_REG_YMM10 = 164
     UC_X86_REG_YMM11 = 165
     UC_X86_REG_YMM12 = 166
     UC_X86_REG_YMM13 = 167
     UC_X86_REG_YMM14 = 168
     UC_X86_REG_YMM15 = 169
     UC_X86_REG_YMM16 = 170
     UC_X86_REG_YMM17 = 171
     UC_X86_REG_YMM18 = 172
     UC_X86_REG_YMM19 = 173
     UC_X86_REG_YMM20 = 174
     UC_X86_REG_YMM21 = 175
     UC_X86_REG_YMM22 = 176
     UC_X86_REG_YMM23 = 177
     UC_X86_REG_YMM24 = 178
     UC_X86_REG_YMM25 = 179
     UC_X86_REG_YMM26 = 180
     UC_X86_REG_YMM27 = 181
     UC_X86_REG_YMM28 = 182
     UC_X86_REG_YMM29 = 183
     UC_X86_REG_YMM30 = 184
     UC_X86_REG_YMM31 = 185
     UC_X86_REG_ZMM0 = 186
     UC_X86_REG_ZMM1 = 187
     UC_X86_REG_ZMM2 = 188
     UC_X86_REG_ZMM3 = 189
     UC_X86_REG_ZMM4 = 190
     UC_X86_REG_ZMM5 = 191
     UC_X86_REG_ZMM6 = 192
     UC_X86_REG_ZMM7 = 193
     UC_X86_REG_ZMM8 = 194
     UC_X86_REG_ZMM9 = 195
     UC_X86_REG_ZMM10 = 196
     UC_X86_REG_ZMM11 = 197
     UC_X86_REG_ZMM12 = 198
     UC_X86_REG_ZMM13 = 199
     UC_X86_REG_ZMM14 = 200
     UC_X86_REG_ZMM15 = 201
     UC_X86_REG_ZMM16 = 202
     UC_X86_REG_ZMM17 = 203
     UC_X86_REG_ZMM18 = 204
     UC_X86_REG_ZMM19 = 205
     UC_X86_REG_ZMM20 = 206
     UC_X86_REG_ZMM21 = 207
     UC_X86_REG_ZMM22 = 208
     UC_X86_REG_ZMM23 = 209
     UC_X86_REG_ZMM24 = 210
     UC_X86_REG_ZMM25 = 211
     UC_X86_REG_ZMM26 = 212
     UC_X86_REG_ZMM27 = 213
     UC_X86_REG_ZMM28 = 214
     UC_X86_REG_ZMM29 = 215
     UC_X86_REG_ZMM30 = 216
     UC_X86_REG_ZMM31 = 217
     UC_X86_REG_R8B = 218
     UC_X86_REG_R9B = 219
     UC_X86_REG_R10B = 220
     UC_X86_REG_R11B = 221
     UC_X86_REG_R12B = 222
     UC_X86_REG_R13B = 223
     UC_X86_REG_R14B = 224
     UC_X86_REG_R15B = 225
     UC_X86_REG_R8D = 226
     UC_X86_REG_R9D = 227
     UC_X86_REG_R10D = 228
     UC_X86_REG_R11D = 229
     UC_X86_REG_R12D = 230
     UC_X86_REG_R13D = 231
     UC_X86_REG_R14D = 232
     UC_X86_REG_R15D = 233
     UC_X86_REG_R8W = 234
     UC_X86_REG_R9W = 235
     UC_X86_REG_R10W = 236
     UC_X86_REG_R11W = 237
     UC_X86_REG_R12W = 238
     UC_X86_REG_R13W = 239
     UC_X86_REG_R14W = 240
     UC_X86_REG_R15W = 241
     UC_X86_REG_IDTR = 242
     UC_X86_REG_GDTR = 243
     UC_X86_REG_LDTR = 244
     UC_X86_REG_TR = 245
     UC_X86_REG_FPCW = 246
     UC_X86_REG_FPTAG = 247
     UC_X86_REG_ENDING = 248
End Enum

'Public Enum uc_x86_insn
'     UC_X86_INS_INVALID = 0
'     UC_X86_INS_AAA = 1
'     UC_X86_INS_AAD = 2
'     UC_X86_INS_AAM = 3
'     UC_X86_INS_AAS = 4
'     UC_X86_INS_FABS = 5
'     UC_X86_INS_ADC = 6
'     UC_X86_INS_ADCX = 7
'     UC_X86_INS_ADD = 8
'     UC_X86_INS_ADDPD = 9
'     UC_X86_INS_ADDPS = 10
'     UC_X86_INS_ADDSD = 11
'     UC_X86_INS_ADDSS = 12
'     UC_X86_INS_ADDSUBPD = 13
'     UC_X86_INS_ADDSUBPS = 14
'     UC_X86_INS_FADD = 15
'     UC_X86_INS_FIADD = 16
'     UC_X86_INS_FADDP = 17
'     UC_X86_INS_ADOX = 18
'     UC_X86_INS_AESDECLAST = 19
'     UC_X86_INS_AESDEC = 20
'     UC_X86_INS_AESENCLAST = 21
'     UC_X86_INS_AESENC = 22
'     UC_X86_INS_AESIMC = 23
'     UC_X86_INS_AESKEYGENASSIST = 24
'     UC_X86_INS_AND = 25
'     UC_X86_INS_ANDN = 26
'     UC_X86_INS_ANDNPD = 27
'     UC_X86_INS_ANDNPS = 28
'     UC_X86_INS_ANDPD = 29
'     UC_X86_INS_ANDPS = 30
'     UC_X86_INS_ARPL = 31
'     UC_X86_INS_BEXTR = 32
'     UC_X86_INS_BLCFILL = 33
'     UC_X86_INS_BLCI = 34
'     UC_X86_INS_BLCIC = 35
'     UC_X86_INS_BLCMSK = 36
'     UC_X86_INS_BLCS = 37
'     UC_X86_INS_BLENDPD = 38
'     UC_X86_INS_BLENDPS = 39
'     UC_X86_INS_BLENDVPD = 40
'     UC_X86_INS_BLENDVPS = 41
'     UC_X86_INS_BLSFILL = 42
'     UC_X86_INS_BLSI = 43
'     UC_X86_INS_BLSIC = 44
'     UC_X86_INS_BLSMSK = 45
'     UC_X86_INS_BLSR = 46
'     UC_X86_INS_BOUND = 47
'     UC_X86_INS_BSF = 48
'     UC_X86_INS_BSR = 49
'     UC_X86_INS_BSWAP = 50
'     UC_X86_INS_BT = 51
'     UC_X86_INS_BTC = 52
'     UC_X86_INS_BTR = 53
'     UC_X86_INS_BTS = 54
'     UC_X86_INS_BZHI = 55
'     UC_X86_INS_CALL = 56
'     UC_X86_INS_CBW = 57
'     UC_X86_INS_CDQ = 58
'     UC_X86_INS_CDQE = 59
'     UC_X86_INS_FCHS = 60
'     UC_X86_INS_CLAC = 61
'     UC_X86_INS_CLC = 62
'     UC_X86_INS_CLD = 63
'     UC_X86_INS_CLFLUSH = 64
'     UC_X86_INS_CLFLUSHOPT = 65
'     UC_X86_INS_CLGI = 66
'     UC_X86_INS_CLI = 67
'     UC_X86_INS_CLTS = 68
'     UC_X86_INS_CLWB = 69
'     UC_X86_INS_CMC = 70
'     UC_X86_INS_CMOVA = 71
'     UC_X86_INS_CMOVAE = 72
'     UC_X86_INS_CMOVB = 73
'     UC_X86_INS_CMOVBE = 74
'     UC_X86_INS_FCMOVBE = 75
'     UC_X86_INS_FCMOVB = 76
'     UC_X86_INS_CMOVE = 77
'     UC_X86_INS_FCMOVE = 78
'     UC_X86_INS_CMOVG = 79
'     UC_X86_INS_CMOVGE = 80
'     UC_X86_INS_CMOVL = 81
'     UC_X86_INS_CMOVLE = 82
'     UC_X86_INS_FCMOVNBE = 83
'     UC_X86_INS_FCMOVNB = 84
'     UC_X86_INS_CMOVNE = 85
'     UC_X86_INS_FCMOVNE = 86
'     UC_X86_INS_CMOVNO = 87
'     UC_X86_INS_CMOVNP = 88
'     UC_X86_INS_FCMOVNU = 89
'     UC_X86_INS_CMOVNS = 90
'     UC_X86_INS_CMOVO = 91
'     UC_X86_INS_CMOVP = 92
'     UC_X86_INS_FCMOVU = 93
'     UC_X86_INS_CMOVS = 94
'     UC_X86_INS_CMP = 95
'     UC_X86_INS_CMPPD = 96
'     UC_X86_INS_CMPPS = 97
'     UC_X86_INS_CMPSB = 98
'     UC_X86_INS_CMPSD = 99
'     UC_X86_INS_CMPSQ = 100
'     UC_X86_INS_CMPSS = 101
'     UC_X86_INS_CMPSW = 102
'     UC_X86_INS_CMPXCHG16B = 103
'     UC_X86_INS_CMPXCHG = 104
'     UC_X86_INS_CMPXCHG8B = 105
'     UC_X86_INS_COMISD = 106
'     UC_X86_INS_COMISS = 107
'     UC_X86_INS_FCOMP = 108
'     UC_X86_INS_FCOMPI = 109
'     UC_X86_INS_FCOMI = 110
'     UC_X86_INS_FCOM = 111
'     UC_X86_INS_FCOS = 112
'     UC_X86_INS_CPUID = 113
'     UC_X86_INS_CQO = 114
'     UC_X86_INS_CRC32 = 115
'     UC_X86_INS_CVTDQ2PD = 116
'     UC_X86_INS_CVTDQ2PS = 117
'     UC_X86_INS_CVTPD2DQ = 118
'     UC_X86_INS_CVTPD2PS = 119
'     UC_X86_INS_CVTPS2DQ = 120
'     UC_X86_INS_CVTPS2PD = 121
'     UC_X86_INS_CVTSD2SI = 122
'     UC_X86_INS_CVTSD2SS = 123
'     UC_X86_INS_CVTSI2SD = 124
'     UC_X86_INS_CVTSI2SS = 125
'     UC_X86_INS_CVTSS2SD = 126
'     UC_X86_INS_CVTSS2SI = 127
'     UC_X86_INS_CVTTPD2DQ = 128
'     UC_X86_INS_CVTTPS2DQ = 129
'     UC_X86_INS_CVTTSD2SI = 130
'     UC_X86_INS_CVTTSS2SI = 131
'     UC_X86_INS_CWD = 132
'     UC_X86_INS_CWDE = 133
'     UC_X86_INS_DAA = 134
'     UC_X86_INS_DAS = 135
'     UC_X86_INS_DATA16 = 136
'     UC_X86_INS_DEC = 137
'     UC_X86_INS_DIV = 138
'     UC_X86_INS_DIVPD = 139
'     UC_X86_INS_DIVPS = 140
'     UC_X86_INS_FDIVR = 141
'     UC_X86_INS_FIDIVR = 142
'     UC_X86_INS_FDIVRP = 143
'     UC_X86_INS_DIVSD = 144
'     UC_X86_INS_DIVSS = 145
'     UC_X86_INS_FDIV = 146
'     UC_X86_INS_FIDIV = 147
'     UC_X86_INS_FDIVP = 148
'     UC_X86_INS_DPPD = 149
'     UC_X86_INS_DPPS = 150
'     UC_X86_INS_RET = 151
'     UC_X86_INS_ENCLS = 152
'     UC_X86_INS_ENCLU = 153
'     UC_X86_INS_ENTER = 154
'     UC_X86_INS_EXTRACTPS = 155
'     UC_X86_INS_EXTRQ = 156
'     UC_X86_INS_F2XM1 = 157
'     UC_X86_INS_LCALL = 158
'     UC_X86_INS_LJMP = 159
'     UC_X86_INS_FBLD = 160
'     UC_X86_INS_FBSTP = 161
'     UC_X86_INS_FCOMPP = 162
'     UC_X86_INS_FDECSTP = 163
'     UC_X86_INS_FEMMS = 164
'     UC_X86_INS_FFREE = 165
'     UC_X86_INS_FICOM = 166
'     UC_X86_INS_FICOMP = 167
'     UC_X86_INS_FINCSTP = 168
'     UC_X86_INS_FLDCW = 169
'     UC_X86_INS_FLDENV = 170
'     UC_X86_INS_FLDL2E = 171
'     UC_X86_INS_FLDL2T = 172
'     UC_X86_INS_FLDLG2 = 173
'     UC_X86_INS_FLDLN2 = 174
'     UC_X86_INS_FLDPI = 175
'     UC_X86_INS_FNCLEX = 176
'     UC_X86_INS_FNINIT = 177
'     UC_X86_INS_FNOP = 178
'     UC_X86_INS_FNSTCW = 179
'     UC_X86_INS_FNSTSW = 180
'     UC_X86_INS_FPATAN = 181
'     UC_X86_INS_FPREM = 182
'     UC_X86_INS_FPREM1 = 183
'     UC_X86_INS_FPTAN = 184
'     UC_X86_INS_FFREEP = 185
'     UC_X86_INS_FRNDINT = 186
'     UC_X86_INS_FRSTOR = 187
'     UC_X86_INS_FNSAVE = 188
'     UC_X86_INS_FSCALE = 189
'     UC_X86_INS_FSETPM = 190
'     UC_X86_INS_FSINCOS = 191
'     UC_X86_INS_FNSTENV = 192
'     UC_X86_INS_FXAM = 193
'     UC_X86_INS_FXRSTOR = 194
'     UC_X86_INS_FXRSTOR64 = 195
'     UC_X86_INS_FXSAVE = 196
'     UC_X86_INS_FXSAVE64 = 197
'     UC_X86_INS_FXTRACT = 198
'     UC_X86_INS_FYL2X = 199
'     UC_X86_INS_FYL2XP1 = 200
'     UC_X86_INS_MOVAPD = 201
'     UC_X86_INS_MOVAPS = 202
'     UC_X86_INS_ORPD = 203
'     UC_X86_INS_ORPS = 204
'     UC_X86_INS_VMOVAPD = 205
'     UC_X86_INS_VMOVAPS = 206
'     UC_X86_INS_XORPD = 207
'     UC_X86_INS_XORPS = 208
'     UC_X86_INS_GETSEC = 209
'     UC_X86_INS_HADDPD = 210
'     UC_X86_INS_HADDPS = 211
'     UC_X86_INS_HLT = 212
'     UC_X86_INS_HSUBPD = 213
'     UC_X86_INS_HSUBPS = 214
'     UC_X86_INS_IDIV = 215
'     UC_X86_INS_FILD = 216
'     UC_X86_INS_IMUL = 217
'     UC_X86_INS_IN = 218
'     UC_X86_INS_INC = 219
'     UC_X86_INS_INSB = 220
'     UC_X86_INS_INSERTPS = 221
'     UC_X86_INS_INSERTQ = 222
'     UC_X86_INS_INSD = 223
'     UC_X86_INS_INSW = 224
'     UC_X86_INS_INT = 225
'     UC_X86_INS_INT1 = 226
'     UC_X86_INS_INT3 = 227
'     UC_X86_INS_INTO = 228
'     UC_X86_INS_INVD = 229
'     UC_X86_INS_INVEPT = 230
'     UC_X86_INS_INVLPG = 231
'     UC_X86_INS_INVLPGA = 232
'     UC_X86_INS_INVPCID = 233
'     UC_X86_INS_INVVPID = 234
'     UC_X86_INS_IRET = 235
'     UC_X86_INS_IRETD = 236
'     UC_X86_INS_IRETQ = 237
'     UC_X86_INS_FISTTP = 238
'     UC_X86_INS_FIST = 239
'     UC_X86_INS_FISTP = 240
'     UC_X86_INS_UCOMISD = 241
'     UC_X86_INS_UCOMISS = 242
'     UC_X86_INS_VCOMISD = 243
'     UC_X86_INS_VCOMISS = 244
'     UC_X86_INS_VCVTSD2SS = 245
'     UC_X86_INS_VCVTSI2SD = 246
'     UC_X86_INS_VCVTSI2SS = 247
'     UC_X86_INS_VCVTSS2SD = 248
'     UC_X86_INS_VCVTTSD2SI = 249
'     UC_X86_INS_VCVTTSD2USI = 250
'     UC_X86_INS_VCVTTSS2SI = 251
'     UC_X86_INS_VCVTTSS2USI = 252
'     UC_X86_INS_VCVTUSI2SD = 253
'     UC_X86_INS_VCVTUSI2SS = 254
'     UC_X86_INS_VUCOMISD = 255
'     UC_X86_INS_VUCOMISS = 256
'     UC_X86_INS_JAE = 257
'     UC_X86_INS_JA = 258
'     UC_X86_INS_JBE = 259
'     UC_X86_INS_JB = 260
'     UC_X86_INS_JCXZ = 261
'     UC_X86_INS_JECXZ = 262
'     UC_X86_INS_JE = 263
'     UC_X86_INS_JGE = 264
'     UC_X86_INS_JG = 265
'     UC_X86_INS_JLE = 266
'     UC_X86_INS_JL = 267
'     UC_X86_INS_JMP = 268
'     UC_X86_INS_JNE = 269
'     UC_X86_INS_JNO = 270
'     UC_X86_INS_JNP = 271
'     UC_X86_INS_JNS = 272
'     UC_X86_INS_JO = 273
'     UC_X86_INS_JP = 274
'     UC_X86_INS_JRCXZ = 275
'     UC_X86_INS_JS = 276
'     UC_X86_INS_KANDB = 277
'     UC_X86_INS_KANDD = 278
'     UC_X86_INS_KANDNB = 279
'     UC_X86_INS_KANDND = 280
'     UC_X86_INS_KANDNQ = 281
'     UC_X86_INS_KANDNW = 282
'     UC_X86_INS_KANDQ = 283
'     UC_X86_INS_KANDW = 284
'     UC_X86_INS_KMOVB = 285
'     UC_X86_INS_KMOVD = 286
'     UC_X86_INS_KMOVQ = 287
'     UC_X86_INS_KMOVW = 288
'     UC_X86_INS_KNOTB = 289
'     UC_X86_INS_KNOTD = 290
'     UC_X86_INS_KNOTQ = 291
'     UC_X86_INS_KNOTW = 292
'     UC_X86_INS_KORB = 293
'     UC_X86_INS_KORD = 294
'     UC_X86_INS_KORQ = 295
'     UC_X86_INS_KORTESTB = 296
'     UC_X86_INS_KORTESTD = 297
'     UC_X86_INS_KORTESTQ = 298
'     UC_X86_INS_KORTESTW = 299
'     UC_X86_INS_KORW = 300
'     UC_X86_INS_KSHIFTLB = 301
'     UC_X86_INS_KSHIFTLD = 302
'     UC_X86_INS_KSHIFTLQ = 303
'     UC_X86_INS_KSHIFTLW = 304
'     UC_X86_INS_KSHIFTRB = 305
'     UC_X86_INS_KSHIFTRD = 306
'     UC_X86_INS_KSHIFTRQ = 307
'     UC_X86_INS_KSHIFTRW = 308
'     UC_X86_INS_KUNPCKBW = 309
'     UC_X86_INS_KXNORB = 310
'     UC_X86_INS_KXNORD = 311
'     UC_X86_INS_KXNORQ = 312
'     UC_X86_INS_KXNORW = 313
'     UC_X86_INS_KXORB = 314
'     UC_X86_INS_KXORD = 315
'     UC_X86_INS_KXORQ = 316
'     UC_X86_INS_KXORW = 317
'     UC_X86_INS_LAHF = 318
'     UC_X86_INS_LAR = 319
'     UC_X86_INS_LDDQU = 320
'     UC_X86_INS_LDMXCSR = 321
'     UC_X86_INS_LDS = 322
'     UC_X86_INS_FLDZ = 323
'     UC_X86_INS_FLD1 = 324
'     UC_X86_INS_FLD = 325
'     UC_X86_INS_LEA = 326
'     UC_X86_INS_LEAVE = 327
'     UC_X86_INS_LES = 328
'     UC_X86_INS_LFENCE = 329
'     UC_X86_INS_LFS = 330
'     UC_X86_INS_LGDT = 331
'     UC_X86_INS_LGS = 332
'     UC_X86_INS_LIDT = 333
'     UC_X86_INS_LLDT = 334
'     UC_X86_INS_LMSW = 335
'     UC_X86_INS_OR = 336
'     UC_X86_INS_SUB = 337
'     UC_X86_INS_XOR = 338
'     UC_X86_INS_LODSB = 339
'     UC_X86_INS_LODSD = 340
'     UC_X86_INS_LODSQ = 341
'     UC_X86_INS_LODSW = 342
'     UC_X86_INS_LOOP = 343
'     UC_X86_INS_LOOPE = 344
'     UC_X86_INS_LOOPNE = 345
'     UC_X86_INS_RETF = 346
'     UC_X86_INS_RETFQ = 347
'     UC_X86_INS_LSL = 348
'     UC_X86_INS_LSS = 349
'     UC_X86_INS_LTR = 350
'     UC_X86_INS_XADD = 351
'     UC_X86_INS_LZCNT = 352
'     UC_X86_INS_MASKMOVDQU = 353
'     UC_X86_INS_MAXPD = 354
'     UC_X86_INS_MAXPS = 355
'     UC_X86_INS_MAXSD = 356
'     UC_X86_INS_MAXSS = 357
'     UC_X86_INS_MFENCE = 358
'     UC_X86_INS_MINPD = 359
'     UC_X86_INS_MINPS = 360
'     UC_X86_INS_MINSD = 361
'     UC_X86_INS_MINSS = 362
'     UC_X86_INS_CVTPD2PI = 363
'     UC_X86_INS_CVTPI2PD = 364
'     UC_X86_INS_CVTPI2PS = 365
'     UC_X86_INS_CVTPS2PI = 366
'     UC_X86_INS_CVTTPD2PI = 367
'     UC_X86_INS_CVTTPS2PI = 368
'     UC_X86_INS_EMMS = 369
'     UC_X86_INS_MASKMOVQ = 370
'     UC_X86_INS_MOVD = 371
'     UC_X86_INS_MOVDQ2Q = 372
'     UC_X86_INS_MOVNTQ = 373
'     UC_X86_INS_MOVQ2DQ = 374
'     UC_X86_INS_MOVQ = 375
'     UC_X86_INS_PABSB = 376
'     UC_X86_INS_PABSD = 377
'     UC_X86_INS_PABSW = 378
'     UC_X86_INS_PACKSSDW = 379
'     UC_X86_INS_PACKSSWB = 380
'     UC_X86_INS_PACKUSWB = 381
'     UC_X86_INS_PADDB = 382
'     UC_X86_INS_PADDD = 383
'     UC_X86_INS_PADDQ = 384
'     UC_X86_INS_PADDSB = 385
'     UC_X86_INS_PADDSW = 386
'     UC_X86_INS_PADDUSB = 387
'     UC_X86_INS_PADDUSW = 388
'     UC_X86_INS_PADDW = 389
'     UC_X86_INS_PALIGNR = 390
'     UC_X86_INS_PANDN = 391
'     UC_X86_INS_PAND = 392
'     UC_X86_INS_PAVGB = 393
'     UC_X86_INS_PAVGW = 394
'     UC_X86_INS_PCMPEQB = 395
'     UC_X86_INS_PCMPEQD = 396
'     UC_X86_INS_PCMPEQW = 397
'     UC_X86_INS_PCMPGTB = 398
'     UC_X86_INS_PCMPGTD = 399
'     UC_X86_INS_PCMPGTW = 400
'     UC_X86_INS_PEXTRW = 401
'     UC_X86_INS_PHADDSW = 402
'     UC_X86_INS_PHADDW = 403
'     UC_X86_INS_PHADDD = 404
'     UC_X86_INS_PHSUBD = 405
'     UC_X86_INS_PHSUBSW = 406
'     UC_X86_INS_PHSUBW = 407
'     UC_X86_INS_PINSRW = 408
'     UC_X86_INS_PMADDUBSW = 409
'     UC_X86_INS_PMADDWD = 410
'     UC_X86_INS_PMAXSW = 411
'     UC_X86_INS_PMAXUB = 412
'     UC_X86_INS_PMINSW = 413
'     UC_X86_INS_PMINUB = 414
'     UC_X86_INS_PMOVMSKB = 415
'     UC_X86_INS_PMULHRSW = 416
'     UC_X86_INS_PMULHUW = 417
'     UC_X86_INS_PMULHW = 418
'     UC_X86_INS_PMULLW = 419
'     UC_X86_INS_PMULUDQ = 420
'     UC_X86_INS_POR = 421
'     UC_X86_INS_PSADBW = 422
'     UC_X86_INS_PSHUFB = 423
'     UC_X86_INS_PSHUFW = 424
'     UC_X86_INS_PSIGNB = 425
'     UC_X86_INS_PSIGND = 426
'     UC_X86_INS_PSIGNW = 427
'     UC_X86_INS_PSLLD = 428
'     UC_X86_INS_PSLLQ = 429
'     UC_X86_INS_PSLLW = 430
'     UC_X86_INS_PSRAD = 431
'     UC_X86_INS_PSRAW = 432
'     UC_X86_INS_PSRLD = 433
'     UC_X86_INS_PSRLQ = 434
'     UC_X86_INS_PSRLW = 435
'     UC_X86_INS_PSUBB = 436
'     UC_X86_INS_PSUBD = 437
'     UC_X86_INS_PSUBQ = 438
'     UC_X86_INS_PSUBSB = 439
'     UC_X86_INS_PSUBSW = 440
'     UC_X86_INS_PSUBUSB = 441
'     UC_X86_INS_PSUBUSW = 442
'     UC_X86_INS_PSUBW = 443
'     UC_X86_INS_PUNPCKHBW = 444
'     UC_X86_INS_PUNPCKHDQ = 445
'     UC_X86_INS_PUNPCKHWD = 446
'     UC_X86_INS_PUNPCKLBW = 447
'     UC_X86_INS_PUNPCKLDQ = 448
'     UC_X86_INS_PUNPCKLWD = 449
'     UC_X86_INS_PXOR = 450
'     UC_X86_INS_MONITOR = 451
'     UC_X86_INS_MONTMUL = 452
'     UC_X86_INS_MOV = 453
'     UC_X86_INS_MOVABS = 454
'     UC_X86_INS_MOVBE = 455
'     UC_X86_INS_MOVDDUP = 456
'     UC_X86_INS_MOVDQA = 457
'     UC_X86_INS_MOVDQU = 458
'     UC_X86_INS_MOVHLPS = 459
'     UC_X86_INS_MOVHPD = 460
'     UC_X86_INS_MOVHPS = 461
'     UC_X86_INS_MOVLHPS = 462
'     UC_X86_INS_MOVLPD = 463
'     UC_X86_INS_MOVLPS = 464
'     UC_X86_INS_MOVMSKPD = 465
'     UC_X86_INS_MOVMSKPS = 466
'     UC_X86_INS_MOVNTDQA = 467
'     UC_X86_INS_MOVNTDQ = 468
'     UC_X86_INS_MOVNTI = 469
'     UC_X86_INS_MOVNTPD = 470
'     UC_X86_INS_MOVNTPS = 471
'     UC_X86_INS_MOVNTSD = 472
'     UC_X86_INS_MOVNTSS = 473
'     UC_X86_INS_MOVSB = 474
'     UC_X86_INS_MOVSD = 475
'     UC_X86_INS_MOVSHDUP = 476
'     UC_X86_INS_MOVSLDUP = 477
'     UC_X86_INS_MOVSQ = 478
'     UC_X86_INS_MOVSS = 479
'     UC_X86_INS_MOVSW = 480
'     UC_X86_INS_MOVSX = 481
'     UC_X86_INS_MOVSXD = 482
'     UC_X86_INS_MOVUPD = 483
'     UC_X86_INS_MOVUPS = 484
'     UC_X86_INS_MOVZX = 485
'     UC_X86_INS_MPSADBW = 486
'     UC_X86_INS_MUL = 487
'     UC_X86_INS_MULPD = 488
'     UC_X86_INS_MULPS = 489
'     UC_X86_INS_MULSD = 490
'     UC_X86_INS_MULSS = 491
'     UC_X86_INS_MULX = 492
'     UC_X86_INS_FMUL = 493
'     UC_X86_INS_FIMUL = 494
'     UC_X86_INS_FMULP = 495
'     UC_X86_INS_MWAIT = 496
'     UC_X86_INS_NEG = 497
'     UC_X86_INS_NOP = 498
'     UC_X86_INS_NOT = 499
'     UC_X86_INS_OUT = 500
'     UC_X86_INS_OUTSB = 501
'     UC_X86_INS_OUTSD = 502
'     UC_X86_INS_OUTSW = 503
'     UC_X86_INS_PACKUSDW = 504
'     UC_X86_INS_PAUSE = 505
'     UC_X86_INS_PAVGUSB = 506
'     UC_X86_INS_PBLENDVB = 507
'     UC_X86_INS_PBLENDW = 508
'     UC_X86_INS_PCLMULQDQ = 509
'     UC_X86_INS_PCMPEQQ = 510
'     UC_X86_INS_PCMPESTRI = 511
'     UC_X86_INS_PCMPESTRM = 512
'     UC_X86_INS_PCMPGTQ = 513
'     UC_X86_INS_PCMPISTRI = 514
'     UC_X86_INS_PCMPISTRM = 515
'     UC_X86_INS_PCOMMIT = 516
'     UC_X86_INS_PDEP = 517
'     UC_X86_INS_PEXT = 518
'     UC_X86_INS_PEXTRB = 519
'     UC_X86_INS_PEXTRD = 520
'     UC_X86_INS_PEXTRQ = 521
'     UC_X86_INS_PF2ID = 522
'     UC_X86_INS_PF2IW = 523
'     UC_X86_INS_PFACC = 524
'     UC_X86_INS_PFADD = 525
'     UC_X86_INS_PFCMPEQ = 526
'     UC_X86_INS_PFCMPGE = 527
'     UC_X86_INS_PFCMPGT = 528
'     UC_X86_INS_PFMAX = 529
'     UC_X86_INS_PFMIN = 530
'     UC_X86_INS_PFMUL = 531
'     UC_X86_INS_PFNACC = 532
'     UC_X86_INS_PFPNACC = 533
'     UC_X86_INS_PFRCPIT1 = 534
'     UC_X86_INS_PFRCPIT2 = 535
'     UC_X86_INS_PFRCP = 536
'     UC_X86_INS_PFRSQIT1 = 537
'     UC_X86_INS_PFRSQRT = 538
'     UC_X86_INS_PFSUBR = 539
'     UC_X86_INS_PFSUB = 540
'     UC_X86_INS_PHMINPOSUW = 541
'     UC_X86_INS_PI2FD = 542
'     UC_X86_INS_PI2FW = 543
'     UC_X86_INS_PINSRB = 544
'     UC_X86_INS_PINSRD = 545
'     UC_X86_INS_PINSRQ = 546
'     UC_X86_INS_PMAXSB = 547
'     UC_X86_INS_PMAXSD = 548
'     UC_X86_INS_PMAXUD = 549
'     UC_X86_INS_PMAXUW = 550
'     UC_X86_INS_PMINSB = 551
'     UC_X86_INS_PMINSD = 552
'     UC_X86_INS_PMINUD = 553
'     UC_X86_INS_PMINUW = 554
'     UC_X86_INS_PMOVSXBD = 555
'     UC_X86_INS_PMOVSXBQ = 556
'     UC_X86_INS_PMOVSXBW = 557
'     UC_X86_INS_PMOVSXDQ = 558
'     UC_X86_INS_PMOVSXWD = 559
'     UC_X86_INS_PMOVSXWQ = 560
'     UC_X86_INS_PMOVZXBD = 561
'     UC_X86_INS_PMOVZXBQ = 562
'     UC_X86_INS_PMOVZXBW = 563
'     UC_X86_INS_PMOVZXDQ = 564
'     UC_X86_INS_PMOVZXWD = 565
'     UC_X86_INS_PMOVZXWQ = 566
'     UC_X86_INS_PMULDQ = 567
'     UC_X86_INS_PMULHRW = 568
'     UC_X86_INS_PMULLD = 569
'     UC_X86_INS_POP = 570
'     UC_X86_INS_POPAW = 571
'     UC_X86_INS_POPAL = 572
'     UC_X86_INS_POPCNT = 573
'     UC_X86_INS_POPF = 574
'     UC_X86_INS_POPFD = 575
'     UC_X86_INS_POPFQ = 576
'     UC_X86_INS_PREFETCH = 577
'     UC_X86_INS_PREFETCHNTA = 578
'     UC_X86_INS_PREFETCHT0 = 579
'     UC_X86_INS_PREFETCHT1 = 580
'     UC_X86_INS_PREFETCHT2 = 581
'     UC_X86_INS_PREFETCHW = 582
'     UC_X86_INS_PSHUFD = 583
'     UC_X86_INS_PSHUFHW = 584
'     UC_X86_INS_PSHUFLW = 585
'     UC_X86_INS_PSLLDQ = 586
'     UC_X86_INS_PSRLDQ = 587
'     UC_X86_INS_PSWAPD = 588
'     UC_X86_INS_PTEST = 589
'     UC_X86_INS_PUNPCKHQDQ = 590
'     UC_X86_INS_PUNPCKLQDQ = 591
'     UC_X86_INS_PUSH = 592
'     UC_X86_INS_PUSHAW = 593
'     UC_X86_INS_PUSHAL = 594
'     UC_X86_INS_PUSHF = 595
'     UC_X86_INS_PUSHFD = 596
'     UC_X86_INS_PUSHFQ = 597
'     UC_X86_INS_RCL = 598
'     UC_X86_INS_RCPPS = 599
'     UC_X86_INS_RCPSS = 600
'     UC_X86_INS_RCR = 601
'     UC_X86_INS_RDFSBASE = 602
'     UC_X86_INS_RDGSBASE = 603
'     UC_X86_INS_RDMSR = 604
'     UC_X86_INS_RDPMC = 605
'     UC_X86_INS_RDRAND = 606
'     UC_X86_INS_RDSEED = 607
'     UC_X86_INS_RDTSC = 608
'     UC_X86_INS_RDTSCP = 609
'     UC_X86_INS_ROL = 610
'     UC_X86_INS_ROR = 611
'     UC_X86_INS_RORX = 612
'     UC_X86_INS_ROUNDPD = 613
'     UC_X86_INS_ROUNDPS = 614
'     UC_X86_INS_ROUNDSD = 615
'     UC_X86_INS_ROUNDSS = 616
'     UC_X86_INS_RSM = 617
'     UC_X86_INS_RSQRTPS = 618
'     UC_X86_INS_RSQRTSS = 619
'     UC_X86_INS_SAHF = 620
'     UC_X86_INS_SAL = 621
'     UC_X86_INS_SALC = 622
'     UC_X86_INS_SAR = 623
'     UC_X86_INS_SARX = 624
'     UC_X86_INS_SBB = 625
'     UC_X86_INS_SCASB = 626
'     UC_X86_INS_SCASD = 627
'     UC_X86_INS_SCASQ = 628
'     UC_X86_INS_SCASW = 629
'     UC_X86_INS_SETAE = 630
'     UC_X86_INS_SETA = 631
'     UC_X86_INS_SETBE = 632
'     UC_X86_INS_SETB = 633
'     UC_X86_INS_SETE = 634
'     UC_X86_INS_SETGE = 635
'     UC_X86_INS_SETG = 636
'     UC_X86_INS_SETLE = 637
'     UC_X86_INS_SETL = 638
'     UC_X86_INS_SETNE = 639
'     UC_X86_INS_SETNO = 640
'     UC_X86_INS_SETNP = 641
'     UC_X86_INS_SETNS = 642
'     UC_X86_INS_SETO = 643
'     UC_X86_INS_SETP = 644
'     UC_X86_INS_SETS = 645
'     UC_X86_INS_SFENCE = 646
'     UC_X86_INS_SGDT = 647
'     UC_X86_INS_SHA1MSG1 = 648
'     UC_X86_INS_SHA1MSG2 = 649
'     UC_X86_INS_SHA1NEXTE = 650
'     UC_X86_INS_SHA1RNDS4 = 651
'     UC_X86_INS_SHA256MSG1 = 652
'     UC_X86_INS_SHA256MSG2 = 653
'     UC_X86_INS_SHA256RNDS2 = 654
'     UC_X86_INS_SHL = 655
'     UC_X86_INS_SHLD = 656
'     UC_X86_INS_SHLX = 657
'     UC_X86_INS_SHR = 658
'     UC_X86_INS_SHRD = 659
'     UC_X86_INS_SHRX = 660
'     UC_X86_INS_SHUFPD = 661
'     UC_X86_INS_SHUFPS = 662
'     UC_X86_INS_SIDT = 663
'     UC_X86_INS_FSIN = 664
'     UC_X86_INS_SKINIT = 665
'     UC_X86_INS_SLDT = 666
'     UC_X86_INS_SMSW = 667
'     UC_X86_INS_SQRTPD = 668
'     UC_X86_INS_SQRTPS = 669
'     UC_X86_INS_SQRTSD = 670
'     UC_X86_INS_SQRTSS = 671
'     UC_X86_INS_FSQRT = 672
'     UC_X86_INS_STAC = 673
'     UC_X86_INS_STC = 674
'     UC_X86_INS_STD = 675
'     UC_X86_INS_STGI = 676
'     UC_X86_INS_STI = 677
'     UC_X86_INS_STMXCSR = 678
'     UC_X86_INS_STOSB = 679
'     UC_X86_INS_STOSD = 680
'     UC_X86_INS_STOSQ = 681
'     UC_X86_INS_STOSW = 682
'     UC_X86_INS_STR = 683
'     UC_X86_INS_FST = 684
'     UC_X86_INS_FSTP = 685
'     UC_X86_INS_FSTPNCE = 686
'     UC_X86_INS_FXCH = 687
'     UC_X86_INS_SUBPD = 688
'     UC_X86_INS_SUBPS = 689
'     UC_X86_INS_FSUBR = 690
'     UC_X86_INS_FISUBR = 691
'     UC_X86_INS_FSUBRP = 692
'     UC_X86_INS_SUBSD = 693
'     UC_X86_INS_SUBSS = 694
'     UC_X86_INS_FSUB = 695
'     UC_X86_INS_FISUB = 696
'     UC_X86_INS_FSUBP = 697
'     UC_X86_INS_SWAPGS = 698
'     UC_X86_INS_SYSCALL = 699
'     UC_X86_INS_SYSENTER = 700
'     UC_X86_INS_SYSEXIT = 701
'     UC_X86_INS_SYSRET = 702
'     UC_X86_INS_T1MSKC = 703
'     UC_X86_INS_TEST = 704
'     UC_X86_INS_UD2 = 705
'     UC_X86_INS_FTST = 706
'     UC_X86_INS_TZCNT = 707
'     UC_X86_INS_TZMSK = 708
'     UC_X86_INS_FUCOMPI = 709
'     UC_X86_INS_FUCOMI = 710
'     UC_X86_INS_FUCOMPP = 711
'     UC_X86_INS_FUCOMP = 712
'     UC_X86_INS_FUCOM = 713
'     UC_X86_INS_UD2B = 714
'     UC_X86_INS_UNPCKHPD = 715
'     UC_X86_INS_UNPCKHPS = 716
'     UC_X86_INS_UNPCKLPD = 717
'     UC_X86_INS_UNPCKLPS = 718
'     UC_X86_INS_VADDPD = 719
'     UC_X86_INS_VADDPS = 720
'     UC_X86_INS_VADDSD = 721
'     UC_X86_INS_VADDSS = 722
'     UC_X86_INS_VADDSUBPD = 723
'     UC_X86_INS_VADDSUBPS = 724
'     UC_X86_INS_VAESDECLAST = 725
'     UC_X86_INS_VAESDEC = 726
'     UC_X86_INS_VAESENCLAST = 727
'     UC_X86_INS_VAESENC = 728
'     UC_X86_INS_VAESIMC = 729
'     UC_X86_INS_VAESKEYGENASSIST = 730
'     UC_X86_INS_VALIGND = 731
'     UC_X86_INS_VALIGNQ = 732
'     UC_X86_INS_VANDNPD = 733
'     UC_X86_INS_VANDNPS = 734
'     UC_X86_INS_VANDPD = 735
'     UC_X86_INS_VANDPS = 736
'     UC_X86_INS_VBLENDMPD = 737
'     UC_X86_INS_VBLENDMPS = 738
'     UC_X86_INS_VBLENDPD = 739
'     UC_X86_INS_VBLENDPS = 740
'     UC_X86_INS_VBLENDVPD = 741
'     UC_X86_INS_VBLENDVPS = 742
'     UC_X86_INS_VBROADCASTF128 = 743
'     UC_X86_INS_VBROADCASTI32X4 = 744
'     UC_X86_INS_VBROADCASTI64X4 = 745
'     UC_X86_INS_VBROADCASTSD = 746
'     UC_X86_INS_VBROADCASTSS = 747
'     UC_X86_INS_VCMPPD = 748
'     UC_X86_INS_VCMPPS = 749
'     UC_X86_INS_VCMPSD = 750
'     UC_X86_INS_VCMPSS = 751
'     UC_X86_INS_VCOMPRESSPD = 752
'     UC_X86_INS_VCOMPRESSPS = 753
'     UC_X86_INS_VCVTDQ2PD = 754
'     UC_X86_INS_VCVTDQ2PS = 755
'     UC_X86_INS_VCVTPD2DQX = 756
'     UC_X86_INS_VCVTPD2DQ = 757
'     UC_X86_INS_VCVTPD2PSX = 758
'     UC_X86_INS_VCVTPD2PS = 759
'     UC_X86_INS_VCVTPD2UDQ = 760
'     UC_X86_INS_VCVTPH2PS = 761
'     UC_X86_INS_VCVTPS2DQ = 762
'     UC_X86_INS_VCVTPS2PD = 763
'     UC_X86_INS_VCVTPS2PH = 764
'     UC_X86_INS_VCVTPS2UDQ = 765
'     UC_X86_INS_VCVTSD2SI = 766
'     UC_X86_INS_VCVTSD2USI = 767
'     UC_X86_INS_VCVTSS2SI = 768
'     UC_X86_INS_VCVTSS2USI = 769
'     UC_X86_INS_VCVTTPD2DQX = 770
'     UC_X86_INS_VCVTTPD2DQ = 771
'     UC_X86_INS_VCVTTPD2UDQ = 772
'     UC_X86_INS_VCVTTPS2DQ = 773
'     UC_X86_INS_VCVTTPS2UDQ = 774
'     UC_X86_INS_VCVTUDQ2PD = 775
'     UC_X86_INS_VCVTUDQ2PS = 776
'     UC_X86_INS_VDIVPD = 777
'     UC_X86_INS_VDIVPS = 778
'     UC_X86_INS_VDIVSD = 779
'     UC_X86_INS_VDIVSS = 780
'     UC_X86_INS_VDPPD = 781
'     UC_X86_INS_VDPPS = 782
'     UC_X86_INS_VERR = 783
'     UC_X86_INS_VERW = 784
'     UC_X86_INS_VEXP2PD = 785
'     UC_X86_INS_VEXP2PS = 786
'     UC_X86_INS_VEXPANDPD = 787
'     UC_X86_INS_VEXPANDPS = 788
'     UC_X86_INS_VEXTRACTF128 = 789
'     UC_X86_INS_VEXTRACTF32X4 = 790
'     UC_X86_INS_VEXTRACTF64X4 = 791
'     UC_X86_INS_VEXTRACTI128 = 792
'     UC_X86_INS_VEXTRACTI32X4 = 793
'     UC_X86_INS_VEXTRACTI64X4 = 794
'     UC_X86_INS_VEXTRACTPS = 795
'     UC_X86_INS_VFMADD132PD = 796
'     UC_X86_INS_VFMADD132PS = 797
'     UC_X86_INS_VFMADDPD = 798
'     UC_X86_INS_VFMADD213PD = 799
'     UC_X86_INS_VFMADD231PD = 800
'     UC_X86_INS_VFMADDPS = 801
'     UC_X86_INS_VFMADD213PS = 802
'     UC_X86_INS_VFMADD231PS = 803
'     UC_X86_INS_VFMADDSD = 804
'     UC_X86_INS_VFMADD213SD = 805
'     UC_X86_INS_VFMADD132SD = 806
'     UC_X86_INS_VFMADD231SD = 807
'     UC_X86_INS_VFMADDSS = 808
'     UC_X86_INS_VFMADD213SS = 809
'     UC_X86_INS_VFMADD132SS = 810
'     UC_X86_INS_VFMADD231SS = 811
'     UC_X86_INS_VFMADDSUB132PD = 812
'     UC_X86_INS_VFMADDSUB132PS = 813
'     UC_X86_INS_VFMADDSUBPD = 814
'     UC_X86_INS_VFMADDSUB213PD = 815
'     UC_X86_INS_VFMADDSUB231PD = 816
'     UC_X86_INS_VFMADDSUBPS = 817
'     UC_X86_INS_VFMADDSUB213PS = 818
'     UC_X86_INS_VFMADDSUB231PS = 819
'     UC_X86_INS_VFMSUB132PD = 820
'     UC_X86_INS_VFMSUB132PS = 821
'     UC_X86_INS_VFMSUBADD132PD = 822
'     UC_X86_INS_VFMSUBADD132PS = 823
'     UC_X86_INS_VFMSUBADDPD = 824
'     UC_X86_INS_VFMSUBADD213PD = 825
'     UC_X86_INS_VFMSUBADD231PD = 826
'     UC_X86_INS_VFMSUBADDPS = 827
'     UC_X86_INS_VFMSUBADD213PS = 828
'     UC_X86_INS_VFMSUBADD231PS = 829
'     UC_X86_INS_VFMSUBPD = 830
'     UC_X86_INS_VFMSUB213PD = 831
'     UC_X86_INS_VFMSUB231PD = 832
'     UC_X86_INS_VFMSUBPS = 833
'     UC_X86_INS_VFMSUB213PS = 834
'     UC_X86_INS_VFMSUB231PS = 835
'     UC_X86_INS_VFMSUBSD = 836
'     UC_X86_INS_VFMSUB213SD = 837
'     UC_X86_INS_VFMSUB132SD = 838
'     UC_X86_INS_VFMSUB231SD = 839
'     UC_X86_INS_VFMSUBSS = 840
'     UC_X86_INS_VFMSUB213SS = 841
'     UC_X86_INS_VFMSUB132SS = 842
'     UC_X86_INS_VFMSUB231SS = 843
'     UC_X86_INS_VFNMADD132PD = 844
'     UC_X86_INS_VFNMADD132PS = 845
'     UC_X86_INS_VFNMADDPD = 846
'     UC_X86_INS_VFNMADD213PD = 847
'     UC_X86_INS_VFNMADD231PD = 848
'     UC_X86_INS_VFNMADDPS = 849
'     UC_X86_INS_VFNMADD213PS = 850
'     UC_X86_INS_VFNMADD231PS = 851
'     UC_X86_INS_VFNMADDSD = 852
'     UC_X86_INS_VFNMADD213SD = 853
'     UC_X86_INS_VFNMADD132SD = 854
'     UC_X86_INS_VFNMADD231SD = 855
'     UC_X86_INS_VFNMADDSS = 856
'     UC_X86_INS_VFNMADD213SS = 857
'     UC_X86_INS_VFNMADD132SS = 858
'     UC_X86_INS_VFNMADD231SS = 859
'     UC_X86_INS_VFNMSUB132PD = 860
'     UC_X86_INS_VFNMSUB132PS = 861
'     UC_X86_INS_VFNMSUBPD = 862
'     UC_X86_INS_VFNMSUB213PD = 863
'     UC_X86_INS_VFNMSUB231PD = 864
'     UC_X86_INS_VFNMSUBPS = 865
'     UC_X86_INS_VFNMSUB213PS = 866
'     UC_X86_INS_VFNMSUB231PS = 867
'     UC_X86_INS_VFNMSUBSD = 868
'     UC_X86_INS_VFNMSUB213SD = 869
'     UC_X86_INS_VFNMSUB132SD = 870
'     UC_X86_INS_VFNMSUB231SD = 871
'     UC_X86_INS_VFNMSUBSS = 872
'     UC_X86_INS_VFNMSUB213SS = 873
'     UC_X86_INS_VFNMSUB132SS = 874
'     UC_X86_INS_VFNMSUB231SS = 875
'     UC_X86_INS_VFRCZPD = 876
'     UC_X86_INS_VFRCZPS = 877
'     UC_X86_INS_VFRCZSD = 878
'     UC_X86_INS_VFRCZSS = 879
'     UC_X86_INS_VORPD = 880
'     UC_X86_INS_VORPS = 881
'     UC_X86_INS_VXORPD = 882
'     UC_X86_INS_VXORPS = 883
'     UC_X86_INS_VGATHERDPD = 884
'     UC_X86_INS_VGATHERDPS = 885
'     UC_X86_INS_VGATHERPF0DPD = 886
'     UC_X86_INS_VGATHERPF0DPS = 887
'     UC_X86_INS_VGATHERPF0QPD = 888
'     UC_X86_INS_VGATHERPF0QPS = 889
'     UC_X86_INS_VGATHERPF1DPD = 890
'     UC_X86_INS_VGATHERPF1DPS = 891
'     UC_X86_INS_VGATHERPF1QPD = 892
'     UC_X86_INS_VGATHERPF1QPS = 893
'     UC_X86_INS_VGATHERQPD = 894
'     UC_X86_INS_VGATHERQPS = 895
'     UC_X86_INS_VHADDPD = 896
'     UC_X86_INS_VHADDPS = 897
'     UC_X86_INS_VHSUBPD = 898
'     UC_X86_INS_VHSUBPS = 899
'     UC_X86_INS_VINSERTF128 = 900
'     UC_X86_INS_VINSERTF32X4 = 901
'     UC_X86_INS_VINSERTF32X8 = 902
'     UC_X86_INS_VINSERTF64X2 = 903
'     UC_X86_INS_VINSERTF64X4 = 904
'     UC_X86_INS_VINSERTI128 = 905
'     UC_X86_INS_VINSERTI32X4 = 906
'     UC_X86_INS_VINSERTI32X8 = 907
'     UC_X86_INS_VINSERTI64X2 = 908
'     UC_X86_INS_VINSERTI64X4 = 909
'     UC_X86_INS_VINSERTPS = 910
'     UC_X86_INS_VLDDQU = 911
'     UC_X86_INS_VLDMXCSR = 912
'     UC_X86_INS_VMASKMOVDQU = 913
'     UC_X86_INS_VMASKMOVPD = 914
'     UC_X86_INS_VMASKMOVPS = 915
'     UC_X86_INS_VMAXPD = 916
'     UC_X86_INS_VMAXPS = 917
'     UC_X86_INS_VMAXSD = 918
'     UC_X86_INS_VMAXSS = 919
'     UC_X86_INS_VMCALL = 920
'     UC_X86_INS_VMCLEAR = 921
'     UC_X86_INS_VMFUNC = 922
'     UC_X86_INS_VMINPD = 923
'     UC_X86_INS_VMINPS = 924
'     UC_X86_INS_VMINSD = 925
'     UC_X86_INS_VMINSS = 926
'     UC_X86_INS_VMLAUNCH = 927
'     UC_X86_INS_VMLOAD = 928
'     UC_X86_INS_VMMCALL = 929
'     UC_X86_INS_VMOVQ = 930
'     UC_X86_INS_VMOVDDUP = 931
'     UC_X86_INS_VMOVD = 932
'     UC_X86_INS_VMOVDQA32 = 933
'     UC_X86_INS_VMOVDQA64 = 934
'     UC_X86_INS_VMOVDQA = 935
'     UC_X86_INS_VMOVDQU16 = 936
'     UC_X86_INS_VMOVDQU32 = 937
'     UC_X86_INS_VMOVDQU64 = 938
'     UC_X86_INS_VMOVDQU8 = 939
'     UC_X86_INS_VMOVDQU = 940
'     UC_X86_INS_VMOVHLPS = 941
'     UC_X86_INS_VMOVHPD = 942
'     UC_X86_INS_VMOVHPS = 943
'     UC_X86_INS_VMOVLHPS = 944
'     UC_X86_INS_VMOVLPD = 945
'     UC_X86_INS_VMOVLPS = 946
'     UC_X86_INS_VMOVMSKPD = 947
'     UC_X86_INS_VMOVMSKPS = 948
'     UC_X86_INS_VMOVNTDQA = 949
'     UC_X86_INS_VMOVNTDQ = 950
'     UC_X86_INS_VMOVNTPD = 951
'     UC_X86_INS_VMOVNTPS = 952
'     UC_X86_INS_VMOVSD = 953
'     UC_X86_INS_VMOVSHDUP = 954
'     UC_X86_INS_VMOVSLDUP = 955
'     UC_X86_INS_VMOVSS = 956
'     UC_X86_INS_VMOVUPD = 957
'     UC_X86_INS_VMOVUPS = 958
'     UC_X86_INS_VMPSADBW = 959
'     UC_X86_INS_VMPTRLD = 960
'     UC_X86_INS_VMPTRST = 961
'     UC_X86_INS_VMREAD = 962
'     UC_X86_INS_VMRESUME = 963
'     UC_X86_INS_VMRUN = 964
'     UC_X86_INS_VMSAVE = 965
'     UC_X86_INS_VMULPD = 966
'     UC_X86_INS_VMULPS = 967
'     UC_X86_INS_VMULSD = 968
'     UC_X86_INS_VMULSS = 969
'     UC_X86_INS_VMWRITE = 970
'     UC_X86_INS_VMXOFF = 971
'     UC_X86_INS_VMXON = 972
'     UC_X86_INS_VPABSB = 973
'     UC_X86_INS_VPABSD = 974
'     UC_X86_INS_VPABSQ = 975
'     UC_X86_INS_VPABSW = 976
'     UC_X86_INS_VPACKSSDW = 977
'     UC_X86_INS_VPACKSSWB = 978
'     UC_X86_INS_VPACKUSDW = 979
'     UC_X86_INS_VPACKUSWB = 980
'     UC_X86_INS_VPADDB = 981
'     UC_X86_INS_VPADDD = 982
'     UC_X86_INS_VPADDQ = 983
'     UC_X86_INS_VPADDSB = 984
'     UC_X86_INS_VPADDSW = 985
'     UC_X86_INS_VPADDUSB = 986
'     UC_X86_INS_VPADDUSW = 987
'     UC_X86_INS_VPADDW = 988
'     UC_X86_INS_VPALIGNR = 989
'     UC_X86_INS_VPANDD = 990
'     UC_X86_INS_VPANDND = 991
'     UC_X86_INS_VPANDNQ = 992
'     UC_X86_INS_VPANDN = 993
'     UC_X86_INS_VPANDQ = 994
'     UC_X86_INS_VPAND = 995
'     UC_X86_INS_VPAVGB = 996
'     UC_X86_INS_VPAVGW = 997
'     UC_X86_INS_VPBLENDD = 998
'     UC_X86_INS_VPBLENDMB = 999
'     UC_X86_INS_VPBLENDMD = 1000
'     UC_X86_INS_VPBLENDMQ = 1001
'     UC_X86_INS_VPBLENDMW = 1002
'     UC_X86_INS_VPBLENDVB = 1003
'     UC_X86_INS_VPBLENDW = 1004
'     UC_X86_INS_VPBROADCASTB = 1005
'     UC_X86_INS_VPBROADCASTD = 1006
'     UC_X86_INS_VPBROADCASTMB2Q = 1007
'     UC_X86_INS_VPBROADCASTMW2D = 1008
'     UC_X86_INS_VPBROADCASTQ = 1009
'     UC_X86_INS_VPBROADCASTW = 1010
'     UC_X86_INS_VPCLMULQDQ = 1011
'     UC_X86_INS_VPCMOV = 1012
'     UC_X86_INS_VPCMPB = 1013
'     UC_X86_INS_VPCMPD = 1014
'     UC_X86_INS_VPCMPEQB = 1015
'     UC_X86_INS_VPCMPEQD = 1016
'     UC_X86_INS_VPCMPEQQ = 1017
'     UC_X86_INS_VPCMPEQW = 1018
'     UC_X86_INS_VPCMPESTRI = 1019
'     UC_X86_INS_VPCMPESTRM = 1020
'     UC_X86_INS_VPCMPGTB = 1021
'     UC_X86_INS_VPCMPGTD = 1022
'     UC_X86_INS_VPCMPGTQ = 1023
'     UC_X86_INS_VPCMPGTW = 1024
'     UC_X86_INS_VPCMPISTRI = 1025
'     UC_X86_INS_VPCMPISTRM = 1026
'     UC_X86_INS_VPCMPQ = 1027
'     UC_X86_INS_VPCMPUB = 1028
'     UC_X86_INS_VPCMPUD = 1029
'     UC_X86_INS_VPCMPUQ = 1030
'     UC_X86_INS_VPCMPUW = 1031
'     UC_X86_INS_VPCMPW = 1032
'     UC_X86_INS_VPCOMB = 1033
'     UC_X86_INS_VPCOMD = 1034
'     UC_X86_INS_VPCOMPRESSD = 1035
'     UC_X86_INS_VPCOMPRESSQ = 1036
'     UC_X86_INS_VPCOMQ = 1037
'     UC_X86_INS_VPCOMUB = 1038
'     UC_X86_INS_VPCOMUD = 1039
'     UC_X86_INS_VPCOMUQ = 1040
'     UC_X86_INS_VPCOMUW = 1041
'     UC_X86_INS_VPCOMW = 1042
'     UC_X86_INS_VPCONFLICTD = 1043
'     UC_X86_INS_VPCONFLICTQ = 1044
'     UC_X86_INS_VPERM2F128 = 1045
'     UC_X86_INS_VPERM2I128 = 1046
'     UC_X86_INS_VPERMD = 1047
'     UC_X86_INS_VPERMI2D = 1048
'     UC_X86_INS_VPERMI2PD = 1049
'     UC_X86_INS_VPERMI2PS = 1050
'     UC_X86_INS_VPERMI2Q = 1051
'     UC_X86_INS_VPERMIL2PD = 1052
'     UC_X86_INS_VPERMIL2PS = 1053
'     UC_X86_INS_VPERMILPD = 1054
'     UC_X86_INS_VPERMILPS = 1055
'     UC_X86_INS_VPERMPD = 1056
'     UC_X86_INS_VPERMPS = 1057
'     UC_X86_INS_VPERMQ = 1058
'     UC_X86_INS_VPERMT2D = 1059
'     UC_X86_INS_VPERMT2PD = 1060
'     UC_X86_INS_VPERMT2PS = 1061
'     UC_X86_INS_VPERMT2Q = 1062
'     UC_X86_INS_VPEXPANDD = 1063
'     UC_X86_INS_VPEXPANDQ = 1064
'     UC_X86_INS_VPEXTRB = 1065
'     UC_X86_INS_VPEXTRD = 1066
'     UC_X86_INS_VPEXTRQ = 1067
'     UC_X86_INS_VPEXTRW = 1068
'     UC_X86_INS_VPGATHERDD = 1069
'     UC_X86_INS_VPGATHERDQ = 1070
'     UC_X86_INS_VPGATHERQD = 1071
'     UC_X86_INS_VPGATHERQQ = 1072
'     UC_X86_INS_VPHADDBD = 1073
'     UC_X86_INS_VPHADDBQ = 1074
'     UC_X86_INS_VPHADDBW = 1075
'     UC_X86_INS_VPHADDDQ = 1076
'     UC_X86_INS_VPHADDD = 1077
'     UC_X86_INS_VPHADDSW = 1078
'     UC_X86_INS_VPHADDUBD = 1079
'     UC_X86_INS_VPHADDUBQ = 1080
'     UC_X86_INS_VPHADDUBW = 1081
'     UC_X86_INS_VPHADDUDQ = 1082
'     UC_X86_INS_VPHADDUWD = 1083
'     UC_X86_INS_VPHADDUWQ = 1084
'     UC_X86_INS_VPHADDWD = 1085
'     UC_X86_INS_VPHADDWQ = 1086
'     UC_X86_INS_VPHADDW = 1087
'     UC_X86_INS_VPHMINPOSUW = 1088
'     UC_X86_INS_VPHSUBBW = 1089
'     UC_X86_INS_VPHSUBDQ = 1090
'     UC_X86_INS_VPHSUBD = 1091
'     UC_X86_INS_VPHSUBSW = 1092
'     UC_X86_INS_VPHSUBWD = 1093
'     UC_X86_INS_VPHSUBW = 1094
'     UC_X86_INS_VPINSRB = 1095
'     UC_X86_INS_VPINSRD = 1096
'     UC_X86_INS_VPINSRQ = 1097
'     UC_X86_INS_VPINSRW = 1098
'     UC_X86_INS_VPLZCNTD = 1099
'     UC_X86_INS_VPLZCNTQ = 1100
'     UC_X86_INS_VPMACSDD = 1101
'     UC_X86_INS_VPMACSDQH = 1102
'     UC_X86_INS_VPMACSDQL = 1103
'     UC_X86_INS_VPMACSSDD = 1104
'     UC_X86_INS_VPMACSSDQH = 1105
'     UC_X86_INS_VPMACSSDQL = 1106
'     UC_X86_INS_VPMACSSWD = 1107
'     UC_X86_INS_VPMACSSWW = 1108
'     UC_X86_INS_VPMACSWD = 1109
'     UC_X86_INS_VPMACSWW = 1110
'     UC_X86_INS_VPMADCSSWD = 1111
'     UC_X86_INS_VPMADCSWD = 1112
'     UC_X86_INS_VPMADDUBSW = 1113
'     UC_X86_INS_VPMADDWD = 1114
'     UC_X86_INS_VPMASKMOVD = 1115
'     UC_X86_INS_VPMASKMOVQ = 1116
'     UC_X86_INS_VPMAXSB = 1117
'     UC_X86_INS_VPMAXSD = 1118
'     UC_X86_INS_VPMAXSQ = 1119
'     UC_X86_INS_VPMAXSW = 1120
'     UC_X86_INS_VPMAXUB = 1121
'     UC_X86_INS_VPMAXUD = 1122
'     UC_X86_INS_VPMAXUQ = 1123
'     UC_X86_INS_VPMAXUW = 1124
'     UC_X86_INS_VPMINSB = 1125
'     UC_X86_INS_VPMINSD = 1126
'     UC_X86_INS_VPMINSQ = 1127
'     UC_X86_INS_VPMINSW = 1128
'     UC_X86_INS_VPMINUB = 1129
'     UC_X86_INS_VPMINUD = 1130
'     UC_X86_INS_VPMINUQ = 1131
'     UC_X86_INS_VPMINUW = 1132
'     UC_X86_INS_VPMOVDB = 1133
'     UC_X86_INS_VPMOVDW = 1134
'     UC_X86_INS_VPMOVM2B = 1135
'     UC_X86_INS_VPMOVM2D = 1136
'     UC_X86_INS_VPMOVM2Q = 1137
'     UC_X86_INS_VPMOVM2W = 1138
'     UC_X86_INS_VPMOVMSKB = 1139
'     UC_X86_INS_VPMOVQB = 1140
'     UC_X86_INS_VPMOVQD = 1141
'     UC_X86_INS_VPMOVQW = 1142
'     UC_X86_INS_VPMOVSDB = 1143
'     UC_X86_INS_VPMOVSDW = 1144
'     UC_X86_INS_VPMOVSQB = 1145
'     UC_X86_INS_VPMOVSQD = 1146
'     UC_X86_INS_VPMOVSQW = 1147
'     UC_X86_INS_VPMOVSXBD = 1148
'     UC_X86_INS_VPMOVSXBQ = 1149
'     UC_X86_INS_VPMOVSXBW = 1150
'     UC_X86_INS_VPMOVSXDQ = 1151
'     UC_X86_INS_VPMOVSXWD = 1152
'     UC_X86_INS_VPMOVSXWQ = 1153
'     UC_X86_INS_VPMOVUSDB = 1154
'     UC_X86_INS_VPMOVUSDW = 1155
'     UC_X86_INS_VPMOVUSQB = 1156
'     UC_X86_INS_VPMOVUSQD = 1157
'     UC_X86_INS_VPMOVUSQW = 1158
'     UC_X86_INS_VPMOVZXBD = 1159
'     UC_X86_INS_VPMOVZXBQ = 1160
'     UC_X86_INS_VPMOVZXBW = 1161
'     UC_X86_INS_VPMOVZXDQ = 1162
'     UC_X86_INS_VPMOVZXWD = 1163
'     UC_X86_INS_VPMOVZXWQ = 1164
'     UC_X86_INS_VPMULDQ = 1165
'     UC_X86_INS_VPMULHRSW = 1166
'     UC_X86_INS_VPMULHUW = 1167
'     UC_X86_INS_VPMULHW = 1168
'     UC_X86_INS_VPMULLD = 1169
'     UC_X86_INS_VPMULLQ = 1170
'     UC_X86_INS_VPMULLW = 1171
'     UC_X86_INS_VPMULUDQ = 1172
'     UC_X86_INS_VPORD = 1173
'     UC_X86_INS_VPORQ = 1174
'     UC_X86_INS_VPOR = 1175
'     UC_X86_INS_VPPERM = 1176
'     UC_X86_INS_VPROTB = 1177
'     UC_X86_INS_VPROTD = 1178
'     UC_X86_INS_VPROTQ = 1179
'     UC_X86_INS_VPROTW = 1180
'     UC_X86_INS_VPSADBW = 1181
'     UC_X86_INS_VPSCATTERDD = 1182
'     UC_X86_INS_VPSCATTERDQ = 1183
'     UC_X86_INS_VPSCATTERQD = 1184
'     UC_X86_INS_VPSCATTERQQ = 1185
'     UC_X86_INS_VPSHAB = 1186
'     UC_X86_INS_VPSHAD = 1187
'     UC_X86_INS_VPSHAQ = 1188
'     UC_X86_INS_VPSHAW = 1189
'     UC_X86_INS_VPSHLB = 1190
'     UC_X86_INS_VPSHLD = 1191
'     UC_X86_INS_VPSHLQ = 1192
'     UC_X86_INS_VPSHLW = 1193
'     UC_X86_INS_VPSHUFB = 1194
'     UC_X86_INS_VPSHUFD = 1195
'     UC_X86_INS_VPSHUFHW = 1196
'     UC_X86_INS_VPSHUFLW = 1197
'     UC_X86_INS_VPSIGNB = 1198
'     UC_X86_INS_VPSIGND = 1199
'     UC_X86_INS_VPSIGNW = 1200
'     UC_X86_INS_VPSLLDQ = 1201
'     UC_X86_INS_VPSLLD = 1202
'     UC_X86_INS_VPSLLQ = 1203
'     UC_X86_INS_VPSLLVD = 1204
'     UC_X86_INS_VPSLLVQ = 1205
'     UC_X86_INS_VPSLLW = 1206
'     UC_X86_INS_VPSRAD = 1207
'     UC_X86_INS_VPSRAQ = 1208
'     UC_X86_INS_VPSRAVD = 1209
'     UC_X86_INS_VPSRAVQ = 1210
'     UC_X86_INS_VPSRAW = 1211
'     UC_X86_INS_VPSRLDQ = 1212
'     UC_X86_INS_VPSRLD = 1213
'     UC_X86_INS_VPSRLQ = 1214
'     UC_X86_INS_VPSRLVD = 1215
'     UC_X86_INS_VPSRLVQ = 1216
'     UC_X86_INS_VPSRLW = 1217
'     UC_X86_INS_VPSUBB = 1218
'     UC_X86_INS_VPSUBD = 1219
'     UC_X86_INS_VPSUBQ = 1220
'     UC_X86_INS_VPSUBSB = 1221
'     UC_X86_INS_VPSUBSW = 1222
'     UC_X86_INS_VPSUBUSB = 1223
'     UC_X86_INS_VPSUBUSW = 1224
'     UC_X86_INS_VPSUBW = 1225
'     UC_X86_INS_VPTESTMD = 1226
'     UC_X86_INS_VPTESTMQ = 1227
'     UC_X86_INS_VPTESTNMD = 1228
'     UC_X86_INS_VPTESTNMQ = 1229
'     UC_X86_INS_VPTEST = 1230
'     UC_X86_INS_VPUNPCKHBW = 1231
'     UC_X86_INS_VPUNPCKHDQ = 1232
'     UC_X86_INS_VPUNPCKHQDQ = 1233
'     UC_X86_INS_VPUNPCKHWD = 1234
'     UC_X86_INS_VPUNPCKLBW = 1235
'     UC_X86_INS_VPUNPCKLDQ = 1236
'     UC_X86_INS_VPUNPCKLQDQ = 1237
'     UC_X86_INS_VPUNPCKLWD = 1238
'     UC_X86_INS_VPXORD = 1239
'     UC_X86_INS_VPXORQ = 1240
'     UC_X86_INS_VPXOR = 1241
'     UC_X86_INS_VRCP14PD = 1242
'     UC_X86_INS_VRCP14PS = 1243
'     UC_X86_INS_VRCP14SD = 1244
'     UC_X86_INS_VRCP14SS = 1245
'     UC_X86_INS_VRCP28PD = 1246
'     UC_X86_INS_VRCP28PS = 1247
'     UC_X86_INS_VRCP28SD = 1248
'     UC_X86_INS_VRCP28SS = 1249
'     UC_X86_INS_VRCPPS = 1250
'     UC_X86_INS_VRCPSS = 1251
'     UC_X86_INS_VRNDSCALEPD = 1252
'     UC_X86_INS_VRNDSCALEPS = 1253
'     UC_X86_INS_VRNDSCALESD = 1254
'     UC_X86_INS_VRNDSCALESS = 1255
'     UC_X86_INS_VROUNDPD = 1256
'     UC_X86_INS_VROUNDPS = 1257
'     UC_X86_INS_VROUNDSD = 1258
'     UC_X86_INS_VROUNDSS = 1259
'     UC_X86_INS_VRSQRT14PD = 1260
'     UC_X86_INS_VRSQRT14PS = 1261
'     UC_X86_INS_VRSQRT14SD = 1262
'     UC_X86_INS_VRSQRT14SS = 1263
'     UC_X86_INS_VRSQRT28PD = 1264
'     UC_X86_INS_VRSQRT28PS = 1265
'     UC_X86_INS_VRSQRT28SD = 1266
'     UC_X86_INS_VRSQRT28SS = 1267
'     UC_X86_INS_VRSQRTPS = 1268
'     UC_X86_INS_VRSQRTSS = 1269
'     UC_X86_INS_VSCATTERDPD = 1270
'     UC_X86_INS_VSCATTERDPS = 1271
'     UC_X86_INS_VSCATTERPF0DPD = 1272
'     UC_X86_INS_VSCATTERPF0DPS = 1273
'     UC_X86_INS_VSCATTERPF0QPD = 1274
'     UC_X86_INS_VSCATTERPF0QPS = 1275
'     UC_X86_INS_VSCATTERPF1DPD = 1276
'     UC_X86_INS_VSCATTERPF1DPS = 1277
'     UC_X86_INS_VSCATTERPF1QPD = 1278
'     UC_X86_INS_VSCATTERPF1QPS = 1279
'     UC_X86_INS_VSCATTERQPD = 1280
'     UC_X86_INS_VSCATTERQPS = 1281
'     UC_X86_INS_VSHUFPD = 1282
'     UC_X86_INS_VSHUFPS = 1283
'     UC_X86_INS_VSQRTPD = 1284
'     UC_X86_INS_VSQRTPS = 1285
'     UC_X86_INS_VSQRTSD = 1286
'     UC_X86_INS_VSQRTSS = 1287
'     UC_X86_INS_VSTMXCSR = 1288
'     UC_X86_INS_VSUBPD = 1289
'     UC_X86_INS_VSUBPS = 1290
'     UC_X86_INS_VSUBSD = 1291
'     UC_X86_INS_VSUBSS = 1292
'     UC_X86_INS_VTESTPD = 1293
'     UC_X86_INS_VTESTPS = 1294
'     UC_X86_INS_VUNPCKHPD = 1295
'     UC_X86_INS_VUNPCKHPS = 1296
'     UC_X86_INS_VUNPCKLPD = 1297
'     UC_X86_INS_VUNPCKLPS = 1298
'     UC_X86_INS_VZEROALL = 1299
'     UC_X86_INS_VZEROUPPER = 1300
'     UC_X86_INS_WAIT = 1301
'     UC_X86_INS_WBINVD = 1302
'     UC_X86_INS_WRFSBASE = 1303
'     UC_X86_INS_WRGSBASE = 1304
'     UC_X86_INS_WRMSR = 1305
'     UC_X86_INS_XABORT = 1306
'     UC_X86_INS_XACQUIRE = 1307
'     UC_X86_INS_XBEGIN = 1308
'     UC_X86_INS_XCHG = 1309
'     UC_X86_INS_XCRYPTCBC = 1310
'     UC_X86_INS_XCRYPTCFB = 1311
'     UC_X86_INS_XCRYPTCTR = 1312
'     UC_X86_INS_XCRYPTECB = 1313
'     UC_X86_INS_XCRYPTOFB = 1314
'     UC_X86_INS_XEND = 1315
'     UC_X86_INS_XGETBV = 1316
'     UC_X86_INS_XLATB = 1317
'     UC_X86_INS_XRELEASE = 1318
'     UC_X86_INS_XRSTOR = 1319
'     UC_X86_INS_XRSTOR64 = 1320
'     UC_X86_INS_XRSTORS = 1321
'     UC_X86_INS_XRSTORS64 = 1322
'     UC_X86_INS_XSAVE = 1323
'     UC_X86_INS_XSAVE64 = 1324
'     UC_X86_INS_XSAVEC = 1325
'     UC_X86_INS_XSAVEC64 = 1326
'     UC_X86_INS_XSAVEOPT = 1327
'     UC_X86_INS_XSAVEOPT64 = 1328
'     UC_X86_INS_XSAVES = 1329
'     UC_X86_INS_XSAVES64 = 1330
'     UC_X86_INS_XSETBV = 1331
'     UC_X86_INS_XSHA1 = 1332
'     UC_X86_INS_XSHA256 = 1333
'     UC_X86_INS_XSTORE = 1334
'     UC_X86_INS_XTEST = 1335
'     UC_X86_INS_FDISI8087_NOP = 1336
'     UC_X86_INS_FENI8087_NOP = 1337
'     UC_X86_INS_ENDING = 1338
'End Enum

'-- [x86 specific] ---------------

'// Memory-Management Register for instructions IDTR, GDTR, LDTR, TR.
'// Borrow from SegmentCache in qemu/target-i386/cpu.h
'typedef struct uc_x86_mmr {
'    uint16_t selector;  /* not used by GDTR and IDTR */
'    uint64_t base;      /* handle 32 or 64 bit CPUs */
'    uint32_t limit;
'    uint32_t flags;     /* not used by GDTR and IDTR */
'} uc_x86_mmr;
'
'// Callback function for tracing SYSCALL/SYSENTER (for uc_hook_intr())
'// @user_data: user data passed to tracing APIs.
'typedef void (*uc_cb_insn_syscall_t)(struct uc_struct *uc, void *user_data);

'--------------------------------

'// Hook type for all events of unmapped memory access
'#define UC_HOOK_MEM_UNMAPPED (UC_HOOK_MEM_READ_UNMAPPED + UC_HOOK_MEM_WRITE_UNMAPPED + UC_HOOK_MEM_FETCH_UNMAPPED)
'// Hook type for all events of illegal protected memory access
'#define UC_HOOK_MEM_PROT (UC_HOOK_MEM_READ_PROT + UC_HOOK_MEM_WRITE_PROT + UC_HOOK_MEM_FETCH_PROT)
'// Hook type for all events of illegal read memory access
'#define UC_HOOK_MEM_READ_INVALID (UC_HOOK_MEM_READ_PROT + UC_HOOK_MEM_READ_UNMAPPED)
'// Hook type for all events of illegal write memory access
'#define UC_HOOK_MEM_WRITE_INVALID (UC_HOOK_MEM_WRITE_PROT + UC_HOOK_MEM_WRITE_UNMAPPED)
'// Hook type for all events of illegal fetch memory access
'#define UC_HOOK_MEM_FETCH_INVALID (UC_HOOK_MEM_FETCH_PROT + UC_HOOK_MEM_FETCH_UNMAPPED)
'// Hook type for all events of illegal memory access
'#define UC_HOOK_MEM_INVALID (UC_HOOK_MEM_UNMAPPED + UC_HOOK_MEM_PROT)
'// Hook type for all events of valid memory access
'#define UC_HOOK_MEM_VALID (UC_HOOK_MEM_READ + UC_HOOK_MEM_WRITE + UC_HOOK_MEM_FETCH)



'/*
'  Callback function for tracing code (UC_HOOK_CODE & UC_HOOK_BLOCK)
'
'  @address: address where the code is being executed
'  @size: size of machine instruction(s) being executed, or 0 when size is unknown
'  @user_data: user data passed to tracing APIs.
'*/
'typedef void (*uc_cb_hookcode_t)(uc_engine *uc, uint64_t address, uint32_t size, void *user_data);
'  public sub code_hook(byval uc as long , byval address as currency, byval size as long, byval user_data as long)
'
'/*
'  Callback function for tracing interrupts (for uc_hook_intr())
'
'  @intno: interrupt number
'  @user_data: user data passed to tracing APIs.
'*/
'typedef void (*uc_cb_hookintr_t)(uc_engine *uc, uint32_t intno, void *user_data);
'
'/*
'  Callback function for tracing IN instruction of X86
'
'  @port: port number
'  @size: data size (1/2/4) to be read from this port
'  @user_data: user data passed to tracing APIs.
'*/
'typedef uint32_t (*uc_cb_insn_in_t)(uc_engine *uc, uint32_t port, int size, void *user_data);
'
'/*
'  Callback function for OUT instruction of X86
'
'  @port: port number
'  @size: data size (1/2/4) to be written to this port
'  @value: data value to be written to this port
'*/
'typedef void (*uc_cb_insn_out_t)(uc_engine *uc, uint32_t port, int size, uint32_t value, void *user_data);
'
'/*
'  Callback function for hooking memory (UC_MEM_READ, UC_MEM_WRITE & UC_MEM_FETCH)
'
'  @type: this memory is being READ, or WRITE
'  @address: address where the code is being executed
'  @size: size of data being read or written
'  @value: value of data being written to memory, or irrelevant if type = READ.
'  @user_data: user data passed to tracing APIs
'*/
'typedef void (*uc_cb_hookmem_t)(uc_engine *uc, uc_mem_type type,
'        uint64_t address, int size, int64_t value, void *user_data);
'
'/*
'  Callback function for handling invalid memory access events (UC_MEM_*_UNMAPPED and
'    UC_MEM_*PROT events)
'
'  @type: this memory is being READ, or WRITE
'  @address: address where the code is being executed
'  @size: size of data being read or written
'  @value: value of data being written to memory, or irrelevant if type = READ.
'  @user_data: user data passed to tracing APIs
'
'  @return: return true to continue, or false to stop program (due to invalid memory).
'*/
'typedef bool (*uc_cb_eventmem_t)(uc_engine *uc, uc_mem_type type,
'        uint64_t address, int size, int64_t value, void *user_data);

'/*
'  Memory region mapped by uc_mem_map() and uc_mem_map_ptr()
'  Retrieve the list of memory regions with uc_mem_regions()
'*/
'typedef struct uc_mem_region {
'    uint64_t begin; // begin address of the region (inclusive)
'    uint64_t end;   // end address of the region (inclusive)
'    uint32_t perms; // memory permissions of the region
'} uc_mem_region;
'
'// All type of queries for uc_query() API.
'typedef enum uc_query_type {
'    // Dynamically query current hardware mode.
'    UC_QUERY_MODE = 1,
'    UC_QUERY_PAGE_SIZE,
'} uc_query_type;



Public Declare Function ucs_dynload Lib "ucvbshim.dll" (ByVal path As String) As Long



'/*
' Return combined API version & major and minor version numbers.
'
' @major: major number of API version
' @minor: minor number of API version
'
' @return hexical number as (major << 8 | minor), which encodes both
'     major & minor versions.
'     NOTE: This returned value can be compared with version number made
'     with macro UC_MAKE_VERSION
'
' For example, second API version would return 1 in @major, and 1 in @minor
' The return value would be 0x0101
'
' NOTE: if you only care about returned value, but not major and minor values,
' set both @major & @minor arguments to NULL.
'*/
'UNICORN_EXPORT
'unsigned int uc_version(unsigned int *major, unsigned int *minor);
Public Declare Function ucs_version Lib "ucvbshim.dll" (ByRef major As Long, ByRef minor As Long) As Long


'
'
'/*
' Determine if the given architecture is supported by this library.
'
' @arch: architecture type (UC_ARCH_*)
'
' @return True if this library supports the given arch.
'*/
'UNICORN_EXPORT
'bool uc_arch_supported(uc_arch arch);
Public Declare Function ucs_arch_supported Lib "ucvbshim.dll" (ByVal arch As uc_arch) As Long


'/*
' Create new instance of unicorn engine.
'
' @arch: architecture type (UC_ARCH_*)
' @mode: hardware mode. This is combined of UC_MODE_*
' @uc: pointer to uc_engine, which will be updated at return time
'
' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
'   for detailed error).
'*/
'UNICORN_EXPORT
'uc_err uc_open(uc_arch arch, uc_mode mode, uc_engine **uc);
Public Declare Function ucs_open Lib "ucvbshim.dll" (ByVal arch As uc_arch, ByVal mode As uc_mode, ByRef hEngine As Long) As uc_err


'/*
' Close UC instance: MUST do to release the handle when it is not used anymore.
' NOTE: this must be called only when there is no longer usage of Unicorn.
' The reason is the this API releases some cached memory, thus access to any
' Unicorn API after uc_close() might crash your application.
' After this, @uc is invalid, and nolonger usable.
'
' @uc: pointer to a handle returned by uc_open()
'
' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
'   for detailed error).
'*/
'UNICORN_EXPORT
'uc_err uc_close(uc_engine *uc);
Public Declare Function ucs_close Lib "ucvbshim.dll" (ByVal hEngine As Long) As uc_err

'
'/*
' Query internal status of engine.
'
' @uc: handle returned by uc_open()
' @type: query type. See uc_query_type
'
' @result: save the internal status queried
'
' @return: error code of uc_err enum type (UC_ERR_*, see above)
'*/
'// All type of queries for uc_query() API.
'typedef enum uc_query_type {
'    // Dynamically query current hardware mode.
'    UC_QUERY_MODE = 1,
'    UC_QUERY_PAGE_SIZE,
'} uc_query_type;
'UNICORN_EXPORT
'uc_err uc_query(uc_engine *uc, uc_query_type type, size_t *result);



'/*
' Report the last error number when some API function fail.
' Like glibc's errno, uc_errno might not retain its old value once accessed.
'
' @uc: handle returned by uc_open()
'
' @return: error code of uc_err enum type (UC_ERR_*, see above)
'*/
'UNICORN_EXPORT
'uc_err uc_errno(uc_engine *uc);
Public Declare Function ucs_errno Lib "ucvbshim.dll" (ByVal hEngine As Long) As uc_err


'
'/*
' Return a string describing given error code.
'
' @code: error code (see UC_ERR_* above)
'
' @return: returns a pointer to a string that describes the error code
'   passed in the argument @code
' */
'UNICORN_EXPORT
'const char *uc_strerror(uc_err code);
Public Declare Function ucs_strerror Lib "ucvbshim.dll" (ByVal code As uc_err) As Long



'/*
' Write to register.
'
' @uc: handle returned by uc_open()
' @regid:  register ID that is to be modified.
' @value:  pointer to the value that will set to register @regid
'
' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
'   for detailed error).
'*/
'UNICORN_EXPORT
'uc_err uc_reg_write(uc_engine *uc, int regid, const void *value);
Public Declare Function ucs_reg_write Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal regid As uc_x86_reg, ByRef value As Long) As uc_err


'/*
' Read register value.
'
' @uc: handle returned by uc_open()
' @regid:  register ID that is to be retrieved.
' @value:  pointer to a variable storing the register value.
'
' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
'   for detailed error).
'*/
'UNICORN_EXPORT
'uc_err uc_reg_read(uc_engine *uc, int regid, void *value);
Public Declare Function ucs_reg_read Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal regid As uc_x86_reg, ByRef value As Long) As uc_err



'/*
' Write multiple register values.
'
' @uc: handle returned by uc_open()
' @rges:  array of register IDs to store
' @value: pointer to array of register values
' @count: length of both *regs and *vals
'
' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
'   for detailed error).
'*/
'UNICORN_EXPORT
'uc_err uc_reg_write_batch(uc_engine *uc, int *regs, void *const *vals, int count);



'
'/*
' Read multiple register values.
'
' @uc: handle returned by uc_open()
' @rges:  array of register IDs to retrieve
' @value: pointer to array of values to hold registers
' @count: length of both *regs and *vals
'
' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
'   for detailed error).
'*/
'UNICORN_EXPORT
'uc_err uc_reg_read_batch(uc_engine *uc, int *regs, void **vals, int count);



'/*
' Write to a range of bytes in memory.
'
' @uc: handle returned by uc_open()
' @address: starting memory address of bytes to set.
' @bytes:   pointer to a variable containing data to be written to memory.
' @size:   size of memory to write to.
'
' NOTE: @bytes must be big enough to contain @size bytes.
'
' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
'   for detailed error).
'*/
'UNICORN_EXPORT
'uc_err uc_mem_write(uc_engine *uc, uint64_t address, const void *bytes, size_t size);
Public Declare Function ucs_mem_write Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal addr As Currency, ByRef b As Byte, ByVal size As Long) As uc_err



'/*
' Read a range of bytes in memory.
'
' @uc: handle returned by uc_open()
' @address: starting memory address of bytes to get.
' @bytes:   pointer to a variable containing data copied from memory.
' @size:   size of memory to read.
'
' NOTE: @bytes must be big enough to contain @size bytes.
'
' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
'   for detailed error).
'*/
'UNICORN_EXPORT
'uc_err uc_mem_read(uc_engine *uc, uint64_t address, void *bytes, size_t size);
Public Declare Function ucs_mem_read Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal addr As Currency, ByRef b As Byte, ByVal size As Long) As uc_err




'/*
' Emulate machine code in a specific duration of time.
'
' @uc: handle returned by uc_open()
' @begin: address where emulation starts
' @until: address where emulation stops (i.e when this address is hit)
' @timeout: duration to emulate the code (in microseconds). When this value is 0,
'        we will emulate the code in infinite time, until the code is finished.
' @count: the number of instructions to be emulated. When this value is 0,
'        we will emulate all the code available, until the code is finished.
'
' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
'   for detailed error).
'*/
'UNICORN_EXPORT
'uc_err uc_emu_start(uc_engine *uc, uint64_t begin, uint64_t until, uint64_t timeout, size_t count);
Public Declare Function ucs_emu_start Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal startAt As Currency, ByVal endAt As Currency, ByVal timeout As Currency, ByVal count As Long) As uc_err


'
'/*
' Stop emulation (which was started by uc_emu_start() API.
' This is typically called from callback functions registered via tracing APIs.
' NOTE: for now, this will stop the execution only after the current block.
'
' @uc: handle returned by uc_open()
'
' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
'   for detailed error).
'*/
'UNICORN_EXPORT
'uc_err uc_emu_stop(uc_engine *uc);
Public Declare Function ucs_emu_stop Lib "ucvbshim.dll" (ByVal hEngine As Long) As uc_err



'/*
' Register callback for a hook event.
' The callback will be run when the hook event is hit.
'
' @uc: handle returned by uc_open()
' @hh: hook handle returned from this registration. To be used in uc_hook_del() API
' @type: hook type
' @callback: callback to be run when instruction is hit
' @user_data: user-defined data. This will be passed to callback function in its
'      last argument @user_data
' @begin: start address of the area where the callback is effect (inclusive)
' @end: end address of the area where the callback is effect (inclusive)
'   NOTE 1: the callback is called only if related address is in range [@begin, @end]
'   NOTE 2: if @begin > @end, callback is called whenever this hook type is triggered
' @...: variable arguments (depending on @type)
'   NOTE: if @type = UC_HOOK_INSN, this is the instruction ID (ex: UC_X86_INS_OUT)
'
' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
'   for detailed error).
'*/
'UNICORN_EXPORT
'uc_err __stdcall ucs_hook_add(uc_engine *uc, uc_hook *hh, int type, void *callback, void *user_data, uint64_t begin, uint64_t end, ...)
'
'note vb6 does not support variable length arguments to api declares so UC_HOOK_INSN would require a seperate declare and stub
'also note that the callback is not used directly, it is proxied through a cdecl stub
'since the hook flags can be different combos, we pass in a catagory for simplicity in selecting which c callback to use..(bit sloppy but easy)
Public Declare Function ucs_hook_add Lib "ucvbshim.dll" (ByVal hEngine As Long, ByRef hHook As Long, ByVal hType As uc_hook_type, ByVal callback As Long, ByVal user_data As Long, ByVal beginAt As Currency, ByVal endAt As Currency, ByVal catagory As Long, Optional ByVal inst_id As Long = 0) As uc_err


'/*
' Unregister (remove) a hook callback.
' This API removes the hook callback registered by uc_hook_add().
' NOTE: this should be called only when you no longer want to trace.
' After this, @hh is invalid, and nolonger usable.
'
' @uc: handle returned by uc_open()
' @hh: handle returned by uc_hook_add()
'
' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
'   for detailed error).
'*/
'UNICORN_EXPORT
'uc_err uc_hook_del(uc_engine *uc, uc_hook hh);
Public Declare Function ucs_hook_del Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal hHook As Long) As uc_err



'/*
' Map memory in for emulation.
' This API adds a memory region that can be used by emulation.
'
' @uc: handle returned by uc_open()
' @address: starting address of the new memory region to be mapped in.
'    This address must be aligned to 4KB, or this will return with UC_ERR_ARG error.
' @size: size of the new memory region to be mapped in.
'    This size must be multiple of 4KB, or this will return with UC_ERR_ARG error.
' @perms: Permissions for the newly mapped region.
'    This must be some combination of UC_PROT_READ | UC_PROT_WRITE | UC_PROT_EXEC,
'    or this will return with UC_ERR_ARG error.
'
' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
'   for detailed error).
'*/
'UNICORN_EXPORT
'uc_err uc_mem_map(uc_engine *uc, uint64_t address, size_t size, uint32_t perms);
Public Declare Function ucs_mem_map Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal addr As Currency, ByVal size As Long, ByVal perms As uc_prot) As uc_err



'/*
' Map existing host memory in for emulation.
' This API adds a memory region that can be used by emulation.
'
' @uc: handle returned by uc_open()
' @address: starting address of the new memory region to be mapped in.
'    This address must be aligned to 4KB, or this will return with UC_ERR_ARG error.
' @size: size of the new memory region to be mapped in.
'    This size must be multiple of 4KB, or this will return with UC_ERR_ARG error.
' @perms: Permissions for the newly mapped region.
'    This must be some combination of UC_PROT_READ | UC_PROT_WRITE | UC_PROT_EXEC,
'    or this will return with UC_ERR_ARG error.
' @ptr: pointer to host memory backing the newly mapped memory. This host memory is
'    expected to be an equal or larger size than provided, and be mapped with at
'    least PROT_READ | PROT_WRITE. If it is not, the resulting behavior is undefined.
'
' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
'   for detailed error).
'*/
'UNICORN_EXPORT
'uc_err uc_mem_map_ptr(uc_engine *uc, uint64_t address, size_t size, uint32_t perms, void *ptr);
Public Declare Function ucs_mem_map_ptr Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal addr As Currency, ByVal size As Long, ByVal perms As uc_prot, ByVal ptr As Long) As uc_err



'/*
' Unmap a region of emulation memory.
' This API deletes a memory mapping from the emulation memory space.
'
' @uc: handle returned by uc_open()
' @address: starting address of the memory region to be unmapped.
'    This address must be aligned to 4KB, or this will return with UC_ERR_ARG error.
' @size: size of the memory region to be modified.
'    This size must be multiple of 4KB, or this will return with UC_ERR_ARG error.
'
' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
'   for detailed error).
'*/
'UNICORN_EXPORT
'uc_err uc_mem_unmap(uc_engine *uc, uint64_t address, size_t size);
Public Declare Function ucs_mem_unmap Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal addr As Currency, ByVal size As Long) As uc_err


'/*
' Set memory permissions for emulation memory.
' This API changes permissions on an existing memory region.
'
' @uc: handle returned by uc_open()
' @address: starting address of the memory region to be modified.
'    This address must be aligned to 4KB, or this will return with UC_ERR_ARG error.
' @size: size of the memory region to be modified.
'    This size must be multiple of 4KB, or this will return with UC_ERR_ARG error.
' @perms: New permissions for the mapped region.
'    This must be some combination of UC_PROT_READ | UC_PROT_WRITE | UC_PROT_EXEC,
'    or this will return with UC_ERR_ARG error.
'
' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
'   for detailed error).
'*/
'UNICORN_EXPORT
'uc_err uc_mem_protect(uc_engine *uc, uint64_t address, size_t size, uint32_t perms);
Public Declare Function ucs_mem_protect Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal addr As Currency, ByVal size As Long, ByVal perm As uc_prot) As uc_err



'/*
' Retrieve all memory regions mapped by uc_mem_map() and uc_mem_map_ptr()
' This API allocates memory for @regions, and user must free this memory later
' by free() to avoid leaking memory.
' NOTE: memory regions may be splitted by uc_mem_unmap()
'
' @uc: handle returned by uc_open()
' @regions: pointer to an array of uc_mem_region struct. This is allocated by
'   Unicorn, and must be freed by user later
' @count: pointer to number of struct uc_mem_region contained in @regions
'
' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
'   for detailed error).
'*/
'UNICORN_EXPORT
'uc_err uc_mem_regions(uc_engine *uc, uc_mem_region **regions, uint32_t *count);
'simplofied for vb use: uc_err __stdcall getMemMap(uc_engine *uc, _CollectionPtr *pColl){

'fills a collection with csv values of all memory regions..
Public Declare Function get_memMap Lib "ucvbshim.dll" (ByVal hEngine As Long, ByRef col As Collection) As uc_err


'/*
' Allocate a region that can be used with uc_context_{save,restore} to perform
' quick save/rollback of the CPU context, which includes registers and some
' internal metadata. Contexts may not be shared across engine instances with
' differing arches or modes.
'
' @uc: handle returned by uc_open()
' @context: pointer to a uc_engine*. This will be updated with the pointer to
'   the new context on successful return of this function.
'
' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
'   for detailed error).
'*/
'UNICORN_EXPORT
'uc_err uc_context_alloc(uc_engine *uc, uc_context **context);
Public Declare Function ucs_context_alloc Lib "ucvbshim.dll" (ByVal hEngine As Long, ByRef context As Long) As uc_err



'/*
' Free the resource allocated by uc_context_alloc.
'
' @context: handle returned by uc_context_alloc()
'
' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
'   for detailed error).
'*/
'UNICORN_EXPORT
'uc_err uc_free(void* mem);
Public Declare Function ucs_free Lib "ucvbshim.dll" (ByVal mem As Long) As uc_err



'/*
' Save a copy of the internal CPU context.
' This API should be used to efficiently make or update a saved copy of the
' internal CPU state.
'
' @uc: handle returned by uc_open()
' @context: handle returned by uc_context_alloc()
'
' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
'   for detailed error).
'*/
'UNICORN_EXPORT
'uc_err uc_context_save(uc_engine *uc, uc_context *context);
Public Declare Function ucs_context_save Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal context As Long) As uc_err



'/*
' Restore the current CPU context from a saved copy.
' This API should be used to roll the CPU context back to a previous
' state saved by uc_context_save().
'
' @uc: handle returned by uc_open()
' @buffer: handle returned by uc_context_alloc that has been used with uc_context_save
'
' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum
'   for detailed error).
'*/
'UNICORN_EXPORT
'uc_err uc_context_restore(uc_engine *uc, uc_context *context);
Public Declare Function ucs_context_restore Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal context As Long) As uc_err



'uses libdasm to retrieve the 32bit disassembly at a specified va
'int __stdcall disasm_addr(uc_engine *uc, int va, char *str, int bufLen){
Public Declare Function disasm_addr Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal addr As Long, ByVal buf As String, ByVal size As Long) As Long


'simplified access to map and write data to emu memory
'uc_err __stdcall mem_write_block(uc_engine *uc, uint64_t address, void* data, uint32_t size, uint32_t perm){
Public Declare Function mem_write_block Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal addr As Currency, ByRef data As Byte, ByVal size As Long, ByVal perm As Long) As uc_err

Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Long) As Long

'api version of the below..
'Function err2str(e As uc_err) As String
'    Dim lpStr As Long
'    Dim length As Long
'    Dim buf() As Byte
'
'    lpStr = ucs_strerror(e)
'    If lpStr = 0 Then Exit Function
'
'    length = lstrlen(lpStr)
'    If length = 0 Then Exit Function
'
'    ReDim buf(1 To length)
'    CopyMemory buf(1), ByVal lpStr, length
'
'    err2str2 = StrConv(buf, vbUnicode, &H409)
'
'End Function

Function err2str(e As uc_err) As String
    
    err2str = "Unknown error code: " & e
    
    If e = uc_err_ok Then err2str = "No error: everything was fine"
    If e = UC_ERR_NOMEM Then err2str = "Out-Of-Memory error: uc_open(), uc_emulate()"
    If e = UC_ERR_ARCH Then err2str = "Unsupported architecture: uc_open()"
    If e = UC_ERR_HANDLE Then err2str = "Invalid handle"
    If e = UC_ERR_MODE Then err2str = "Invalid/unsupported mode: uc_open()"
    If e = UC_ERR_VERSION Then err2str = "Unsupported version (bindings)"
    If e = UC_ERR_READ_UNMAPPED Then err2str = "Quit emulation due to READ on unmapped memory: uc_emu_start()"
    If e = UC_ERR_WRITE_UNMAPPED Then err2str = "Quit emulation due to WRITE on unmapped memory: uc_emu_start()"
    If e = UC_ERR_FETCH_UNMAPPED Then err2str = "Quit emulation due to FETCH on unmapped memory: uc_emu_start()"
    If e = UC_ERR_HOOK Then err2str = "Invalid hook type: uc_hook_add()"
    If e = UC_ERR_INSN_INVALID Then err2str = "Quit emulation due to invalid instruction: uc_emu_start()"
    If e = UC_ERR_MAP Then err2str = "Invalid memory mapping: uc_mem_map()"
    If e = UC_ERR_WRITE_PROT Then err2str = "Quit emulation due to UC_MEM_WRITE_PROT violation: uc_emu_start()"
    If e = UC_ERR_READ_PROT Then err2str = "Quit emulation due to UC_MEM_READ_PROT violation: uc_emu_start()"
    If e = UC_ERR_FETCH_PROT Then err2str = "Quit emulation due to UC_MEM_FETCH_PROT violation: uc_emu_start()"
    If e = UC_ERR_ARG Then err2str = "Inavalid argument provided to uc_xxx function (See specific function API)"
    If e = UC_ERR_READ_UNALIGNED Then err2str = "Unaligned read"
    If e = UC_ERR_WRITE_UNALIGNED Then err2str = "Unaligned write"
    If e = UC_ERR_FETCH_UNALIGNED Then err2str = "Unaligned fetch"
    If e = UC_ERR_HOOK_EXIST Then err2str = "hook for this event already existed"
    If e = UC_ERR_RESOURCE Then err2str = "Insufficient resource: uc_emu_start()"
    If e = UC_ERR_EXCEPTION Then err2str = "Unhandled CPU exception"
 
End Function

Function memType2str(t As uc_mem_type)
    
    memType2str = "Unknown memType: " & t
    
    If t = UC_MEM_READ Then memType2str = "Memory is read from"
    If t = uc_mem_write Then memType2str = "Memory is written to"
    If t = UC_MEM_FETCH Then memType2str = "Memory is fetched"
    If t = UC_MEM_READ_UNMAPPED Then memType2str = "Unmapped memory is read from"
    If t = UC_MEM_WRITE_UNMAPPED Then memType2str = "Unmapped memory is written to"
    If t = UC_MEM_FETCH_UNMAPPED Then memType2str = "Unmapped memory is fetched"
    If t = UC_MEM_WRITE_PROT Then memType2str = "Write to write protected, but mapped, memory"
    If t = UC_MEM_READ_PROT Then memType2str = "Read from read protected, but mapped, memory"
    If t = UC_MEM_FETCH_PROT Then memType2str = "Fetch from non-executable, but mapped, memory"
    If t = UC_MEM_READ_AFTER Then memType2str = "Memory is read from (successful access)"
    
End Function

 





'--------------------- [ callback support ] ---------------------------------------------

'so the callbacks must live in a module (vb6 language limitation/safety feature)
'we use a simple lookup mechanism to support multiple instances

Function findInstance(ptr As Long) As ucIntel32
    On Error Resume Next
    Set findInstance = instances("objptr:" & ptr)
End Function

'in case we want to keep userdata for something else..this is just as easy..
Function findInstanceByUc(uc As Long) As ucIntel32
    Dim u As ucIntel32
    For Each u In instances
        If u.uc = uc Then
            Set findInstanceByUc = u
            Exit Function
        End If
    Next
End Function

'typedef void (__stdcall *vb_cb_hookcode_t)   (uc_engine *uc,  uint64_t address,  uint32_t size,    void *user_data);
Public Sub code_hook(ByVal uc As Long, ByVal address As Currency, ByVal size As Long, ByVal user_data As Long)
    Dim u As ucIntel32
    Set u = findInstance(user_data)
    If u Is Nothing Then Exit Sub
    u.internal_code_hook address, size
End Sub

Public Sub block_hook(ByVal uc As Long, ByVal address As Currency, ByVal size As Long, ByVal user_data As Long)
    Dim u As ucIntel32
    Set u = findInstance(user_data)
    If u Is Nothing Then Exit Sub
    u.internal_block_hook address, size
End Sub

'typedef void (*uc_cb_hookmem_t)(uc_engine *uc, uc_mem_type type, uint64_t address, int size, int64_t value, void *user_data);
Public Sub mem_hook(ByVal uc As Long, ByVal t As uc_mem_type, ByVal address As Currency, ByVal size As Long, ByVal value As Currency, ByVal user_data As Long)
    Dim u As ucIntel32
    Set u = findInstance(user_data)
    If u Is Nothing Then Exit Sub
    u.internal_mem_hook t, address, size, value
End Sub

'typedef bool (*uc_cb_eventmem_t)(uc_engine *uc, uc_mem_type type, uint64_t address, int size, int64_t value, void *user_data);
Public Function invalid_mem_hook(ByVal uc As Long, ByVal t As uc_mem_type, ByVal address As Currency, ByVal size As Long, ByVal value As Currency, ByVal user_data As Long) As Long
    'return 0 to stop emulation, 1 to continue
    Dim u As ucIntel32
    Set u = findInstance(user_data)
    If u Is Nothing Then Exit Function
    invalid_mem_hook = u.internal_invalid_mem_hook(t, address, size, value)
End Function

'typedef void (*vb_cb_hookintr_t)(uc_engine *uc,uint32_t intno, void *user_data);
Public Sub interrupt_hook(ByVal uc As Long, ByVal intno As Long, ByVal user_data As Long)
    Dim u As ucIntel32
    Set u = findInstance(user_data)
    If u Is Nothing Then Exit Sub
    u.internal_interrupt_hook intno
End Sub

