diff --git a/HighLevelIL/HLILDerefField.cs b/HighLevelIL/HLILDerefField.cs
index cdabe09..b67faf3 100644
--- a/HighLevelIL/HLILDerefField.cs
+++ b/HighLevelIL/HLILDerefField.cs
@@ -27,11 +27,16 @@ public long Offset
}
}
- public ulong MemoryIndex
+ ///
+ /// The named-member index, or null when there is no named member. Mirrors Python
+ /// _get_member_index (renamed from MemoryIndex for parity with
+ /// and ).
+ ///
+ public long? MemberIndex
{
get
{
- return this.RawOperands[2];
+ return HighLevelILInstruction.MemberIndexFromRawOperand(this.RawOperands[2]);
}
}
}
diff --git a/HighLevelIL/HLILDerefFieldSSA.cs b/HighLevelIL/HLILDerefFieldSSA.cs
index 8e37d01..9be041f 100644
--- a/HighLevelIL/HLILDerefFieldSSA.cs
+++ b/HighLevelIL/HLILDerefFieldSSA.cs
@@ -35,11 +35,16 @@ public long Offset
}
}
- public ulong MemoryIndex
+ ///
+ /// The named-member index, or null when there is no named member. Mirrors Python
+ /// _get_member_index (renamed from MemoryIndex for parity with
+ /// and ).
+ ///
+ public long? MemberIndex
{
get
{
- return this.RawOperands[3];
+ return HighLevelILInstruction.MemberIndexFromRawOperand(this.RawOperands[3]);
}
}
}
diff --git a/HighLevelIL/HLILStructField.cs b/HighLevelIL/HLILStructField.cs
index 9728ff7..e1fd892 100644
--- a/HighLevelIL/HLILStructField.cs
+++ b/HighLevelIL/HLILStructField.cs
@@ -27,11 +27,15 @@ public long Offset
}
}
- public ulong MemberIndex
+ ///
+ /// The named-member index, or null when there is no named member. Mirrors Python
+ /// _get_member_index: the sentinel (1<<63) means no named member.
+ ///
+ public long? MemberIndex
{
get
{
- return this.RawOperands[2];
+ return HighLevelILInstruction.MemberIndexFromRawOperand(this.RawOperands[2]);
}
}
}
diff --git a/Struct/BNHighLevelILInstruction.cs b/Struct/BNHighLevelILInstruction.cs
index 43d75ed..60c91b0 100644
--- a/Struct/BNHighLevelILInstruction.cs
+++ b/Struct/BNHighLevelILInstruction.cs
@@ -94,11 +94,11 @@ public abstract class HighLevelILInstruction :
{ HighLevelILOperation.HLIL_ASSERT, 1 }, // cond
{ HighLevelILOperation.HLIL_VAR, 1 }, // var
- { HighLevelILOperation.HLIL_STRUCT_FIELD, 2 }, // base, fieldOffset/index
+ { HighLevelILOperation.HLIL_STRUCT_FIELD, 3 }, // base, fieldOffset, memberIndex
{ HighLevelILOperation.HLIL_ARRAY_INDEX, 2 }, // base, index
{ HighLevelILOperation.HLIL_SPLIT, 2 }, // hi, lo
{ HighLevelILOperation.HLIL_DEREF, 1 }, // addr
- { HighLevelILOperation.HLIL_DEREF_FIELD, 2 }, // addr, fieldOffset/index
+ { HighLevelILOperation.HLIL_DEREF_FIELD, 3 }, // addr, fieldOffset, memberIndex
{ HighLevelILOperation.HLIL_ADDRESS_OF, 1 }, // var/expr
{ HighLevelILOperation.HLIL_CONST, 1 }, // value
@@ -201,7 +201,7 @@ public abstract class HighLevelILInstruction :
{ HighLevelILOperation.HLIL_VAR_SSA, 2 }, // var, version
{ HighLevelILOperation.HLIL_ARRAY_INDEX_SSA, 3 }, // base, index, srcMem
{ HighLevelILOperation.HLIL_DEREF_SSA, 2 }, // addr, srcMem
- { HighLevelILOperation.HLIL_DEREF_FIELD_SSA, 3 }, // addr, field, srcMem
+ { HighLevelILOperation.HLIL_DEREF_FIELD_SSA, 4 }, // addr, srcMem, fieldOffset, memberIndex
{ HighLevelILOperation.HLIL_CALL_SSA, 4 }, // dest, params(list), outputs(list), srcMem
{ HighLevelILOperation.HLIL_SYSCALL_SSA, 3 }, // params(list), outputs(list), srcMem
@@ -986,6 +986,19 @@ public double GetOperandAsDouble(OperandIndex operand)
{
return BitConverter.UInt64BitsToDouble(this.RawOperands[(ulong)operand]);
}
+
+ // member_index mask: mirrors Python HighLevelILInstruction._get_member_index. The sentinel
+ // (1<<63) means "no named member" and is returned as null; otherwise the (non-negative)
+ // named-member index. Callers pass the already-extracted raw operand value.
+ internal static long? MemberIndexFromRawOperand(ulong rawOperand)
+ {
+ if (0UL != (rawOperand & (1UL << 63)))
+ {
+ return null;
+ }
+
+ return (long)rawOperand;
+ }
public RegisterValue GetOperandAsConstantData(
OperandIndex operand1 ,