1VERSION 1.0 CLASS
2BEGIN
3  MultiUse = -1  'True
4  Persistable = 0  'NotPersistable
5  DataBindingBehavior = 0  'vbNone
6  DataSourceBehavior  = 0  'vbNone
7  MTSTransactionMode  = 0  'NotAnMTSObject
8END
9Attribute VB_Name = "CInstDetails"
10Attribute VB_GlobalNameSpace = False
11Attribute VB_Creatable = True
12Attribute VB_PredeclaredId = False
13Attribute VB_Exposed = False
14Option Explicit
15'Capstone Disassembly Engine bindings for VB6
16'Contributed by FireEye FLARE Team
17'Author:  David Zimmer <david.zimmer@fireeye.com>, <dzzie@yahoo.com>
18'License: Apache
19'Copyright: FireEye 2017
20
21'Public Type cs_detail
22'    regs_read(0 To 15) 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
42Public regRead As New Collection
43Public regWritten As New Collection
44Public groups As New Collection
45Public parent As CDisassembler
46
47'this will be set to a class of the specific instruction info type by architecture..
48Public info As Object
49
50Private m_raw() As Byte
51
52Function 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
78End Function
79
80Friend 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
119End Sub
120