mirror of
https://github.com/Thealexbarney/LibHac.git
synced 2024-11-14 10:49:41 +01:00
Make sure storage conversion extensions are in place
This commit is contained in:
parent
8e151c4a1c
commit
1d07a98d1e
13 changed files with 57 additions and 21 deletions
|
@ -31,7 +31,7 @@ namespace LibHac.IO
|
|||
throw new ArgumentException("NAX0 key derivation failed.");
|
||||
}
|
||||
|
||||
IStorage encStorage = new FileStorage(BaseFile).Slice(HeaderLength, Header.Size);
|
||||
IStorage encStorage = BaseFile.AsStorage().Slice(HeaderLength, Header.Size);
|
||||
BaseStorage = new CachedStorage(new Aes128XtsStorage(encStorage, Header.DecryptedKey1, Header.DecryptedKey2, BlockSize, true), 4, true);
|
||||
}
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ namespace LibHac.IO
|
|||
|
||||
if (Delta.Length < 0x40) throw new InvalidDataException("Delta file is too small.");
|
||||
|
||||
Header = new DeltaFragmentHeader(new StorageFile(delta, OpenMode.Read));
|
||||
Header = new DeltaFragmentHeader(delta.AsFile(OpenMode.Read));
|
||||
|
||||
if (Header.Magic != Ndv0Magic) throw new InvalidDataException("NDV0 magic value is missing.");
|
||||
|
||||
|
@ -67,7 +67,7 @@ namespace LibHac.IO
|
|||
|
||||
private void ParseDeltaStructure()
|
||||
{
|
||||
var reader = new FileReader(new StorageFile(Delta, OpenMode.Read));
|
||||
var reader = new FileReader(Delta.AsFile(OpenMode.Read));
|
||||
|
||||
reader.Position = Header.FragmentHeaderSize;
|
||||
|
||||
|
|
|
@ -119,6 +119,7 @@ namespace LibHac.IO
|
|||
}
|
||||
}
|
||||
|
||||
public static IStorage AsStorage(this IFile file) => new FileStorage(file);
|
||||
public static Stream AsStream(this IFile file) => new NxFileStream(file, true);
|
||||
public static Stream AsStream(this IFile file, bool keepOpen) => new NxFileStream(file, keepOpen);
|
||||
|
||||
|
|
34
src/LibHac/IO/NullFile.cs
Normal file
34
src/LibHac/IO/NullFile.cs
Normal file
|
@ -0,0 +1,34 @@
|
|||
using System;
|
||||
|
||||
namespace LibHac.IO
|
||||
{
|
||||
public class NullFile : FileBase
|
||||
{
|
||||
public NullFile() { }
|
||||
public NullFile(long length) => Length = length;
|
||||
|
||||
private long Length { get; }
|
||||
|
||||
public override int Read(Span<byte> destination, long offset)
|
||||
{
|
||||
int toRead = ValidateReadParamsAndGetSize(destination, offset);
|
||||
destination.Slice(0, toRead).Clear();
|
||||
return toRead;
|
||||
}
|
||||
|
||||
public override void Write(ReadOnlySpan<byte> source, long offset)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Flush()
|
||||
{
|
||||
}
|
||||
|
||||
public override long GetSize() => Length;
|
||||
|
||||
public override void SetSize(long size)
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -104,8 +104,7 @@ namespace LibHac.IO.Save
|
|||
|
||||
if (file.BlockIndex < 0)
|
||||
{
|
||||
// todo
|
||||
return new StorageFile(new MemoryStorage(new byte[0]), OpenMode.ReadWrite);
|
||||
return new NullFile();
|
||||
}
|
||||
|
||||
AllocationTableStorage storage = OpenFatBlock(file.BlockIndex, file.FileSize);
|
||||
|
|
|
@ -40,6 +40,8 @@ namespace LibHac.IO
|
|||
public static Stream AsStream(this IStorage storage, FileAccess access) => new StorageStream(storage, access, true);
|
||||
public static Stream AsStream(this IStorage storage, FileAccess access, bool keepOpen) => new StorageStream(storage, access, keepOpen);
|
||||
|
||||
public static IFile AsFile(this IStorage storage, OpenMode mode) => new StorageFile(storage, mode);
|
||||
|
||||
public static void CopyTo(this IStorage input, IStorage output, IProgressReport progress = null)
|
||||
{
|
||||
const int bufferSize = 81920;
|
||||
|
|
|
@ -232,7 +232,8 @@ namespace LibHac
|
|||
// Set the master hash
|
||||
initInfo[0] = new IntegrityVerificationInfo
|
||||
{
|
||||
Data = new StreamStorage(new MemoryStream(sb.MasterHash), true),
|
||||
// todo Get hash directly from header
|
||||
Data = new MemoryStorage(sb.MasterHash),
|
||||
|
||||
BlockSize = 0,
|
||||
Type = IntegrityStorageType.PartitionFs
|
||||
|
@ -301,7 +302,7 @@ namespace LibHac
|
|||
|
||||
if (!pfs.FileExists("main.npdm")) return;
|
||||
|
||||
var npdmStorage = new FileStorage(pfs.OpenFile("main.npdm", OpenMode.Read));
|
||||
IStorage npdmStorage = pfs.OpenFile("main.npdm", OpenMode.Read).AsStorage();
|
||||
|
||||
Npdm = new Npdm.NpdmBinary(npdmStorage.AsStream(), Keyset);
|
||||
|
||||
|
|
|
@ -67,7 +67,7 @@ namespace LibHac
|
|||
Nca nca = null;
|
||||
try
|
||||
{
|
||||
var storage = new FileStorage(ContentFs.OpenFile(fileEntry.FullPath, OpenMode.Read));
|
||||
IStorage storage = ContentFs.OpenFile(fileEntry.FullPath, OpenMode.Read).AsStorage();
|
||||
|
||||
nca = new Nca(Keyset, storage, false);
|
||||
|
||||
|
@ -106,7 +106,7 @@ namespace LibHac
|
|||
try
|
||||
{
|
||||
IFile file = SaveFs.OpenFile(fileEntry.FullPath, OpenMode.Read);
|
||||
save = new SaveDataFileSystem(Keyset, new FileStorage(file), IntegrityCheckLevel.None, true);
|
||||
save = new SaveDataFileSystem(Keyset, file.AsStorage(), IntegrityCheckLevel.None, true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
@ -131,7 +131,7 @@ namespace LibHac
|
|||
var pfs0 = new PartitionFileSystem(sect);
|
||||
IFile file = pfs0.OpenFile(pfs0.Files[0], OpenMode.Read);
|
||||
|
||||
var metadata = new Cnmt(new FileStorage(file).AsStream());
|
||||
var metadata = new Cnmt(file.AsStream());
|
||||
title.Id = metadata.TitleId;
|
||||
title.Version = metadata.TitleVersion;
|
||||
title.Metadata = metadata;
|
||||
|
@ -168,7 +168,7 @@ namespace LibHac
|
|||
foreach (Title title in Titles.Values.Where(x => x.ControlNca != null))
|
||||
{
|
||||
var romfs = new RomFsFileSystem(title.ControlNca.OpenSection(0, false, IntegrityCheckLevel.ErrorOnInvalid, true));
|
||||
IStorage control = new FileStorage(romfs.OpenFile("control.nacp", OpenMode.Read));
|
||||
IFile control = romfs.OpenFile("control.nacp", OpenMode.Read);
|
||||
|
||||
title.Control = new Nacp(control.AsStream());
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@ namespace LibHac
|
|||
{
|
||||
IFile partitionFile = RootPartition.OpenFile(file, OpenMode.Read);
|
||||
|
||||
var partition = new XciPartition(new FileStorage(partitionFile))
|
||||
var partition = new XciPartition(partitionFile.AsStorage())
|
||||
{
|
||||
Name = file.Name,
|
||||
Offset = Header.PartitionFsHeaderAddress + RootPartition.HeaderSize + file.Offset,
|
||||
|
|
|
@ -15,9 +15,8 @@ namespace hactoolnet
|
|||
|
||||
public static void Process(Context ctx)
|
||||
{
|
||||
using (var deltaFile = new StreamStorage(new FileStream(ctx.Options.InFile, FileMode.Open, FileAccess.Read), false))
|
||||
using (IStorage deltaFile = new FileStream(ctx.Options.InFile, FileMode.Open, FileAccess.Read).AsStorage(false))
|
||||
{
|
||||
|
||||
IStorage deltaStorage = deltaFile;
|
||||
Span<byte> magic = stackalloc byte[4];
|
||||
deltaFile.Read(magic, 0);
|
||||
|
@ -34,7 +33,7 @@ namespace hactoolnet
|
|||
throw new FileNotFoundException("Specified NCA does not contain a delta fragment");
|
||||
}
|
||||
|
||||
deltaStorage = new FileStorage(fs.OpenFile(FragmentFileName, OpenMode.Read));
|
||||
deltaStorage = fs.OpenFile(FragmentFileName, OpenMode.Read).AsStorage();
|
||||
}
|
||||
catch (InvalidDataException) { } // Ignore non-NCA3 files
|
||||
}
|
||||
|
@ -43,7 +42,7 @@ namespace hactoolnet
|
|||
|
||||
if (ctx.Options.BaseFile != null)
|
||||
{
|
||||
using (var baseFile = new StreamStorage(new FileStream(ctx.Options.BaseFile, FileMode.Open, FileAccess.Read), false))
|
||||
using (IStorage baseFile = new FileStream(ctx.Options.BaseFile, FileMode.Open, FileAccess.Read).AsStorage(false))
|
||||
{
|
||||
delta.SetBaseStorage(baseFile);
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ namespace hactoolnet
|
|||
{
|
||||
public static void Process(Context ctx)
|
||||
{
|
||||
using (var file = new StreamStorage(new FileStream(ctx.Options.InFile, FileMode.Open, FileAccess.Read), false))
|
||||
using (IStorage file = new FileStream(ctx.Options.InFile, FileMode.Open, FileAccess.Read).AsStorage(false))
|
||||
{
|
||||
var nca = new Nca(ctx.Keyset, file, false);
|
||||
nca.ValidateMasterHashes();
|
||||
|
@ -19,7 +19,7 @@ namespace hactoolnet
|
|||
|
||||
if (ctx.Options.BaseNca != null)
|
||||
{
|
||||
var baseFile = new StreamStorage(new FileStream(ctx.Options.BaseNca, FileMode.Open, FileAccess.Read), false);
|
||||
IStorage baseFile = new FileStream(ctx.Options.BaseNca, FileMode.Open, FileAccess.Read).AsStorage(false);
|
||||
var baseNca = new Nca(ctx.Keyset, baseFile, false);
|
||||
nca.SetBaseNca(baseNca);
|
||||
}
|
||||
|
|
|
@ -99,7 +99,7 @@ namespace hactoolnet
|
|||
string destFilename = ctx.Options.ReplaceFileDest;
|
||||
if (!destFilename.StartsWith("/")) destFilename = '/' + destFilename;
|
||||
|
||||
using (IFile inFile = new StorageFile(new FileStream(ctx.Options.ReplaceFileSource, FileMode.Open, FileAccess.Read).AsStorage(false), OpenMode.ReadWrite))
|
||||
using (IFile inFile = new FileStream(ctx.Options.ReplaceFileSource, FileMode.Open, FileAccess.Read).AsIFile(OpenMode.ReadWrite))
|
||||
{
|
||||
using (IFile outFile = save.OpenFile(destFilename, OpenMode.ReadWrite))
|
||||
{
|
||||
|
|
|
@ -53,7 +53,7 @@ namespace hactoolnet
|
|||
|
||||
foreach (PartitionFileEntry sub in root.Files)
|
||||
{
|
||||
var subPfs = new PartitionFileSystem(new FileStorage(root.OpenFile(sub, OpenMode.Read)));
|
||||
var subPfs = new PartitionFileSystem(root.OpenFile(sub, OpenMode.Read).AsStorage());
|
||||
string subDir = Path.Combine(ctx.Options.OutDir, sub.Name);
|
||||
|
||||
subPfs.Extract(subDir, ctx.Logger);
|
||||
|
@ -133,7 +133,7 @@ namespace hactoolnet
|
|||
|
||||
foreach (PartitionFileEntry fileEntry in xci.SecurePartition.Files.Where(x => x.Name.EndsWith(".nca")))
|
||||
{
|
||||
IStorage ncaStorage = new FileStorage(xci.SecurePartition.OpenFile(fileEntry, OpenMode.Read));
|
||||
IStorage ncaStorage = xci.SecurePartition.OpenFile(fileEntry, OpenMode.Read).AsStorage();
|
||||
var nca = new Nca(ctx.Keyset, ncaStorage, true);
|
||||
|
||||
if (nca.Header.ContentType == ContentType.Program)
|
||||
|
|
Loading…
Reference in a new issue