Fix metadata usage issues caused by it being a value type now

This commit is contained in:
LukeFZ
2024-11-08 23:33:13 +01:00
parent 5715760e8b
commit 08431b774a
3 changed files with 11 additions and 13 deletions

View File

@@ -108,13 +108,13 @@ namespace Il2CppInspector
return buildLateBindingMetadataUsages(); return buildLateBindingMetadataUsages();
// Version >= 19 && < 27 // Version >= 19 && < 27
var usages = new Dictionary<uint, MetadataUsage>(); var usages = new Dictionary<uint, uint>();
foreach (var metadataUsageList in Metadata.MetadataUsageLists) foreach (var metadataUsageList in Metadata.MetadataUsageLists)
{ {
for (var i = 0; i < metadataUsageList.Count; i++) for (var i = 0; i < metadataUsageList.Count; i++)
{ {
var metadataUsagePair = Metadata.MetadataUsagePairs[metadataUsageList.Start + i]; var metadataUsagePair = Metadata.MetadataUsagePairs[metadataUsageList.Start + i];
usages.TryAdd(metadataUsagePair.DestinationIndex, MetadataUsage.FromEncodedIndex(this, metadataUsagePair.EncodedSourceIndex)); usages.TryAdd(metadataUsagePair.DestinationIndex, metadataUsagePair.EncodedSourceIndex);
} }
} }
@@ -123,10 +123,12 @@ namespace Il2CppInspector
// so we have to calculate the correct number of usages above before reading the usage address list from the binary // so we have to calculate the correct number of usages above before reading the usage address list from the binary
var count = usages.Keys.Max() + 1; var count = usages.Keys.Max() + 1;
var addresses = Binary.Image.ReadMappedUWordArray(Binary.MetadataRegistration.MetadataUsages, (int) count); var addresses = Binary.Image.ReadMappedUWordArray(Binary.MetadataRegistration.MetadataUsages, (int) count);
foreach (var usage in usages)
usage.Value.SetAddress(addresses[usage.Key]);
return usages.Values.ToList(); var metadataUsages = new List<MetadataUsage>();
foreach (var (index, encodedUsage) in usages)
metadataUsages.Add(MetadataUsage.FromEncodedIndex(this, encodedUsage, addresses[index]));
return metadataUsages;
} }
private List<MetadataUsage> buildLateBindingMetadataUsages() private List<MetadataUsage> buildLateBindingMetadataUsages()
@@ -149,10 +151,7 @@ namespace Il2CppInspector
if (CheckMetadataUsageSanity(usage) if (CheckMetadataUsageSanity(usage)
&& BinaryImage.TryMapFileOffsetToVA(i * ((uint)BinaryImage.Bits / 8), out var va)) && BinaryImage.TryMapFileOffsetToVA(i * ((uint)BinaryImage.Bits / 8), out var va))
{ usages.Add(MetadataUsage.FromEncodedIndex(this, encodedToken, va));
usage.SetAddress(va);
usages.Add(usage);
}
} }
} }

View File

@@ -25,7 +25,7 @@ namespace Il2CppInspector
{ {
public MetadataUsageType Type { get; } public MetadataUsageType Type { get; }
public int SourceIndex { get; } public int SourceIndex { get; }
public ulong VirtualAddress { get; private set; } public ulong VirtualAddress { get; }
public readonly bool IsValid => Type != 0; public readonly bool IsValid => Type != 0;
@@ -55,7 +55,5 @@ namespace Il2CppInspector
} }
return new MetadataUsage(usageType, (int)index, virtualAddress); return new MetadataUsage(usageType, (int)index, virtualAddress);
} }
public void SetAddress(ulong virtualAddress) => VirtualAddress = virtualAddress;
} }
} }

View File

@@ -105,7 +105,8 @@ namespace Il2CppInspector.Model
} }
// Initialize // Initialize
public AppModel(TypeModel model, bool makeDefaultBuild = true) { public AppModel(TypeModel model, bool makeDefaultBuild = true)
{
// Save .NET type model // Save .NET type model
TypeModel = model; TypeModel = model;