mirror of
https://github.com/Thealexbarney/LibHac.git
synced 2024-11-14 10:49:41 +01:00
Fixes
This commit is contained in:
parent
148f641d30
commit
92880e0b63
6 changed files with 30 additions and 20 deletions
|
@ -84,13 +84,15 @@ namespace LibHac.IO
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void CopyToStream(this IStorage input, Stream output, long length, IProgressReport progress = null)
|
public static void CopyToStream(this IStorage input, Stream output, long length, IProgressReport progress = null, long sublength = -1)
|
||||||
{
|
{
|
||||||
|
if (sublength < 0)
|
||||||
|
sublength = length;
|
||||||
const int bufferSize = 0x8000;
|
const int bufferSize = 0x8000;
|
||||||
long remaining = length;
|
long remaining = length;
|
||||||
long inOffset = 0;
|
long inOffset = 0;
|
||||||
var buffer = new byte[bufferSize];
|
var buffer = new byte[bufferSize];
|
||||||
progress?.SetTotal(length);
|
progress?.SetTotal(sublength);
|
||||||
|
|
||||||
while (remaining > 0)
|
while (remaining > 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -24,7 +24,7 @@ namespace LibHac
|
||||||
Entries.Add(entry);
|
Entries.Add(entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Build(Stream output, IProgressReport logger = null)
|
public void Build(Stream output, IProgressReport logger = null, bool leaveOpen = true)
|
||||||
{
|
{
|
||||||
var strings = new MemoryStream();
|
var strings = new MemoryStream();
|
||||||
var stringWriter = new BinaryWriter(strings);
|
var stringWriter = new BinaryWriter(strings);
|
||||||
|
@ -58,9 +58,12 @@ namespace LibHac
|
||||||
foreach (Entry entry in Entries)
|
foreach (Entry entry in Entries)
|
||||||
{
|
{
|
||||||
logger?.LogMessage(entry.Name);
|
logger?.LogMessage(entry.Name);
|
||||||
entry.Storage.CopyTo(output.AsStorage(), logger);
|
entry.Storage.CopyToStream(output, entry.Length, logger, DataLength);
|
||||||
}
|
}
|
||||||
logger?.SetTotal(0);
|
logger?.SetTotal(0);
|
||||||
|
|
||||||
|
if (!leaveOpen)
|
||||||
|
output.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
private class Entry
|
private class Entry
|
||||||
|
|
|
@ -125,18 +125,23 @@ namespace LibHac
|
||||||
{
|
{
|
||||||
Savefile save = null;
|
Savefile save = null;
|
||||||
string saveName = Path.GetFileNameWithoutExtension(file.Path);
|
string saveName = Path.GetFileNameWithoutExtension(file.Path);
|
||||||
|
IStorage storage = Fs.OpenFile(file, FileMode.Open);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
IStorage storage = Fs.OpenFile(file, FileMode.Open);
|
|
||||||
|
|
||||||
string sdPath = Util.GetRelativePath(file.Path, SaveDir.Path).Replace("\\", "/");
|
string sdPath = Util.GetRelativePath(file.Path, SaveDir.Path).Replace("\\", "/");
|
||||||
var nax0 = new Nax0(Keyset, storage, sdPath, false);
|
var nax0 = new Nax0(Keyset, storage, sdPath, false);
|
||||||
save = new Savefile(Keyset, nax0.BaseStorage, IntegrityCheckLevel.None, true);
|
save = new Savefile(Keyset, nax0.BaseStorage, IntegrityCheckLevel.None, true);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
Console.WriteLine($"{ex.Message} File: {file}");
|
try
|
||||||
|
{
|
||||||
|
save = new Savefile(Keyset, storage, IntegrityCheckLevel.None, false);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"{ex.Message} File: {file}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (save != null && saveName != null)
|
if (save != null && saveName != null)
|
||||||
|
|
|
@ -89,10 +89,10 @@ namespace NandReader
|
||||||
var tickets = new List<Ticket>();
|
var tickets = new List<Ticket>();
|
||||||
NandPartition system = nand.OpenSystemPartition();
|
NandPartition system = nand.OpenSystemPartition();
|
||||||
|
|
||||||
Stream saveE1File = system.OpenFile("save\\80000000000000E1", FileMode.Open, FileAccess.Read);
|
IStorage saveE1File = system.GetFile("save\\80000000000000E1").Open(FileMode.Open, FileAccess.Read);
|
||||||
tickets.AddRange(ReadTickets(keyset, saveE1File));
|
tickets.AddRange(ReadTickets(keyset, saveE1File));
|
||||||
|
|
||||||
Stream saveE2 = system.OpenFile("save\\80000000000000E2", FileMode.Open, FileAccess.Read);
|
IStorage saveE2 = system.GetFile("save\\80000000000000E2").Open(FileMode.Open, FileAccess.Read);
|
||||||
tickets.AddRange(ReadTickets(keyset, saveE2));
|
tickets.AddRange(ReadTickets(keyset, saveE2));
|
||||||
|
|
||||||
logger?.LogMessage($"Found {tickets.Count} tickets");
|
logger?.LogMessage($"Found {tickets.Count} tickets");
|
||||||
|
@ -100,10 +100,10 @@ namespace NandReader
|
||||||
return tickets.ToArray();
|
return tickets.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<Ticket> ReadTickets(Keyset keyset, Stream savefile)
|
private static List<Ticket> ReadTickets(Keyset keyset, IStorage savefile)
|
||||||
{
|
{
|
||||||
var tickets = new List<Ticket>();
|
var tickets = new List<Ticket>();
|
||||||
var save = new Savefile(keyset, savefile.AsStorage(), IntegrityCheckLevel.None, true);
|
var save = new Savefile(keyset, savefile, IntegrityCheckLevel.None, true);
|
||||||
var ticketList = new BinaryReader(save.OpenFile("/ticket_list.bin").AsStream());
|
var ticketList = new BinaryReader(save.OpenFile("/ticket_list.bin").AsStream());
|
||||||
var ticketFile = new BinaryReader(save.OpenFile("/ticket.bin").AsStream());
|
var ticketFile = new BinaryReader(save.OpenFile("/ticket.bin").AsStream());
|
||||||
|
|
||||||
|
|
|
@ -73,10 +73,10 @@ namespace NandReaderGui.ViewModel
|
||||||
var tickets = new List<Ticket>();
|
var tickets = new List<Ticket>();
|
||||||
NandPartition system = nand.OpenSystemPartition();
|
NandPartition system = nand.OpenSystemPartition();
|
||||||
|
|
||||||
Stream saveE1File = system.OpenFile("save\\80000000000000E1", FileMode.Open, FileAccess.Read);
|
IStorage saveE1File = system.GetFile("save\\80000000000000E1").Open(FileMode.Open, FileAccess.Read);
|
||||||
tickets.AddRange(ReadTickets(keyset, saveE1File));
|
tickets.AddRange(ReadTickets(keyset, saveE1File));
|
||||||
|
|
||||||
Stream saveE2 = system.OpenFile("save\\80000000000000E2", FileMode.Open, FileAccess.Read);
|
IStorage saveE2 = system.GetFile("save\\80000000000000E2").Open(FileMode.Open, FileAccess.Read);
|
||||||
tickets.AddRange(ReadTickets(keyset, saveE2));
|
tickets.AddRange(ReadTickets(keyset, saveE2));
|
||||||
|
|
||||||
logger?.LogMessage($"Found {tickets.Count} tickets");
|
logger?.LogMessage($"Found {tickets.Count} tickets");
|
||||||
|
@ -84,10 +84,10 @@ namespace NandReaderGui.ViewModel
|
||||||
return tickets.ToArray();
|
return tickets.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<Ticket> ReadTickets(Keyset keyset, Stream savefile)
|
private static List<Ticket> ReadTickets(Keyset keyset, IStorage savefile)
|
||||||
{
|
{
|
||||||
var tickets = new List<Ticket>();
|
var tickets = new List<Ticket>();
|
||||||
var save = new Savefile(keyset, savefile.AsStorage(), IntegrityCheckLevel.None, true);
|
var save = new Savefile(keyset, savefile, IntegrityCheckLevel.None, true);
|
||||||
var ticketList = new BinaryReader(save.OpenFile("/ticket_list.bin").AsStream());
|
var ticketList = new BinaryReader(save.OpenFile("/ticket_list.bin").AsStream());
|
||||||
var ticketFile = new BinaryReader(save.OpenFile("/ticket.bin").AsStream());
|
var ticketFile = new BinaryReader(save.OpenFile("/ticket.bin").AsStream());
|
||||||
|
|
||||||
|
|
|
@ -69,7 +69,7 @@ namespace hactoolnet
|
||||||
|
|
||||||
foreach (Nca nca in title.Ncas)
|
foreach (Nca nca in title.Ncas)
|
||||||
{
|
{
|
||||||
builder.AddFile(nca.Filename, nca.GetStorage().AsStream());
|
builder.AddFile(nca.Filename, nca.GetStorage());
|
||||||
}
|
}
|
||||||
|
|
||||||
var ticket = new Ticket
|
var ticket = new Ticket
|
||||||
|
@ -84,11 +84,11 @@ namespace hactoolnet
|
||||||
SectHeaderOffset = 0x2C0
|
SectHeaderOffset = 0x2C0
|
||||||
};
|
};
|
||||||
byte[] ticketBytes = ticket.GetBytes();
|
byte[] ticketBytes = ticket.GetBytes();
|
||||||
builder.AddFile($"{ticket.RightsId.ToHexString()}.tik", new MemoryStream(ticketBytes));
|
builder.AddFile($"{ticket.RightsId.ToHexString()}.tik", new MemoryStream(ticketBytes).AsStorage());
|
||||||
|
|
||||||
Assembly thisAssembly = Assembly.GetExecutingAssembly();
|
Assembly thisAssembly = Assembly.GetExecutingAssembly();
|
||||||
Stream cert = thisAssembly.GetManifestResourceStream("hactoolnet.CA00000003_XS00000020");
|
Stream cert = thisAssembly.GetManifestResourceStream("hactoolnet.CA00000003_XS00000020");
|
||||||
builder.AddFile($"{ticket.RightsId.ToHexString()}.cert", cert);
|
builder.AddFile($"{ticket.RightsId.ToHexString()}.cert", cert.AsStorage());
|
||||||
|
|
||||||
|
|
||||||
using (var outStream = new FileStream(ctx.Options.NspOut, FileMode.Create, FileAccess.ReadWrite))
|
using (var outStream = new FileStream(ctx.Options.NspOut, FileMode.Create, FileAccess.ReadWrite))
|
||||||
|
|
Loading…
Reference in a new issue