mirror of
https://github.com/Thealexbarney/LibHac.git
synced 2024-11-14 10:49:41 +01:00
Fixed Nso implementation
Added more keyset printing
This commit is contained in:
parent
0efc550fa6
commit
86aa80c87b
2 changed files with 46 additions and 17 deletions
|
@ -269,9 +269,11 @@ namespace LibHac
|
||||||
public static class ExternalKeys
|
public static class ExternalKeys
|
||||||
{
|
{
|
||||||
private const int TitleKeySize = 0x10;
|
private const int TitleKeySize = 0x10;
|
||||||
private static readonly Dictionary<string, KeyValue> CommonKeyDict;
|
|
||||||
private static readonly Dictionary<string, KeyValue> UniqueKeyDict;
|
public static readonly Dictionary<string, KeyValue>
|
||||||
private static readonly Dictionary<string, KeyValue> AllKeyDict;
|
CommonKeyDict,
|
||||||
|
UniqueKeyDict,
|
||||||
|
AllKeyDict;
|
||||||
|
|
||||||
static ExternalKeys()
|
static ExternalKeys()
|
||||||
{
|
{
|
||||||
|
@ -393,12 +395,12 @@ namespace LibHac
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string PrintKeys(Keyset keyset)
|
public static string PrintKeys(Keyset keyset, Dictionary<string, KeyValue> dict)
|
||||||
{
|
{
|
||||||
var sb = new StringBuilder();
|
var sb = new StringBuilder();
|
||||||
int maxNameLength = CommonKeyDict.Values.Max(x => x.Name.Length);
|
int maxNameLength = dict.Values.Max(x => x.Name.Length);
|
||||||
|
|
||||||
foreach (KeyValue keySlot in CommonKeyDict.Values.OrderBy(x => x.Name))
|
foreach (KeyValue keySlot in dict.Values.OrderBy(x => x.Name))
|
||||||
{
|
{
|
||||||
byte[] key = keySlot.GetKey(keyset);
|
byte[] key = keySlot.GetKey(keyset);
|
||||||
if (key.IsEmpty()) continue;
|
if (key.IsEmpty()) continue;
|
||||||
|
@ -410,6 +412,37 @@ namespace LibHac
|
||||||
return sb.ToString();
|
return sb.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static string PrintCommonKeys(Keyset keyset)
|
||||||
|
{
|
||||||
|
return PrintKeys(keyset, CommonKeyDict);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string PrintUniqueKeys(Keyset keyset)
|
||||||
|
{
|
||||||
|
return PrintKeys(keyset, UniqueKeyDict);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string PrintAllKeys(Keyset keyset)
|
||||||
|
{
|
||||||
|
return PrintKeys(keyset, AllKeyDict);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string PrintTitleKeys(Keyset keyset)
|
||||||
|
{
|
||||||
|
var sb = new StringBuilder();
|
||||||
|
int maxNameLength = keyset.TitleKeys.Values.Max(x => x.Length);
|
||||||
|
|
||||||
|
foreach (KeyValuePair<byte[], byte[]> kv in keyset.TitleKeys)
|
||||||
|
{
|
||||||
|
byte[] key = kv.Key;
|
||||||
|
byte[] value = kv.Value;
|
||||||
|
var line = $"{key.ToHexString().PadRight(maxNameLength)} = {value.ToHexString()}";
|
||||||
|
sb.AppendLine(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
private static List<KeyValue> CreateCommonKeyList()
|
private static List<KeyValue> CreateCommonKeyList()
|
||||||
{
|
{
|
||||||
var keys = new List<KeyValue>
|
var keys = new List<KeyValue>
|
||||||
|
@ -489,7 +522,7 @@ namespace LibHac
|
||||||
return keys;
|
return keys;
|
||||||
}
|
}
|
||||||
|
|
||||||
private class KeyValue
|
public class KeyValue
|
||||||
{
|
{
|
||||||
public readonly string Name;
|
public readonly string Name;
|
||||||
public readonly int Size;
|
public readonly int Size;
|
||||||
|
|
|
@ -36,11 +36,11 @@ namespace LibHac
|
||||||
dataSection.IsCompressed = flags[2];
|
dataSection.IsCompressed = flags[2];
|
||||||
dataSection.CheckHash = flags[5];
|
dataSection.CheckHash = flags[5];
|
||||||
|
|
||||||
ReadSegmentHeader(textSection);
|
ReadSegmentHeader(textSection, reader);
|
||||||
reader.ReadUInt32(); // Module offset (TODO)
|
reader.ReadUInt32(); // Module offset (TODO)
|
||||||
ReadSegmentHeader(rodataSection);
|
ReadSegmentHeader(rodataSection, reader);
|
||||||
reader.ReadUInt32(); // Module file size
|
reader.ReadUInt32(); // Module file size
|
||||||
ReadSegmentHeader(dataSection);
|
ReadSegmentHeader(dataSection, reader);
|
||||||
BssSize = reader.ReadUInt32();
|
BssSize = reader.ReadUInt32();
|
||||||
reader.Read(BuildID, 0, 0x20);
|
reader.Read(BuildID, 0, 0x20);
|
||||||
textSection.CompressedSize = reader.ReadUInt32();
|
textSection.CompressedSize = reader.ReadUInt32();
|
||||||
|
@ -49,7 +49,7 @@ namespace LibHac
|
||||||
reader.ReadBytes(0x1C); // Padding
|
reader.ReadBytes(0x1C); // Padding
|
||||||
RodataRelativeExtents = new RodataRelativeExtent[]
|
RodataRelativeExtents = new RodataRelativeExtent[]
|
||||||
{
|
{
|
||||||
ReadRodataRelativeExtent(), ReadRodataRelativeExtent(), ReadRodataRelativeExtent()
|
ReadRodataRelativeExtent(reader), ReadRodataRelativeExtent(reader), ReadRodataRelativeExtent(reader)
|
||||||
};
|
};
|
||||||
|
|
||||||
reader.Read(textSection.Hash, 0, 0x20);
|
reader.Read(textSection.Hash, 0, 0x20);
|
||||||
|
@ -60,22 +60,18 @@ namespace LibHac
|
||||||
reader.Close();
|
reader.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ReadSegmentHeader(NsoSection section)
|
public void ReadSegmentHeader(NsoSection section, BinaryReader reader)
|
||||||
{
|
{
|
||||||
BinaryReader reader = new BinaryReader(StreamSource.CreateStream());
|
|
||||||
section.FileOffset = reader.ReadUInt32();
|
section.FileOffset = reader.ReadUInt32();
|
||||||
section.MemoryOffset = reader.ReadUInt32();
|
section.MemoryOffset = reader.ReadUInt32();
|
||||||
section.DecompressedSize = reader.ReadUInt32();
|
section.DecompressedSize = reader.ReadUInt32();
|
||||||
reader.Close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public RodataRelativeExtent ReadRodataRelativeExtent()
|
public RodataRelativeExtent ReadRodataRelativeExtent(BinaryReader reader)
|
||||||
{
|
{
|
||||||
BinaryReader reader = new BinaryReader(StreamSource.CreateStream());
|
|
||||||
RodataRelativeExtent extent = new RodataRelativeExtent();
|
RodataRelativeExtent extent = new RodataRelativeExtent();
|
||||||
extent.RegionRodataOffset = reader.ReadUInt32();
|
extent.RegionRodataOffset = reader.ReadUInt32();
|
||||||
extent.RegionSize = reader.ReadUInt32();
|
extent.RegionSize = reader.ReadUInt32();
|
||||||
reader.Close();
|
|
||||||
return extent;
|
return extent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue