mirror of
https://github.com/Thealexbarney/LibHac.git
synced 2024-11-14 10:49:41 +01:00
Add interfaces for the nn::gc APIs
This commit is contained in:
parent
fab5efc4de
commit
94221ef073
9 changed files with 81 additions and 24 deletions
|
@ -25,10 +25,9 @@ public class EmulatedStorageDeviceManagerFactory : IStorageDeviceManagerFactory
|
|||
|
||||
private readonly FileSystemServer _fsServer;
|
||||
private readonly SdmmcApi _sdmmc;
|
||||
private readonly GameCardEmulated _gc;
|
||||
private readonly IGcApi _gc;
|
||||
|
||||
public EmulatedStorageDeviceManagerFactory(FileSystemServer fsServer, SdmmcApi sdmmc, GameCardEmulated gc,
|
||||
bool hasGameCard)
|
||||
public EmulatedStorageDeviceManagerFactory(FileSystemServer fsServer, SdmmcApi sdmmc, IGcApi gc, bool hasGameCard)
|
||||
{
|
||||
_fsServer = fsServer;
|
||||
_sdmmc = sdmmc;
|
||||
|
|
|
@ -10,7 +10,7 @@ using static LibHac.Gc.Values;
|
|||
|
||||
namespace LibHac.Gc;
|
||||
|
||||
public class GameCardEmulated
|
||||
public sealed class GameCardEmulated : IGcApi
|
||||
{
|
||||
private static ReadOnlySpan<byte> CardHeaderKey => new byte[]
|
||||
{ 0x01, 0xC5, 0x8F, 0xE7, 0x00, 0x2D, 0x13, 0x5A, 0xB2, 0x9A, 0x3F, 0x69, 0x33, 0x95, 0x74, 0xB1 };
|
||||
|
@ -29,6 +29,7 @@ public class GameCardEmulated
|
|||
private Array32<byte> _imageHash;
|
||||
|
||||
public GameCardWriter Writer => new GameCardWriter(this);
|
||||
IGcWriterApi IGcApi.Writer => Writer;
|
||||
|
||||
private Result CheckCardReady()
|
||||
{
|
||||
|
@ -126,7 +127,7 @@ public class GameCardEmulated
|
|||
return _cardStorage.Get.Read(baseStorageOffset, destination).Ret();
|
||||
}
|
||||
|
||||
public readonly struct GameCardWriter
|
||||
public readonly struct GameCardWriter : IGcWriterApi
|
||||
{
|
||||
private readonly GameCardEmulated _card;
|
||||
|
||||
|
|
38
src/LibHac/Gc/IGcApi.cs
Normal file
38
src/LibHac/Gc/IGcApi.cs
Normal file
|
@ -0,0 +1,38 @@
|
|||
using System;
|
||||
using LibHac.Common;
|
||||
using LibHac.Fs;
|
||||
using LibHac.Gc.Writer;
|
||||
|
||||
namespace LibHac.Gc;
|
||||
|
||||
public interface IGcApi
|
||||
{
|
||||
IGcWriterApi Writer { get; }
|
||||
void InsertGameCard(in SharedRef<IStorage> storage);
|
||||
void RemoveGameCard();
|
||||
void PresetInternalKeys(ReadOnlySpan<byte> gameCardKey, ReadOnlySpan<byte> gameCardCertificate);
|
||||
void Initialize(Memory<byte> workBuffer, ulong deviceBufferAddress);
|
||||
void FinalizeGc();
|
||||
void PowerOffGameCard();
|
||||
void RegisterDeviceVirtualAddress(Memory<byte> buffer, ulong deviceBufferAddress);
|
||||
void UnregisterDeviceVirtualAddress(Memory<byte> buffer, ulong deviceBufferAddress);
|
||||
Result GetInitializationResult();
|
||||
Result Activate();
|
||||
void Deactivate();
|
||||
Result SetCardToSecureMode();
|
||||
Result Read(Span<byte> destination, uint pageAddress, uint pageCount);
|
||||
void PutToSleep();
|
||||
void Awaken();
|
||||
bool IsCardInserted();
|
||||
bool IsCardActivationValid();
|
||||
Result GetCardStatus(out GameCardStatus outStatus);
|
||||
Result GetCardDeviceId(Span<byte> destBuffer);
|
||||
Result GetCardDeviceCertificate(Span<byte> destBuffer);
|
||||
Result ChallengeCardExistence(Span<byte> responseBuffer, ReadOnlySpan<byte> challengeSeedBuffer, ReadOnlySpan<byte> challengeValueBuffer);
|
||||
Result GetCardImageHash(Span<byte> destBuffer);
|
||||
Result GetGameCardIdSet(out GameCardIdSet outGcIdSet);
|
||||
void RegisterDetectionEventCallback(Action<object> function, object args);
|
||||
void UnregisterDetectionEventCallback();
|
||||
Result GetCardHeader(Span<byte> destBuffer);
|
||||
Result GetErrorInfo(out GameCardErrorReportInfo outErrorReportInfo);
|
||||
}
|
19
src/LibHac/Gc/Writer/IGcWriterApi.cs
Normal file
19
src/LibHac/Gc/Writer/IGcWriterApi.cs
Normal file
|
@ -0,0 +1,19 @@
|
|||
using System;
|
||||
using LibHac.Gc.Impl;
|
||||
|
||||
namespace LibHac.Gc.Writer;
|
||||
|
||||
public interface IGcWriterApi
|
||||
{
|
||||
void ChangeMode(AsicMode mode);
|
||||
Result ActivateForWriter();
|
||||
Result EraseAndWriteParameter(MemorySize size, uint romAreaStartPageIndex);
|
||||
Result Write(ReadOnlySpan<byte> source, uint pageIndex, uint pageCount);
|
||||
Result GetCardAvailableRawSize(out long outSize);
|
||||
void SetVerifyEnableFlag(bool isEnabled);
|
||||
void SetUserAsicFirmwareBuffer(ReadOnlySpan<byte> firmwareBuffer);
|
||||
Result GetRmaInformation(out RmaInformation outRmaInformation);
|
||||
Result WriteDevCardParam(in DevCardParameter devCardParam);
|
||||
Result ReadDevCardParam(out DevCardParameter outDevCardParam);
|
||||
Result ForceErase();
|
||||
}
|
|
@ -9,9 +9,9 @@ namespace LibHac.GcSrv;
|
|||
/// <remarks>Based on nnSdk 14.3.0 (FS 14.1.0)</remarks>
|
||||
internal class GameCardDetectionEventManager : CardDeviceDetectionEventManager
|
||||
{
|
||||
private GameCardEmulated _gc;
|
||||
private IGcApi _gc;
|
||||
|
||||
public GameCardDetectionEventManager(GameCardEmulated gc)
|
||||
public GameCardDetectionEventManager(IGcApi gc)
|
||||
{
|
||||
_gc = gc;
|
||||
|
||||
|
|
|
@ -15,14 +15,14 @@ internal class GameCardDeviceOperator : IStorageDeviceOperator
|
|||
private SharedRef<GameCardStorageDevice> _storageDevice;
|
||||
|
||||
// LibHac additions
|
||||
private readonly GameCardEmulated _gc;
|
||||
private readonly IGcApi _gc;
|
||||
|
||||
public static uint BytesToPages(long byteCount)
|
||||
{
|
||||
return (uint)((ulong)byteCount / GcPageSize);
|
||||
}
|
||||
|
||||
public GameCardDeviceOperator(ref SharedRef<GameCardStorageDevice> storageDevice, GameCardEmulated gc)
|
||||
public GameCardDeviceOperator(ref SharedRef<GameCardStorageDevice> storageDevice, IGcApi gc)
|
||||
{
|
||||
_storageDevice = SharedRef<GameCardStorageDevice>.CreateMove(ref storageDevice);
|
||||
_gc = gc;
|
||||
|
|
|
@ -39,9 +39,9 @@ public class GameCardManager : IStorageDeviceManager, IStorageDeviceOperator, IG
|
|||
// LibHac additions
|
||||
private WeakRef<GameCardManager> _selfReference;
|
||||
private readonly FileSystemServer _fsServer;
|
||||
private readonly GameCardEmulated _gc;
|
||||
private readonly IGcApi _gc;
|
||||
|
||||
private GameCardManager(GameCardEmulated gc, FileSystemServer fsServer)
|
||||
private GameCardManager(IGcApi gc, FileSystemServer fsServer)
|
||||
{
|
||||
_rwLock = new ReaderWriterLock(fsServer.Hos.Os);
|
||||
|
||||
|
@ -49,7 +49,7 @@ public class GameCardManager : IStorageDeviceManager, IStorageDeviceOperator, IG
|
|||
_gc = gc;
|
||||
}
|
||||
|
||||
public static SharedRef<GameCardManager> CreateShared(GameCardEmulated gc, FileSystemServer fsServer)
|
||||
public static SharedRef<GameCardManager> CreateShared(IGcApi gc, FileSystemServer fsServer)
|
||||
{
|
||||
var manager = new GameCardManager(gc, fsServer);
|
||||
|
||||
|
|
|
@ -20,9 +20,9 @@ internal class ReadOnlyGameCardStorage : IStorage
|
|||
private SharedRef<IGameCardManager> _deviceManager;
|
||||
|
||||
// LibHac additions
|
||||
private readonly GameCardEmulated _gc;
|
||||
private readonly IGcApi _gc;
|
||||
|
||||
public ReadOnlyGameCardStorage(ref SharedRef<IGameCardManager> deviceManger, GameCardEmulated gc)
|
||||
public ReadOnlyGameCardStorage(ref SharedRef<IGameCardManager> deviceManger, IGcApi gc)
|
||||
{
|
||||
_deviceManager = SharedRef<IGameCardManager>.CreateMove(ref deviceManger);
|
||||
_gc = gc;
|
||||
|
@ -103,9 +103,9 @@ internal class WriteOnlyGameCardStorage : IStorage
|
|||
private SharedRef<IGameCardManager> _deviceManager;
|
||||
|
||||
// LibHac additions
|
||||
private readonly GameCardEmulated _gc;
|
||||
private readonly IGcApi _gc;
|
||||
|
||||
public WriteOnlyGameCardStorage(ref SharedRef<IGameCardManager> deviceManger, GameCardEmulated gc)
|
||||
public WriteOnlyGameCardStorage(ref SharedRef<IGameCardManager> deviceManger, IGcApi gc)
|
||||
{
|
||||
_deviceManager = SharedRef<IGameCardManager>.CreateMove(ref deviceManger);
|
||||
_gc = gc;
|
||||
|
|
|
@ -20,9 +20,9 @@ internal class GameCardStorageDevice : GameCardStorageInterfaceAdapter, IStorage
|
|||
|
||||
// LibHac additions
|
||||
private WeakRef<GameCardStorageDevice> _selfReference;
|
||||
private readonly GameCardEmulated _gc;
|
||||
private readonly IGcApi _gc;
|
||||
|
||||
private GameCardStorageDevice(GameCardEmulated gc, ref SharedRef<IGameCardManager> manager,
|
||||
private GameCardStorageDevice(IGcApi gc, ref SharedRef<IGameCardManager> manager,
|
||||
in SharedRef<IStorage> baseStorage, GameCardHandle handle) : base(in baseStorage)
|
||||
{
|
||||
_manager = SharedRef<IGameCardManager>.CreateMove(ref manager);
|
||||
|
@ -32,7 +32,7 @@ internal class GameCardStorageDevice : GameCardStorageInterfaceAdapter, IStorage
|
|||
_gc = gc;
|
||||
}
|
||||
|
||||
private GameCardStorageDevice(GameCardEmulated gc, ref SharedRef<IGameCardManager> manager,
|
||||
private GameCardStorageDevice(IGcApi gc, ref SharedRef<IGameCardManager> manager,
|
||||
in SharedRef<IStorage> baseStorage, GameCardHandle handle, bool isSecure, ReadOnlySpan<byte> cardDeviceId,
|
||||
ReadOnlySpan<byte> cardImageHash)
|
||||
: base(in baseStorage)
|
||||
|
@ -50,8 +50,8 @@ internal class GameCardStorageDevice : GameCardStorageInterfaceAdapter, IStorage
|
|||
_gc = gc;
|
||||
}
|
||||
|
||||
public static SharedRef<GameCardStorageDevice> CreateShared(GameCardEmulated gc,
|
||||
ref SharedRef<IGameCardManager> manager, in SharedRef<IStorage> baseStorage, GameCardHandle handle)
|
||||
public static SharedRef<GameCardStorageDevice> CreateShared(IGcApi gc, ref SharedRef<IGameCardManager> manager,
|
||||
in SharedRef<IStorage> baseStorage, GameCardHandle handle)
|
||||
{
|
||||
var storageDevice = new GameCardStorageDevice(gc, ref manager, in baseStorage, handle);
|
||||
|
||||
|
@ -61,9 +61,9 @@ internal class GameCardStorageDevice : GameCardStorageInterfaceAdapter, IStorage
|
|||
return SharedRef<GameCardStorageDevice>.CreateMove(ref sharedStorageDevice.Ref);
|
||||
}
|
||||
|
||||
public static SharedRef<GameCardStorageDevice> CreateShared(GameCardEmulated gc,
|
||||
ref SharedRef<IGameCardManager> manager, in SharedRef<IStorage> baseStorage, GameCardHandle handle,
|
||||
bool isSecure, ReadOnlySpan<byte> cardDeviceId, ReadOnlySpan<byte> cardImageHash)
|
||||
public static SharedRef<GameCardStorageDevice> CreateShared(IGcApi gc, ref SharedRef<IGameCardManager> manager,
|
||||
in SharedRef<IStorage> baseStorage, GameCardHandle handle, bool isSecure, ReadOnlySpan<byte> cardDeviceId,
|
||||
ReadOnlySpan<byte> cardImageHash)
|
||||
{
|
||||
var storageDevice = new GameCardStorageDevice(gc, ref manager, in baseStorage, handle, isSecure, cardDeviceId,
|
||||
cardImageHash);
|
||||
|
|
Loading…
Reference in a new issue