public NSO(Stream stream, float version, long maxMetadataUsages) : base(stream, version, maxMetadataUsages) { header = new NSOHeader(); header.Magic = ReadUInt32(); header.Version = ReadUInt32(); header.Reserved = ReadUInt32(); header.Flags = ReadUInt32(); isTextCompressed = (header.Flags & 1) != 0; isRoDataCompressed = (header.Flags & 2) != 0; isDataCompressed = (header.Flags & 4) != 0; header.TextSegment = new NSOSegmentHeader { FileOffset = ReadUInt32(), MemoryOffset = ReadUInt32(), DecompressedSize = ReadUInt32() }; segments.Add(header.TextSegment); header.ModuleOffset = ReadUInt32(); header.RoDataSegment = new NSOSegmentHeader { FileOffset = ReadUInt32(), MemoryOffset = ReadUInt32(), DecompressedSize = ReadUInt32() }; segments.Add(header.RoDataSegment); header.ModuleFileSize = ReadUInt32(); header.DataSegment = new NSOSegmentHeader { FileOffset = ReadUInt32(), MemoryOffset = ReadUInt32(), DecompressedSize = ReadUInt32() }; segments.Add(header.DataSegment); header.BssSize = ReadUInt32(); header.DigestBuildID = ReadBytes(0x20); header.TextCompressedSize = ReadUInt32(); header.RoDataCompressedSize = ReadUInt32(); header.DataCompressedSize = ReadUInt32(); header.Padding = ReadBytes(0x1C); header.APIInfo = new NSORelativeExtent { RegionRoDataOffset = ReadUInt32(), RegionSize = ReadUInt32() }; header.DynStr = new NSORelativeExtent { RegionRoDataOffset = ReadUInt32(), RegionSize = ReadUInt32() }; header.DynSym = new NSORelativeExtent { RegionRoDataOffset = ReadUInt32(), RegionSize = ReadUInt32() }; header.TextHash = ReadBytes(0x20); header.RoDataHash = ReadBytes(0x20); header.DataHash = ReadBytes(0x20); if (!isCompressed) { Position = header.TextSegment.FileOffset + 4; var modOffset = ReadUInt32(); Position = header.TextSegment.FileOffset + modOffset + 8; var bssStart = ReadUInt32(); var bssEnd = ReadUInt32(); header.BssSegment = new NSOSegmentHeader { FileOffset = bssStart, MemoryOffset = bssStart, DecompressedSize = bssEnd - bssStart }; } }
public NSO(Stream stream) : base(stream) { header = new NSOHeader(); header.Magic = ReadUInt32(); header.Version = ReadUInt32(); header.Reserved = ReadUInt32(); header.Flags = ReadUInt32(); isTextCompressed = (header.Flags & 1) != 0; isRoDataCompressed = (header.Flags & 2) != 0; isDataCompressed = (header.Flags & 4) != 0; header.TextSegment = new NSOSegmentHeader { FileOffset = ReadUInt32(), MemoryOffset = ReadUInt32(), DecompressedSize = ReadUInt32() }; segments.Add(header.TextSegment); header.ModuleOffset = ReadUInt32(); header.RoDataSegment = new NSOSegmentHeader { FileOffset = ReadUInt32(), MemoryOffset = ReadUInt32(), DecompressedSize = ReadUInt32() }; segments.Add(header.RoDataSegment); header.ModuleFileSize = ReadUInt32(); header.DataSegment = new NSOSegmentHeader { FileOffset = ReadUInt32(), MemoryOffset = ReadUInt32(), DecompressedSize = ReadUInt32() }; segments.Add(header.DataSegment); header.BssSize = ReadUInt32(); header.DigestBuildID = ReadBytes(0x20); header.TextCompressedSize = ReadUInt32(); header.RoDataCompressedSize = ReadUInt32(); header.DataCompressedSize = ReadUInt32(); header.Padding = ReadBytes(0x1C); header.APIInfo = new NSORelativeExtent { RegionRoDataOffset = ReadUInt32(), RegionSize = ReadUInt32() }; header.DynStr = new NSORelativeExtent { RegionRoDataOffset = ReadUInt32(), RegionSize = ReadUInt32() }; header.DynSym = new NSORelativeExtent { RegionRoDataOffset = ReadUInt32(), RegionSize = ReadUInt32() }; header.TextHash = ReadBytes(0x20); header.RoDataHash = ReadBytes(0x20); header.DataHash = ReadBytes(0x20); if (!isCompressed) { Position = header.TextSegment.FileOffset + 4; var modOffset = ReadUInt32(); Position = header.TextSegment.FileOffset + modOffset + 4; var dynamicOffset = ReadUInt32() + modOffset; var bssStart = ReadUInt32(); var bssEnd = ReadUInt32(); header.BssSegment = new NSOSegmentHeader { FileOffset = bssStart, MemoryOffset = bssStart, DecompressedSize = bssEnd - bssStart }; var maxSize = (header.DataSegment.MemoryOffset + header.DataSegment.DecompressedSize - dynamicOffset) / 16; Position = MapVATR(dynamicOffset); for (int i = 0; i < maxSize; i++) { var dynamic = ReadClass <Elf64_Dyn>(); if (dynamic.d_tag == 0) { break; } else { dynamicSection.Add(dynamic); } } ReadSymbol(); RelocationProcessing(); } }