public TagAnalyzer(TagCache cache, HaloTag tag) { _cache = cache; _tag = tag; _tagMap = BuildTagMap(tag); _dataFixupsByWriteOffset = _tag.DataFixups.ToDictionary(f => f.WriteOffset); _resourceFixupsByWriteOffset = _tag.ResourceFixups.ToDictionary(f => f.WriteOffset); }
/// <summary> /// Builds a memory map for a tag. /// </summary> /// <param name="tag">The tag to build a memory map for.</param> /// <returns>The built map.</returns> private static MemoryMap BuildTagMap(TagInstance tag) { // Create a memory map with a boundary at each fixup target // and at the main structure var result = new MemoryMap(0, (uint)tag.DataSize); result.AddBoundary(tag.MainStructOffset); result.AddBoundaries(tag.DataFixups.Select(f => f.TargetOffset)); return result; }
/// <summary> /// Builds a memory map for a tag. /// </summary> /// <param name="data">The tag data to build a memory map for.</param> /// <returns>The built map.</returns> private static MemoryMap BuildTagMap(TagData data) { // Create a memory map with a boundary at each fixup target // and at the main structure var result = new MemoryMap(0, (uint)data.Data.Length); result.AddBoundary(data.MainStructOffset); result.AddBoundaries(data.PointerFixups.Select(f => f.TargetOffset)); return result; }
public TagAnalyzer(TagCache cache, TagInstance tag) { _cache = cache; _tag = tag; _tagMap = BuildTagMap(tag); _dataFixupsByWriteOffset = _tag.DataFixups.ToDictionary(f => f.WriteOffset); _resourceFixupsByWriteOffset = _tag.ResourceFixups.ToDictionary(f => f.WriteOffset); foreach (var group in cache.Tags.NonNull().Select(t => t.GroupTag).Distinct()) _tagGroups.Add(group); }
public TagLayoutGuess Analyze(TagData data) { _tagMap = BuildTagMap(data); _dataFixupsByWriteOffset = data.PointerFixups.ToDictionary(f => f.WriteOffset); _resourceFixupsByWriteOffset = new HashSet<uint>(data.ResourcePointerOffsets); using (var reader = new BinaryReader(new MemoryStream(data.Data))) { reader.BaseStream.Position = data.MainStructOffset; return AnalyzeStructure(reader, 1); } }