Home | History | Annotate | Download | only in vb6
      1 VERSION 1.0 CLASS
      2 BEGIN
      3   MultiUse = -1  'True
      4   Persistable = 0  'NotPersistable
      5   DataBindingBehavior = 0  'vbNone
      6   DataSourceBehavior  = 0  'vbNone
      7   MTSTransactionMode  = 0  'NotAnMTSObject
      8 END
      9 Attribute VB_Name = "CInstDetails"
     10 Attribute VB_GlobalNameSpace = False
     11 Attribute VB_Creatable = True
     12 Attribute VB_PredeclaredId = False
     13 Attribute VB_Exposed = False
     14 Option Explicit
     15 'Capstone Disassembly Engine bindings for VB6
     16 'Contributed by FireEye FLARE Team
     17 'Author:  David Zimmer <david.zimmer (a] fireeye.com>, <dzzie (a] yahoo.com>
     18 'License: Apache
     19 'Copyright: FireEye 2017
     20 
     21 'Public Type cs_detail
     22 '    regs_read(0 To 11) As      Byte ' list of implicit registers read by this insn UNSIGNED
     23 '    regs_read_count As         Byte ' number of implicit registers read by this insn UNSIGNED
     24 '    regs_write(0 To 19) As     Byte ' list of implicit registers modified by this insn UNSIGNED
     25 '    regs_write_count As        Byte ' number of implicit registers modified by this insn UNSIGNED
     26 '    groups(0 To 7) As          Byte ' list of group this instruction belong to UNSIGNED
     27 '    groups_count As            Byte ' number of groups this insn belongs to UNSIGNED
     28 '
     29 '    // Architecture-specific instruction info
     30 '    union {
     31 '        cs_x86 x86; // X86 architecture, including 16-bit, 32-bit & 64-bit mode
     32 '        cs_arm64 arm64; // ARM64 architecture (aka AArch64)
     33 '        cs_arm arm;     // ARM architecture (including Thumb/Thumb2)
     34 '        cs_mips mips;   // MIPS architecture
     35 '        cs_ppc ppc; // PowerPC architecture
     36 '        cs_sparc sparc; // Sparc architecture
     37 '        cs_sysz sysz;   // SystemZ architecture
     38 '        cs_xcore xcore; // XCore architecture
     39 '    };
     40 '} cs_detail;
     41     
     42 Public regRead As New Collection
     43 Public regWritten As New Collection
     44 Public groups As New Collection
     45 Public parent As CDisassembler
     46 
     47 'this will be set to a class of the specific instruction info type by architecture..
     48 Public info As Object
     49 
     50 Private m_raw() As Byte
     51 
     52 Function toString() As String
     53     
     54     On Error Resume Next
     55     
     56     Dim ret() As String
     57     Dim v, tmp
     58      
     59     push ret, "Instruction details: "
     60     push ret, String(40, "-")
     61     
     62     If DEBUG_DUMP Then
     63         push ret, "Raw: "
     64         push ret, HexDump(m_raw)
     65     End If
     66     
     67     push ret, "Registers Read: " & regRead.count & IIf(regRead.count > 0, "  Values: " & col2Str(regRead), Empty)
     68     push ret, "Registers Written: " & regWritten.count & IIf(regWritten.count > 0, "  Values: " & col2Str(regWritten), Empty)
     69     push ret, "Groups: " & groups.count & IIf(groups.count > 0, "  Values: " & col2Str(groups), Empty)
     70     
     71     'it is expected that each CXXInst class implements a toString() method..if not we catch the error anyway..
     72     If Not info Is Nothing Then
     73         push ret, info.toString()
     74     End If
     75     
     76     toString = Join(ret, vbCrLf)
     77     
     78 End Function
     79 
     80 Friend Sub LoadDetails(lpDetails As Long, parent As CDisassembler)
     81         
     82     Dim cd As cs_detail
     83     Dim i As Long
     84     Dim x86 As CX86Inst
     85     
     86     Set Me.parent = parent
     87     
     88     'vbdef only contains up to the groups_count field..
     89     CopyMemory ByVal VarPtr(cd), ByVal lpDetails, LenB(cd)
     90     
     91     If DEBUG_DUMP Then
     92         ReDim m_raw(LenB(cd))
     93         CopyMemory ByVal VarPtr(m_raw(0)), ByVal lpDetails, LenB(cd)
     94     End If
     95     
     96     For i = 1 To cd.regs_read_count
     97         regRead.Add cd.regs_read(i - 1)
     98     Next
     99     
    100     For i = 1 To cd.regs_write_count
    101         regWritten.Add cd.regs_write(i - 1)
    102     Next
    103     
    104     For i = 1 To cd.groups_count
    105         groups.Add cd.groups(i - 1)
    106     Next
    107     
    108     Const align = 5
    109     
    110     'each arch needs its own CxxInstr class implemented here...
    111     If parent.arch = CS_ARCH_X86 Then
    112         Set x86 = New CX86Inst
    113         x86.LoadDetails lpDetails + LenB(cd) + align, parent
    114         Set info = x86
    115     End If
    116     
    117     
    118     
    119 End Sub
    120