Update to LibHac 0.13.1 (#2475)
* Update to LibHac 0.13.1 * Recreate directories for indexed saves if they're missing on emulator start
This commit is contained in:
parent
3977d1f72b
commit
dadc0e59da
32 changed files with 1869 additions and 584 deletions
124
Ryujinx.HLE/HOS/LibHacHorizonManager.cs
Normal file
124
Ryujinx.HLE/HOS/LibHacHorizonManager.cs
Normal file
|
@ -0,0 +1,124 @@
|
|||
using LibHac;
|
||||
using LibHac.Bcat;
|
||||
using LibHac.FsSrv.Impl;
|
||||
using LibHac.Loader;
|
||||
using LibHac.Ncm;
|
||||
using Ryujinx.HLE.FileSystem;
|
||||
using Ryujinx.HLE.HOS.Services.Arp;
|
||||
using System;
|
||||
using StorageId = LibHac.Ncm.StorageId;
|
||||
|
||||
namespace Ryujinx.HLE.HOS
|
||||
{
|
||||
public class LibHacHorizonManager
|
||||
{
|
||||
private LibHac.Horizon Server { get; set; }
|
||||
public HorizonClient RyujinxClient { get; private set; }
|
||||
|
||||
public HorizonClient ApplicationClient { get; private set; }
|
||||
|
||||
public HorizonClient AccountClient { get; private set; }
|
||||
public HorizonClient AmClient { get; private set; }
|
||||
public HorizonClient BcatClient { get; private set; }
|
||||
public HorizonClient FsClient { get; private set; }
|
||||
public HorizonClient NsClient { get; private set; }
|
||||
public HorizonClient SdbClient { get; private set; }
|
||||
|
||||
internal LibHacIReader ArpIReader { get; private set; }
|
||||
|
||||
public LibHacHorizonManager()
|
||||
{
|
||||
InitializeServer();
|
||||
}
|
||||
|
||||
private void InitializeServer()
|
||||
{
|
||||
Server = new LibHac.Horizon(new HorizonConfiguration());
|
||||
|
||||
RyujinxClient = Server.CreatePrivilegedHorizonClient();
|
||||
}
|
||||
|
||||
public void InitializeArpServer()
|
||||
{
|
||||
ArpIReader = new LibHacIReader();
|
||||
RyujinxClient.Sm.RegisterService(new LibHacArpServiceObject(ArpIReader), "arp:r").ThrowIfFailure();
|
||||
}
|
||||
|
||||
public void InitializeBcatServer()
|
||||
{
|
||||
BcatClient = Server.CreateHorizonClient(new ProgramLocation(SystemProgramId.Bcat, StorageId.BuiltInSystem),
|
||||
BcatFsPermissions);
|
||||
|
||||
_ = new BcatServer(BcatClient);
|
||||
}
|
||||
|
||||
public void InitializeFsServer(VirtualFileSystem virtualFileSystem)
|
||||
{
|
||||
virtualFileSystem.InitializeFsServer(Server, out var fsClient);
|
||||
|
||||
FsClient = fsClient;
|
||||
}
|
||||
|
||||
public void InitializeSystemClients()
|
||||
{
|
||||
AccountClient = Server.CreateHorizonClient(new ProgramLocation(SystemProgramId.Account, StorageId.BuiltInSystem),
|
||||
AccountFsPermissions);
|
||||
|
||||
AmClient = Server.CreateHorizonClient(new ProgramLocation(SystemProgramId.Am, StorageId.BuiltInSystem),
|
||||
AmFsPermissions);
|
||||
|
||||
NsClient = Server.CreateHorizonClient(new ProgramLocation(SystemProgramId.Ns, StorageId.BuiltInSystem),
|
||||
NsFsPermissions);
|
||||
|
||||
SdbClient = Server.CreateHorizonClient(new ProgramLocation(SystemProgramId.Sdb, StorageId.BuiltInSystem),
|
||||
SdbFacData, SdbFacDescriptor);
|
||||
}
|
||||
|
||||
public void InitializeApplicationClient(ProgramId programId, in Npdm npdm)
|
||||
{
|
||||
ApplicationClient = Server.CreateHorizonClient(new ProgramLocation(programId, StorageId.BuiltInUser),
|
||||
npdm.FsAccessControlData, npdm.FsAccessControlDescriptor);
|
||||
}
|
||||
|
||||
private static AccessControlBits.Bits AccountFsPermissions => AccessControlBits.Bits.SystemSaveData |
|
||||
AccessControlBits.Bits.GameCard |
|
||||
AccessControlBits.Bits.SaveDataMeta |
|
||||
AccessControlBits.Bits.GetRightsId;
|
||||
|
||||
private static AccessControlBits.Bits AmFsPermissions => AccessControlBits.Bits.SaveDataManagement |
|
||||
AccessControlBits.Bits.CreateSaveData |
|
||||
AccessControlBits.Bits.SystemData;
|
||||
private static AccessControlBits.Bits BcatFsPermissions => AccessControlBits.Bits.SystemSaveData;
|
||||
|
||||
private static AccessControlBits.Bits NsFsPermissions => AccessControlBits.Bits.ApplicationInfo |
|
||||
AccessControlBits.Bits.SystemSaveData |
|
||||
AccessControlBits.Bits.GameCard |
|
||||
AccessControlBits.Bits.SaveDataManagement |
|
||||
AccessControlBits.Bits.ContentManager |
|
||||
AccessControlBits.Bits.ImageManager |
|
||||
AccessControlBits.Bits.SystemSaveDataManagement |
|
||||
AccessControlBits.Bits.SystemUpdate |
|
||||
AccessControlBits.Bits.SdCard |
|
||||
AccessControlBits.Bits.FormatSdCard |
|
||||
AccessControlBits.Bits.GetRightsId |
|
||||
AccessControlBits.Bits.RegisterProgramIndexMapInfo |
|
||||
AccessControlBits.Bits.MoveCacheStorage;
|
||||
|
||||
// Sdb has save data access control info so we can't store just its access control bits
|
||||
private static ReadOnlySpan<byte> SdbFacData => new byte[]
|
||||
{
|
||||
0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
0x03, 0x03, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x09, 0x10, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x01
|
||||
};
|
||||
|
||||
private static ReadOnlySpan<byte> SdbFacDescriptor => new byte[]
|
||||
{
|
||||
0x01, 0x00, 0x02, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x01, 0x09, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
|
||||
};
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue