From 5828ed106be1d7e1cbb5d1c4825e7b423415536c Mon Sep 17 00:00:00 2001 From: Katy Coe Date: Sat, 22 Aug 2020 03:13:50 +0200 Subject: [PATCH] Model/C#: Provide FieldHasRVA flag; output metadata preview for static array initializer implementations (#59) --- Il2CppInspector.Common/Outputs/CSharpCodeStubs.cs | 9 ++++++++- Il2CppInspector.Common/Reflection/FieldInfo.cs | 5 ++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Il2CppInspector.Common/Outputs/CSharpCodeStubs.cs b/Il2CppInspector.Common/Outputs/CSharpCodeStubs.cs index a3f83aa..b059e9a 100644 --- a/Il2CppInspector.Common/Outputs/CSharpCodeStubs.cs +++ b/Il2CppInspector.Common/Outputs/CSharpCodeStubs.cs @@ -399,7 +399,14 @@ namespace Il2CppInspector.Outputs sb.Append($" // 0x{(uint) field.Offset:X2}"); // Output metadata file offset for const fields if (field.IsLiteral && !SuppressMetadata) - sb.Append($" // Metadata: 0x{(uint) field.DefaultValueMetadataAddress:X8}"); + sb.Append($" // Metadata: {field.DefaultValueMetadataAddress.ToAddressString()}"); + // For static array initializers, output metadata address and preview + if (field.HasFieldRVA && !SuppressMetadata) { + var preview = model.Package.Metadata.ReadBytes((long) field.DefaultValueMetadataAddress, 8); + var previewText = string.Join(" ", preview.Select(b => $"{b:x2}")); + + sb.Append($" // Starts with: {previewText} - Metadata: {field.DefaultValueMetadataAddress.ToAddressString()}"); + } sb.Append("\n"); } codeBlocks.Add("Fields", sb.ToString()); diff --git a/Il2CppInspector.Common/Reflection/FieldInfo.cs b/Il2CppInspector.Common/Reflection/FieldInfo.cs index 56718d2..53da513 100644 --- a/Il2CppInspector.Common/Reflection/FieldInfo.cs +++ b/Il2CppInspector.Common/Reflection/FieldInfo.cs @@ -25,7 +25,8 @@ namespace Il2CppInspector.Reflection { private readonly long rawOffset; public long Offset => DeclaringType.ContainsGenericParameters? 0 : rawOffset - (DeclaringType.IsValueType && !IsStatic? (Assembly.Model.Package.BinaryImage.Bits / 8) * 2 : 0); - + + public bool HasFieldRVA => (Attributes & FieldAttributes.HasFieldRVA) != 0; public ulong DefaultValueMetadataAddress { get; } // Custom attributes for this member @@ -126,6 +127,8 @@ namespace Il2CppInspector.Reflection { Attributes |= FieldAttributes.PinvokeImpl; if ((fieldType.attrs & Il2CppConstants.FIELD_ATTRIBUTE_HAS_DEFAULT) != 0) Attributes |= FieldAttributes.HasDefault; + if ((fieldType.attrs & Il2CppConstants.FIELD_ATTRIBUTE_HAS_FIELD_RVA) != 0) + Attributes |= FieldAttributes.HasFieldRVA; // Default initialization value if present if (pkg.FieldDefaultValue.TryGetValue(fieldIndex, out (ulong address, object variant) value)) {