mirror of
https://github.com/Thealexbarney/LibHac.git
synced 2025-02-09 13:14:46 +01:00
Net control
This commit is contained in:
parent
57ea918ab7
commit
54f0f87de3
@ -74,14 +74,44 @@ namespace Net
|
||||
return null;
|
||||
}
|
||||
|
||||
public Nacp GetControl(ulong titleId, int version)
|
||||
{
|
||||
var cnmt = GetCnmt(titleId, version);
|
||||
var controlEntry = cnmt.ContentEntries.FirstOrDefault(x => x.Type == CnmtContentType.Control);
|
||||
if (controlEntry == null) return null;
|
||||
|
||||
var controlNca = GetNcaFile(titleId, version, controlEntry.NcaId.ToHexString());
|
||||
var nca = new Nca(ToolCtx.Keyset, controlNca, true);
|
||||
var romfs = new Romfs(nca.OpenSection(0, false));
|
||||
var controlNacp = romfs.GetFile("/control.nacp");
|
||||
|
||||
var reader = new BinaryReader(new MemoryStream(controlNacp));
|
||||
var control = new Nacp(reader);
|
||||
return control;
|
||||
}
|
||||
|
||||
public Stream GetNcaFile(ulong titleId, int version, string ncaId)
|
||||
{
|
||||
string titleDir = GetTitleDir(titleId, version);
|
||||
var filePath = Path.Combine(titleDir, $"{ncaId.ToLower()}.nca");
|
||||
if (!File.Exists(filePath))
|
||||
{
|
||||
DownloadFile(GetContentUrl(ncaId), filePath);
|
||||
}
|
||||
|
||||
if (!File.Exists(filePath)) return null;
|
||||
|
||||
return new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
|
||||
}
|
||||
|
||||
private void DownloadCnmt(ulong titleId, int version)
|
||||
{
|
||||
var titleDir = GetTitleDir(titleId, version);
|
||||
|
||||
var ncaId = GetMetadataNcaId(titleId, version);
|
||||
var filename = $"{ncaId}.cnmt.nca";
|
||||
var filename = $"{ncaId.ToLower()}.cnmt.nca";
|
||||
var filePath = Path.Combine(titleDir, filename);
|
||||
DownloadFile(GetContentUrl(ncaId), filePath);
|
||||
DownloadFile(GetMetaUrl(ncaId), filePath);
|
||||
}
|
||||
|
||||
public void DownloadFile(string url, string filePath)
|
||||
@ -103,9 +133,15 @@ namespace Net
|
||||
return titleDir;
|
||||
}
|
||||
|
||||
public string GetMetaUrl(string ncaId)
|
||||
{
|
||||
string url = $"{GetAtumUrl()}/c/a/{ncaId.ToLower()}";
|
||||
return url;
|
||||
}
|
||||
|
||||
public string GetContentUrl(string ncaId)
|
||||
{
|
||||
string url = $"{GetAtumUrl()}/c/a/{ncaId}";
|
||||
string url = $"{GetAtumUrl()}/c/c/{ncaId.ToLower()}";
|
||||
return url;
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using libhac;
|
||||
@ -24,17 +26,37 @@ namespace Net
|
||||
|
||||
private static void ProcessNet(Context ctx)
|
||||
{
|
||||
|
||||
if (ctx.Options.DeviceId == 0)
|
||||
{
|
||||
CliParser.PrintWithUsage("A non-zero Device ID must be set.");
|
||||
return;
|
||||
}
|
||||
|
||||
var tid = ctx.Options.TitleId;
|
||||
var ver = ctx.Options.Version;
|
||||
|
||||
var net = new NetContext(ctx);
|
||||
var cnmt = net.GetCnmt(ctx.Options.TitleId, ctx.Options.Version);
|
||||
//GetControls(net);
|
||||
|
||||
var cnmt = net.GetCnmt(tid, ver);
|
||||
foreach (var entry in cnmt.ContentEntries)
|
||||
{
|
||||
Console.WriteLine($"{entry.NcaId.ToHexString()} {entry.Type}");
|
||||
net.GetNcaFile(tid, ver, entry.NcaId.ToHexString());
|
||||
}
|
||||
|
||||
var control = net.GetControl(tid, ver);
|
||||
;
|
||||
}
|
||||
|
||||
private static void GetControls(NetContext net)
|
||||
{
|
||||
var titles = GetTitleIds("titles.txt");
|
||||
|
||||
foreach (var title in titles)
|
||||
{
|
||||
var control = net.GetControl(title, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@ -65,5 +87,25 @@ namespace Net
|
||||
|
||||
ctx.Keyset = ExternalKeys.ReadKeyFile(keyFile, titleKeyFile, consoleKeyFile, ctx.Logger);
|
||||
}
|
||||
|
||||
private static List<ulong> GetTitleIds(string filename)
|
||||
{
|
||||
var titles = new List<ulong>();
|
||||
|
||||
using (var reader = new StreamReader(new FileStream(filename, FileMode.Open, FileAccess.Read)))
|
||||
{
|
||||
string line;
|
||||
while ((line = reader.ReadLine()) != null)
|
||||
{
|
||||
if (ulong.TryParse(line, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var id))
|
||||
{
|
||||
titles.Add(id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return titles;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -67,14 +67,14 @@ namespace libhac
|
||||
const int bufferSize = 0x8000;
|
||||
long remaining = length;
|
||||
byte[] buffer = new byte[bufferSize];
|
||||
progress?.SetTotal((length + bufferSize) / bufferSize);
|
||||
progress?.SetTotal(length);
|
||||
|
||||
int read;
|
||||
while ((read = input.Read(buffer, 0, (int)Math.Min(buffer.Length, remaining))) > 0)
|
||||
{
|
||||
output.Write(buffer, 0, read);
|
||||
remaining -= read;
|
||||
progress?.ReportAdd(1);
|
||||
progress?.ReportAdd(read);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user