private void Load(StructureValueCollection values, FileSegmenter segmenter, FileSegmentGroup localeArea) { StringCount = (int)values.GetInteger("string count"); if (StringCount > 0) { // Index table offset, segment, and pointer int localeIndexTableOffset = localeArea.PointerToOffset((uint)values.GetInteger("locale index table offset")); LocaleIndexTable = segmenter.WrapSegment(localeIndexTableOffset, StringCount * 8, 8, SegmentResizeOrigin.End); LocaleIndexTableLocation = localeArea.AddSegment(LocaleIndexTable); // Data offset, segment, and pointer int localeDataOffset = localeArea.PointerToOffset((uint)values.GetInteger("locale data index offset")); var localeDataSize = (int)values.GetInteger("locale table size"); LocaleData = segmenter.WrapSegment(localeDataOffset, localeDataSize, _sizeAlign, SegmentResizeOrigin.End); LocaleDataLocation = localeArea.AddSegment(LocaleData); // Load hashes if they exist if (values.HasRaw("index table hash")) { IndexTableHash = values.GetRaw("index table hash"); } if (values.HasRaw("string data hash")) { StringDataHash = values.GetRaw("string data hash"); } } }
private FileSegment CalculateTagDataSegment(StructureValueCollection values, FileSegmenter segmenter) { if (TagBufferPointerConverter != null) { int tagDataOffset = TagBufferPointerConverter.PointerToOffset(TagBufferPointerConverter.BasePointer); var tagDataSize = (int)values.GetInteger("virtual size"); return(segmenter.WrapSegment(tagDataOffset, tagDataSize, 0x10000, SegmentResizeOrigin.Beginning)); } return(null); }
private FileSegment CalculateRawTableSegment(FileSegmenter segmenter) { if (ResourcePointerConverter != null) { int rawTableOffset = ResourcePointerConverter.PointerToOffset(ResourcePointerConverter.BasePointer); var rawTableSize = (int)Sections[(int)ThirdGenInteropSectionType.Resource].Size; return(segmenter.WrapSegment(rawTableOffset, rawTableSize, cacheSegmentAlignment, SegmentResizeOrigin.End)); } return(null); }
private void CalculateStringGroup(StructureValueCollection values, FileSegmenter segmenter) { if (DebugPointerConverter == null) { return; } StringArea = new FileSegmentGroup(DebugPointerConverter); // StringIDs StringIDCount = (int)values.GetInteger("string table count"); if (StringIDCount > 0) { int sidIndexTableOff = DebugPointerConverter.PointerToOffset(values.GetInteger("string index table offset")); int sidDataOff = DebugPointerConverter.PointerToOffset(values.GetInteger("string table offset")); var sidTableSize = (int)values.GetInteger("string table size"); StringIDIndexTable = segmenter.WrapSegment(sidIndexTableOff, StringIDCount * 4, 4, SegmentResizeOrigin.End); StringIDData = segmenter.WrapSegment(sidDataOff, sidTableSize, 1, SegmentResizeOrigin.End); StringIDIndexTableLocation = StringArea.AddSegment(StringIDIndexTable); StringIDDataLocation = StringArea.AddSegment(StringIDData); // idk what this is, but H3Beta has it if (values.HasInteger("string block offset")) { int sidBlockOff = DebugPointerConverter.PointerToOffset(values.GetInteger("string block offset")); StringBlock = segmenter.WrapSegment(sidBlockOff, StringIDCount * 0x80, 0x80, SegmentResizeOrigin.End); StringBlockLocation = StringArea.AddSegment(StringBlock); } } // Tag names FileNameCount = (int)values.GetInteger("file table count"); if (FileNameCount > 0) { int nameIndexTableOff = DebugPointerConverter.PointerToOffset(values.GetInteger("file index table offset")); int nameDataOff = DebugPointerConverter.PointerToOffset(values.GetInteger("file table offset")); var fileTableSize = (int)values.GetInteger("file table size"); FileNameIndexTable = segmenter.WrapSegment(nameIndexTableOff, FileNameCount * 4, 4, SegmentResizeOrigin.End); FileNameData = segmenter.WrapSegment(nameDataOff, fileTableSize, 1, SegmentResizeOrigin.End); FileNameIndexTableLocation = StringArea.AddSegment(FileNameIndexTable); FileNameDataLocation = StringArea.AddSegment(FileNameData); } // Some H4-only unknown table if (values.HasInteger("unknown table count") && values.HasInteger("unknown table offset")) { UnknownCount = (int)values.GetInteger("unknown table count"); if (UnknownCount > 0) { int unknownOff = DebugPointerConverter.PointerToOffset(values.GetInteger("unknown table offset")); UnknownTable = segmenter.WrapSegment(unknownOff, UnknownCount * 0x10, 0x10, SegmentResizeOrigin.End); UnknownTableLocation = StringArea.AddSegment(UnknownTable); } } }
private void Load(StructureValueCollection values, FileSegmenter segmenter) { _eofSegment = segmenter.WrapEOF((int)values.GetInteger("file size")); var metaOffset = (int)values.GetInteger("meta offset"); int metaSize; // TODO (Dragon): hack for h2 alpha if (BuildString == "02.01.07.4998") { metaSize = (int)values.GetInteger("tag data offset") + (int)values.GetInteger("tag data size"); // hack to rewrite the "meta size" value even though its not actually the meta size //_saved_meta_size_hack = (uint)values.GetInteger("meta size"); } else { metaSize = (int)values.GetInteger("meta size"); } var metaSegment = new FileSegment( segmenter.DefineSegment(metaOffset, metaSize, 0x4, SegmentResizeOrigin.Beginning), segmenter); // we hacked in a meta header size into the values earlier in the cache load uint metaOffsetMask = (uint)(values.GetInteger("tag table offset") - values.GetInteger("meta header size")); MetaArea = new FileSegmentGroup(new MetaOffsetConverter(metaSegment, metaOffsetMask)); IndexHeaderLocation = MetaArea.AddSegment(metaSegment); Type = (CacheFileType)values.GetInteger("type"); var headerGroup = new FileSegmentGroup(); headerGroup.AddSegment(segmenter.WrapSegment(0, HeaderSize, 1, SegmentResizeOrigin.None)); InternalName = values.GetString("internal name"); Checksum = (uint)values.GetInteger("checksum"); // dummy partition Partitions = new Partition[1]; Partitions[0] = new Partition(SegmentPointer.FromOffset(MetaArea.Offset, MetaArea), (uint)MetaArea.Size); // dummy stringids StringIDCount = 0; StringIDData = _eofSegment; StringIDIndexTable = _eofSegment; }
private void Load(StructureValueCollection values, FileSegmenter segmenter) { _eofSegment = segmenter.WrapEOF((int)values.GetInteger("file size")); var metaOffset = (int)values.GetInteger("meta offset"); var metaSize = (int)values.GetInteger("meta size"); uint metaOffsetMask = values.GetInteger("meta offset mask"); var metaSegment = new FileSegment( segmenter.DefineSegment(metaOffset, metaSize, 0x200, SegmentResizeOrigin.Beginning), segmenter); MetaArea = new FileSegmentGroup(new MetaOffsetConverter(metaSegment, metaOffsetMask)); IndexHeaderLocation = MetaArea.AddSegment(metaSegment); Type = (CacheFileType)values.GetInteger("type"); var headerGroup = new FileSegmentGroup(); headerGroup.AddSegment(segmenter.WrapSegment(0, HeaderSize, 1, SegmentResizeOrigin.None)); StringIDCount = (int)values.GetInteger("string table count"); var sidDataSize = (int)values.GetInteger("string table size"); StringIDData = segmenter.WrapSegment((int)values.GetInteger("string table offset"), sidDataSize, 1, SegmentResizeOrigin.End); StringIDIndexTable = segmenter.WrapSegment((int)values.GetInteger("string index table offset"), StringIDCount * 4, 4, SegmentResizeOrigin.End); FileNameCount = (int)values.GetInteger("file table count"); var fileDataSize = (int)values.GetInteger("file table size"); FileNameData = segmenter.WrapSegment((int)values.GetInteger("file table offset"), fileDataSize, 1, SegmentResizeOrigin.End); FileNameIndexTable = segmenter.WrapSegment((int)values.GetInteger("file index table offset"), FileNameCount * 4, 4, SegmentResizeOrigin.End); InternalName = values.GetString("internal name"); ScenarioName = values.GetString("scenario name"); StringArea = new FileSegmentGroup(); StringArea.AddSegment(segmenter.WrapSegment((int)values.GetInteger("string block offset"), StringIDCount * 0x80, 0x80, SegmentResizeOrigin.End)); StringArea.AddSegment(StringIDIndexTable); StringArea.AddSegment(StringIDData); StringArea.AddSegment(FileNameIndexTable); StringArea.AddSegment(FileNameData); StringIDIndexTableLocation = SegmentPointer.FromOffset(StringIDIndexTable.Offset, StringArea); StringIDDataLocation = SegmentPointer.FromOffset(StringIDData.Offset, StringArea); FileNameIndexTableLocation = SegmentPointer.FromOffset(FileNameIndexTable.Offset, StringArea); FileNameDataLocation = SegmentPointer.FromOffset(FileNameData.Offset, StringArea); LocaleArea = new FileSegmentGroup(); var rawTableOffset = (int)values.GetInteger("raw table offset"); var rawTableSize = (int)values.GetInteger("raw table size"); RawTable = segmenter.WrapSegment(rawTableOffset, rawTableSize, 1, SegmentResizeOrigin.End); Checksum = values.GetInteger("checksum"); // Set up a bogus partition table Partitions = new Partition[1]; Partitions[0] = new Partition(SegmentPointer.FromOffset(MetaArea.Offset, MetaArea), (uint)MetaArea.Size); }
private void Load(StructureValueCollection values, FileSegmenter segmenter) { _eofSegment = segmenter.WrapEOF((int)values.GetInteger("file size")); var metaOffset = (int)values.GetInteger("meta offset"); int tagTableSize = (int)values.GetInteger("tag data offset"); int tagDataSize = (int)values.GetInteger("tag data size"); var headSegment = new FileSegment( segmenter.DefineSegment(metaOffset, tagTableSize, 0x1000, SegmentResizeOrigin.Beginning), segmenter); //xbox haxx, we can assume thru the existance of the code-set xbox mask uint metaOffsetMask; FileSegment metaSegment = null; if (values.HasInteger("xbox meta offset mask")) { // store the stock meta size since xbox's size is virtual //todo: figure out how this is calculated instead of doing a hack _saved_meta_size_hack = (uint)values.GetInteger("meta size"); metaOffsetMask = (uint)values.GetInteger("xbox meta offset mask"); metaSegment = new FileSegment( segmenter.DefineSegment(metaOffset + tagTableSize, tagDataSize, 0x4, SegmentResizeOrigin.End), segmenter); } else { metaOffsetMask = (uint)values.GetInteger("meta offset mask"); metaSegment = new FileSegment( segmenter.DefineSegment(metaOffset + tagTableSize, tagDataSize, 0x1000, SegmentResizeOrigin.End), segmenter); } MetaArea = new FileSegmentGroup(new MetaOffsetConverter(headSegment, metaOffsetMask)); IndexHeaderLocation = MetaArea.AddSegment(headSegment); MetaArea.AddSegment(metaSegment); Type = (CacheFileType)values.GetInteger("type"); var headerGroup = new FileSegmentGroup(); headerGroup.AddSegment(segmenter.WrapSegment(0, HeaderSize, 1, SegmentResizeOrigin.None)); StringIDCount = (int)values.GetInteger("string table count"); var sidDataSize = (int)values.GetInteger("string table size"); StringIDData = segmenter.WrapSegment((int)values.GetInteger("string table offset"), sidDataSize, 1, SegmentResizeOrigin.End); StringIDIndexTable = segmenter.WrapSegment((int)values.GetInteger("string index table offset"), StringIDCount * 4, 4, SegmentResizeOrigin.End); if (values.HasInteger("file table count")) { FileNameCount = (int)values.GetInteger("file table count"); var fileDataSize = (int)values.GetInteger("file table size"); FileNameData = segmenter.WrapSegment((int)values.GetInteger("file table offset"), fileDataSize, 1, SegmentResizeOrigin.End); FileNameIndexTable = segmenter.WrapSegment((int)values.GetInteger("file index table offset"), FileNameCount * 4, 4, SegmentResizeOrigin.End); } InternalName = values.GetString("internal name"); ScenarioName = values.GetString("scenario name"); StringArea = new FileSegmentGroup(); if (values.HasInteger("string block offset")) { StringArea.AddSegment(segmenter.WrapSegment((int)values.GetInteger("string block offset"), StringIDCount * 0x80, 0x80, SegmentResizeOrigin.End)); } StringArea.AddSegment(StringIDIndexTable); StringArea.AddSegment(StringIDData); StringIDIndexTableLocation = SegmentPointer.FromOffset(StringIDIndexTable.Offset, StringArea); StringIDDataLocation = SegmentPointer.FromOffset(StringIDData.Offset, StringArea); if (FileNameIndexTable != null) { StringArea.AddSegment(FileNameIndexTable); StringArea.AddSegment(FileNameData); FileNameIndexTableLocation = SegmentPointer.FromOffset(FileNameIndexTable.Offset, StringArea); FileNameDataLocation = SegmentPointer.FromOffset(FileNameData.Offset, StringArea); } int rawTableOffset; int rawTableSize; if (values.HasInteger("raw table offset")) { rawTableOffset = (int)values.GetInteger("raw table offset"); rawTableSize = (int)values.GetInteger("raw table size"); // It is apparently possible to create a cache without a raw table, but -1 gets written as the offset if (rawTableOffset != -1) { RawTable = segmenter.WrapSegment(rawTableOffset, rawTableSize, 0x80, SegmentResizeOrigin.End); } } Checksum = (uint)values.GetInteger("checksum"); // Set up a bogus partition table Partitions = new Partition[1]; Partitions[0] = new Partition(SegmentPointer.FromOffset(MetaArea.Offset, MetaArea), (uint)MetaArea.Size); }
private void Load(StructureValueCollection values, FileSegmenter segmenter) { _eofSegment = segmenter.WrapEOF((int)values.GetInteger("file size")); var metaOffset = (int)values.GetInteger("meta offset"); int metaSize; if (values.HasInteger("tag data offset")) { metaSize = (int)values.GetInteger("tag data offset") + (int)values.GetInteger("tag data size"); } else { metaSize = (int)values.GetInteger("meta size"); } // store the stock meta size since xbox's size is virtual //todo: figure out how this is calculated instead of doing a hack _saved_meta_size_hack = (uint)values.GetInteger("meta size"); var metaSegment = new FileSegment( segmenter.DefineSegment(metaOffset, metaSize, 0x4, SegmentResizeOrigin.Beginning), segmenter); uint metaOffsetMask; if (values.HasInteger("xbox meta offset mask")) { metaOffsetMask = (uint)values.GetInteger("xbox meta offset mask"); } else { metaOffsetMask = (uint)(values.GetInteger("tag table offset") - values.GetInteger("meta header size")); } MetaArea = new FileSegmentGroup(new MetaOffsetConverter(metaSegment, metaOffsetMask)); IndexHeaderLocation = MetaArea.AddSegment(metaSegment); Type = (CacheFileType)values.GetInteger("type"); var headerGroup = new FileSegmentGroup(); headerGroup.AddSegment(segmenter.WrapSegment(0, HeaderSize, 1, SegmentResizeOrigin.None)); //h2 alpha forcing this to be shoved in if (values.HasInteger("string table count")) { StringIDCount = (int)values.GetInteger("string table count"); var sidDataSize = (int)values.GetInteger("string table size"); StringIDData = segmenter.WrapSegment((int)values.GetInteger("string table offset"), sidDataSize, 1, SegmentResizeOrigin.End); StringIDIndexTable = segmenter.WrapSegment((int)values.GetInteger("string index table offset"), StringIDCount * 4, 4, SegmentResizeOrigin.End); StringArea = new FileSegmentGroup(); if (values.HasInteger("string block offset")) { StringArea.AddSegment(segmenter.WrapSegment((int)values.GetInteger("string block offset"), StringIDCount * 0x80, 0x80, SegmentResizeOrigin.End)); } StringArea.AddSegment(StringIDIndexTable); StringArea.AddSegment(StringIDData); StringIDIndexTableLocation = SegmentPointer.FromOffset(StringIDIndexTable.Offset, StringArea); StringIDDataLocation = SegmentPointer.FromOffset(StringIDData.Offset, StringArea); } else { //dummy StringIDCount = 0; StringIDData = _eofSegment; StringIDIndexTable = _eofSegment; } InternalName = values.GetString("internal name"); Checksum = (uint)values.GetInteger("checksum"); // dummy partition Partitions = new Partition[1]; Partitions[0] = new Partition(SegmentPointer.FromOffset(MetaArea.Offset, MetaArea), (uint)MetaArea.Size); }