mirror of
https://github.com/Thealexbarney/LibHac.git
synced 2024-11-14 10:49:41 +01:00
152 lines
4 KiB
C#
152 lines
4 KiB
C#
using System.IO;
|
|
|
|
namespace libhac
|
|
{
|
|
public class RelocationBlock
|
|
{
|
|
public uint Field0;
|
|
public int BucketCount;
|
|
public long Size;
|
|
public long[] BaseOffsets;
|
|
public RelocationBucket[] Buckets;
|
|
|
|
public RelocationBlock(BinaryReader reader)
|
|
{
|
|
var start = reader.BaseStream.Position;
|
|
|
|
Field0 = reader.ReadUInt32();
|
|
BucketCount = reader.ReadInt32();
|
|
Size = reader.ReadInt64();
|
|
BaseOffsets = new long[BucketCount];
|
|
Buckets = new RelocationBucket[BucketCount];
|
|
|
|
for (int i = 0; i < BucketCount; i++)
|
|
{
|
|
BaseOffsets[i] = reader.ReadInt64();
|
|
}
|
|
|
|
reader.BaseStream.Position = start + 0x4000;
|
|
|
|
for (int i = 0; i < BucketCount; i++)
|
|
{
|
|
Buckets[i] = new RelocationBucket(reader);
|
|
}
|
|
}
|
|
}
|
|
|
|
public class RelocationBucket
|
|
{
|
|
public int BucketNum;
|
|
public int EntryCount;
|
|
public long VirtualOffsetEnd;
|
|
public RelocationEntry[] Entries;
|
|
|
|
public RelocationBucket(BinaryReader reader)
|
|
{
|
|
var start = reader.BaseStream.Position;
|
|
|
|
BucketNum = reader.ReadInt32();
|
|
EntryCount = reader.ReadInt32();
|
|
VirtualOffsetEnd = reader.ReadInt64();
|
|
Entries = new RelocationEntry[EntryCount];
|
|
|
|
for (int i = 0; i < EntryCount; i++)
|
|
{
|
|
Entries[i] = new RelocationEntry(reader);
|
|
}
|
|
|
|
reader.BaseStream.Position = start + 0x4000;
|
|
}
|
|
}
|
|
|
|
public class RelocationEntry
|
|
{
|
|
public long VirtOffset;
|
|
public long VirtOffsetEnd;
|
|
public long PhysOffset;
|
|
public bool IsPatch;
|
|
public RelocationEntry Next;
|
|
|
|
public RelocationEntry(BinaryReader reader)
|
|
{
|
|
VirtOffset = reader.ReadInt64();
|
|
PhysOffset = reader.ReadInt64();
|
|
IsPatch = reader.ReadInt32() != 0;
|
|
}
|
|
}
|
|
|
|
public class SubsectionBlock
|
|
{
|
|
public uint Field0;
|
|
public int BucketCount;
|
|
public long Size;
|
|
public long[] BaseOffsets;
|
|
public SubsectionBucket[] Buckets;
|
|
|
|
public SubsectionBlock(BinaryReader reader)
|
|
{
|
|
var start = reader.BaseStream.Position;
|
|
|
|
Field0 = reader.ReadUInt32();
|
|
BucketCount = reader.ReadInt32();
|
|
Size = reader.ReadInt64();
|
|
BaseOffsets = new long[BucketCount];
|
|
Buckets = new SubsectionBucket[BucketCount];
|
|
|
|
for (int i = 0; i < BucketCount; i++)
|
|
{
|
|
BaseOffsets[i] = reader.ReadInt64();
|
|
}
|
|
|
|
reader.BaseStream.Position = start + 0x4000;
|
|
|
|
for (int i = 0; i < BucketCount; i++)
|
|
{
|
|
Buckets[i] = new SubsectionBucket(reader);
|
|
}
|
|
}
|
|
}
|
|
|
|
public class SubsectionBucket
|
|
{
|
|
public int BucketNum;
|
|
public int EntryCount;
|
|
public long VirtualOffsetEnd;
|
|
public SubsectionEntry[] Entries;
|
|
public SubsectionBucket(BinaryReader reader)
|
|
{
|
|
var start = reader.BaseStream.Position;
|
|
|
|
BucketNum = reader.ReadInt32();
|
|
EntryCount = reader.ReadInt32();
|
|
VirtualOffsetEnd = reader.ReadInt64();
|
|
Entries = new SubsectionEntry[EntryCount];
|
|
|
|
for (int i = 0; i < EntryCount; i++)
|
|
{
|
|
Entries[i] = new SubsectionEntry(reader);
|
|
}
|
|
|
|
reader.BaseStream.Position = start + 0x4000;
|
|
}
|
|
}
|
|
|
|
public class SubsectionEntry
|
|
{
|
|
public long Offset;
|
|
public uint Field8;
|
|
public uint Counter;
|
|
|
|
public SubsectionEntry Next;
|
|
public long OffsetEnd;
|
|
|
|
public SubsectionEntry() { }
|
|
|
|
public SubsectionEntry(BinaryReader reader)
|
|
{
|
|
Offset = reader.ReadInt64();
|
|
Field8 = reader.ReadUInt32();
|
|
Counter = reader.ReadUInt32();
|
|
}
|
|
}
|
|
}
|