mirror of
https://github.com/Thealexbarney/LibHac.git
synced 2024-11-14 10:49:41 +01:00
Add IntegrityRomFsStorage
This commit is contained in:
parent
b5ae21207b
commit
f8b9c3557e
1 changed files with 109 additions and 0 deletions
109
src/LibHac/FsSystem/IntegrityRomFsStorage.cs
Normal file
109
src/LibHac/FsSystem/IntegrityRomFsStorage.cs
Normal file
|
@ -0,0 +1,109 @@
|
|||
using System;
|
||||
using System.Runtime.CompilerServices;
|
||||
using LibHac.Common;
|
||||
using LibHac.Diag;
|
||||
using LibHac.Fs;
|
||||
using LibHac.FsSrv;
|
||||
using LibHac.Os;
|
||||
using static LibHac.FsSystem.HierarchicalIntegrityVerificationStorage;
|
||||
|
||||
namespace LibHac.FsSystem;
|
||||
|
||||
/// <summary>
|
||||
/// An <see cref="IStorage"/> that handles initializing a <see cref="HierarchicalIntegrityVerificationStorage"/>
|
||||
/// from a RomFs.
|
||||
/// </summary>
|
||||
/// <remarks>Based on FS 14.1.0 (nnSdk 14.3.0)</remarks>
|
||||
public class IntegrityRomFsStorage : IStorage
|
||||
{
|
||||
private HierarchicalIntegrityVerificationStorage _integrityStorage;
|
||||
private FileSystemBufferManagerSet _bufferManagerSet;
|
||||
private SdkRecursiveMutex _mutex;
|
||||
private byte[] _masterHash;
|
||||
private UniqueRef<MemoryStorage> _masterHashStorage;
|
||||
|
||||
public IntegrityRomFsStorage(FileSystemServer fsServer)
|
||||
{
|
||||
_integrityStorage = new HierarchicalIntegrityVerificationStorage(fsServer);
|
||||
_mutex = new SdkRecursiveMutex();
|
||||
|
||||
_bufferManagerSet = new FileSystemBufferManagerSet();
|
||||
}
|
||||
|
||||
public override void Dispose()
|
||||
{
|
||||
FinalizeObject();
|
||||
|
||||
_masterHashStorage.Destroy();
|
||||
_integrityStorage.Dispose();
|
||||
|
||||
base.Dispose();
|
||||
}
|
||||
|
||||
public Result Initialize(ref HierarchicalIntegrityVerificationInformation info, Hash masterHash,
|
||||
ref HierarchicalStorageInformation storageInfo, IBufferManager bufferManager, int maxDataCacheEntries,
|
||||
int maxHashCacheEntries, sbyte bufferLevel, IHash256GeneratorFactory hashGeneratorFactory)
|
||||
{
|
||||
// Validate preconditions.
|
||||
Assert.SdkRequiresNotNull(bufferManager);
|
||||
|
||||
// Set master hash.
|
||||
_masterHash = SpanHelpers.AsReadOnlyByteSpan(in masterHash).ToArray();
|
||||
_masterHashStorage.Reset(new MemoryStorage(_masterHash));
|
||||
if (!_masterHashStorage.HasValue)
|
||||
return ResultFs.AllocationMemoryFailedInIntegrityRomFsStorageA.Log();
|
||||
|
||||
// Set the master hash storage.
|
||||
using var masterHashStorage = new ValueSubStorage(_masterHashStorage.Get, 0, Unsafe.SizeOf<Hash>());
|
||||
storageInfo[(int)HierarchicalStorageInformation.Storage.MasterStorage].Set(in masterHashStorage);
|
||||
|
||||
// Set buffers.
|
||||
for (int i = 0; i < _bufferManagerSet.Buffers.Length; i++)
|
||||
{
|
||||
_bufferManagerSet.Buffers[i] = bufferManager;
|
||||
}
|
||||
|
||||
// Initialize our integrity storage.
|
||||
Result rc = _integrityStorage.Initialize(in info, ref storageInfo, _bufferManagerSet, hashGeneratorFactory,
|
||||
false, _mutex, maxDataCacheEntries, maxHashCacheEntries, bufferLevel, false, false);
|
||||
if (rc.IsFailure()) return rc.Miss();
|
||||
|
||||
return Result.Success;
|
||||
}
|
||||
|
||||
public void FinalizeObject()
|
||||
{
|
||||
_integrityStorage.FinalizeObject();
|
||||
}
|
||||
|
||||
public override Result Read(long offset, Span<byte> destination)
|
||||
{
|
||||
return _integrityStorage.Read(offset, destination);
|
||||
}
|
||||
|
||||
public override Result Write(long offset, ReadOnlySpan<byte> source)
|
||||
{
|
||||
return _integrityStorage.Write(offset, source);
|
||||
}
|
||||
|
||||
public override Result Flush()
|
||||
{
|
||||
return _integrityStorage.Flush();
|
||||
}
|
||||
|
||||
public override Result SetSize(long size)
|
||||
{
|
||||
return ResultFs.UnsupportedSetSizeForIntegrityRomFsStorage.Log();
|
||||
}
|
||||
|
||||
public override Result GetSize(out long size)
|
||||
{
|
||||
return _integrityStorage.GetSize(out size);
|
||||
}
|
||||
|
||||
public override Result OperateRange(Span<byte> outBuffer, OperationId operationId, long offset, long size,
|
||||
ReadOnlySpan<byte> inBuffer)
|
||||
{
|
||||
return _integrityStorage.OperateRange(outBuffer, operationId, offset, size, inBuffer);
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue