From e18e27fbc551631454534155bbb8e78b4c3b7ef9 Mon Sep 17 00:00:00 2001 From: GreemDev Date: Wed, 14 May 2025 21:35:20 -0500 Subject: [PATCH] Revert "infra: Update LibHac to v0.20.0." This seems to have broken some mods. This reverts commit 1d4928e859e15410fe9ffdbd2cdb13b59d048507. --- Directory.Packages.props | 2 +- .../FileSystem/EncryptedFileSystemCreator.cs | 5 ++-- src/Ryujinx.HLE/HOS/ModLoader.cs | 2 +- .../HOS/Services/Fs/IFileSystemProxy.cs | 25 +++++++++++-------- .../Ldn/UserServiceCreator/INetworkClient.cs | 2 +- .../IUserLocalCommunicationService.cs | 4 +-- .../UserServiceCreator/LdnDisabledClient.cs | 2 +- .../LdnMitm/LdnMitmClient.cs | 2 +- .../LdnRyu/LdnMasterProxyClient.cs | 4 +-- .../IParentalControlService.cs | 11 +------- .../QueryPlayStatisticsManager.cs | 5 +--- .../Extensions/FileSystemExtensions.cs | 8 +----- .../Loaders/Processes/ProcessLoader.cs | 18 +++++-------- .../Loaders/Processes/ProcessLoaderHelper.cs | 2 +- .../Loaders/Processes/ProcessResult.cs | 8 +----- .../Systems/AppLibrary/ApplicationData.cs | 2 +- .../Systems/AppLibrary/ApplicationLibrary.cs | 6 ++--- src/Ryujinx/Systems/AppLibrary/LdnGameData.cs | 7 +++--- 18 files changed, 44 insertions(+), 71 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index a44024c31..50004350a 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -40,7 +40,7 @@ - + diff --git a/src/Ryujinx.HLE/FileSystem/EncryptedFileSystemCreator.cs b/src/Ryujinx.HLE/FileSystem/EncryptedFileSystemCreator.cs index 7fa244997..64b02a282 100644 --- a/src/Ryujinx.HLE/FileSystem/EncryptedFileSystemCreator.cs +++ b/src/Ryujinx.HLE/FileSystem/EncryptedFileSystemCreator.cs @@ -3,14 +3,13 @@ using LibHac.Common; using LibHac.Fs; using LibHac.Fs.Fsa; using LibHac.FsSrv.FsCreator; -using System.Runtime.CompilerServices; namespace Ryujinx.HLE.FileSystem { public class EncryptedFileSystemCreator : IEncryptedFileSystemCreator { public Result Create(ref SharedRef outEncryptedFileSystem, - ref readonly SharedRef baseFileSystem, IEncryptedFileSystemCreator.KeyId idIndex, + ref SharedRef baseFileSystem, IEncryptedFileSystemCreator.KeyId idIndex, in EncryptionSeed encryptionSeed) { if (idIndex < IEncryptedFileSystemCreator.KeyId.Save || idIndex > IEncryptedFileSystemCreator.KeyId.CustomStorage) @@ -19,7 +18,7 @@ namespace Ryujinx.HLE.FileSystem } // TODO: Reenable when AesXtsFileSystem is fixed. - outEncryptedFileSystem = SharedRef.CreateMove(ref baseFileSystem.Ref); + outEncryptedFileSystem = SharedRef.CreateMove(ref baseFileSystem); return Result.Success; } diff --git a/src/Ryujinx.HLE/HOS/ModLoader.cs b/src/Ryujinx.HLE/HOS/ModLoader.cs index 6d6da6240..2e8798009 100644 --- a/src/Ryujinx.HLE/HOS/ModLoader.cs +++ b/src/Ryujinx.HLE/HOS/ModLoader.cs @@ -791,7 +791,7 @@ namespace Ryujinx.HLE.HOS { string buildId = p switch { - NsoExecutable nso => Convert.ToHexString(nso.BuildId).TrimEnd('0'), + NsoExecutable nso => Convert.ToHexString(nso.BuildId.ItemsRo.ToArray()).TrimEnd('0'), NroExecutable nro => Convert.ToHexString(nro.Header.BuildId).TrimEnd('0'), _ => string.Empty, }; diff --git a/src/Ryujinx.HLE/HOS/Services/Fs/IFileSystemProxy.cs b/src/Ryujinx.HLE/HOS/Services/Fs/IFileSystemProxy.cs index 638203466..d353ce64f 100644 --- a/src/Ryujinx.HLE/HOS/Services/Fs/IFileSystemProxy.cs +++ b/src/Ryujinx.HLE/HOS/Services/Fs/IFileSystemProxy.cs @@ -16,7 +16,6 @@ using Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy; using Ryujinx.Memory; using System; using System.IO; -using System.Text; using static Ryujinx.HLE.Utilities.StringUtils; using GameCardHandle = System.UInt32; using IFile = Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy.IFile; @@ -754,9 +753,17 @@ namespace Ryujinx.HLE.HOS.Services.Fs public ResultCode OpenCloudBackupWorkStorageFileSystem(ServiceCtx context) { CloudBackupWorkStorageId storageId = (CloudBackupWorkStorageId)context.RequestData.ReadInt32(); - - Logger.Stub?.PrintStub(LogClass.ServiceFs, new { storageId }); - throw new NotImplementedException(); // reimplementing behavior from LibHac 0.19.0 + using SharedRef fileSystem = new(); + + Result result = _baseFileSystemProxy.Get.OpenCloudBackupWorkStorageFileSystem(ref fileSystem.Ref, storageId); + if (result.IsFailure()) + { + return (ResultCode)result.Value; + } + + MakeObject(context, new FileSystemProxy.IFileSystem(ref fileSystem.Ref)); + + return ResultCode.Success; } [CommandCmif(130)] @@ -1021,7 +1028,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs { ref readonly FspPath path = ref FileSystemProxyHelper.GetFspPath(context); - Result result = _baseFileSystemProxy.Get.GetRightsIdAndKeyGenerationByPath(out RightsId rightsId, out byte _, in path, ContentAttributes.All); + Result result = _baseFileSystemProxy.Get.GetRightsIdByPath(out RightsId rightsId, in path); if (result.IsFailure()) { return (ResultCode)result.Value; @@ -1037,7 +1044,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs { ref readonly FspPath path = ref FileSystemProxyHelper.GetFspPath(context); - Result result = _baseFileSystemProxy.Get.GetRightsIdAndKeyGenerationByPath(out RightsId rightsId, out byte keyGeneration, in path, ContentAttributes.All); + Result result = _baseFileSystemProxy.Get.GetRightsIdAndKeyGenerationByPath(out RightsId rightsId, out byte keyGeneration, in path); if (result.IsFailure()) { return (ResultCode)result.Value; @@ -1233,10 +1240,8 @@ namespace Ryujinx.HLE.HOS.Services.Fs { BisPartitionId partitionId = (BisPartitionId)context.RequestData.ReadInt32(); ref readonly FspPath path = ref FileSystemProxyHelper.GetFspPath(context); - - Logger.Stub?.PrintStub(LogClass.ServiceFs, new { partitionId, path }); - - throw new NotImplementedException(); // reimplementing behavior from LibHac 0.19.0 + + return (ResultCode)_baseFileSystemProxy.Get.SetBisRootForHost(partitionId, in path).Value; } [CommandCmif(1001)] diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/INetworkClient.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/INetworkClient.cs index 4254ba887..028ab6cfc 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/INetworkClient.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/INetworkClient.cs @@ -17,7 +17,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator NetworkError ConnectPrivate(ConnectPrivateRequest request); ResultCode Reject(DisconnectReason disconnectReason, uint nodeId); NetworkInfo[] Scan(ushort channel, ScanFilter scanFilter); - void SetGameVersion(ReadOnlySpan versionString); + void SetGameVersion(byte[] versionString); void SetStationAcceptPolicy(AcceptPolicy acceptPolicy); void SetAdvertiseData(byte[] data); bool CreateNetwork(CreateAccessPointRequest request, byte[] advertiseData); diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/IUserLocalCommunicationService.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/IUserLocalCommunicationService.cs index ef898a611..9f7e6206b 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/IUserLocalCommunicationService.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/IUserLocalCommunicationService.cs @@ -62,7 +62,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator // TODO: Call nn::arp::GetApplicationControlProperty here when implemented. ApplicationControlProperty controlProperty = context.Device.Processes.ActiveApplication.ApplicationControlProperties; - foreach (ulong localCommunicationId in controlProperty.LocalCommunicationId) + foreach (ulong localCommunicationId in controlProperty.LocalCommunicationId.ItemsRo) { if (localCommunicationId == localCommunicationIdChecked) { @@ -1114,7 +1114,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator } // TODO: Call nn::arp::GetApplicationLaunchProperty here when implemented. - NetworkClient.SetGameVersion(context.Device.Processes.ActiveApplication.ApplicationControlProperties.DisplayVersion); + NetworkClient.SetGameVersion(context.Device.Processes.ActiveApplication.ApplicationControlProperties.DisplayVersion.Items.ToArray()); resultCode = ResultCode.Success; diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnDisabledClient.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnDisabledClient.cs index e7a874895..cb9f47359 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnDisabledClient.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnDisabledClient.cs @@ -61,7 +61,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator public void SetAdvertiseData(byte[] data) { } - public void SetGameVersion(ReadOnlySpan versionString) { } + public void SetGameVersion(byte[] versionString) { } public void SetStationAcceptPolicy(AcceptPolicy acceptPolicy) { } diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LdnMitmClient.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LdnMitmClient.cs index 12a15e491..35fc783c2 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LdnMitmClient.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LdnMitmClient.cs @@ -85,7 +85,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnMitm _lanDiscovery.SetAdvertiseData(data); } - public void SetGameVersion(ReadOnlySpan versionString) + public void SetGameVersion(byte[] versionString) { // NOTE: This method is not implemented in ldn_mitm Logger.Stub?.PrintMsg(LogClass.ServiceLdn, "LdnMitmClient SetGameVersion"); diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/LdnMasterProxyClient.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/LdnMasterProxyClient.cs index 91af49d14..c2bbcb471 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/LdnMasterProxyClient.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/LdnMasterProxyClient.cs @@ -346,9 +346,9 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu } } - public void SetGameVersion(ReadOnlySpan versionString) + public void SetGameVersion(byte[] versionString) { - _gameVersion = versionString.ToArray(); + _gameVersion = versionString; if (_gameVersion.Length < 0x10) { diff --git a/src/Ryujinx.HLE/HOS/Services/Pctl/ParentalControlServiceFactory/IParentalControlService.cs b/src/Ryujinx.HLE/HOS/Services/Pctl/ParentalControlServiceFactory/IParentalControlService.cs index 21a873393..9b026a1c3 100644 --- a/src/Ryujinx.HLE/HOS/Services/Pctl/ParentalControlServiceFactory/IParentalControlService.cs +++ b/src/Ryujinx.HLE/HOS/Services/Pctl/ParentalControlServiceFactory/IParentalControlService.cs @@ -55,16 +55,7 @@ namespace Ryujinx.HLE.HOS.Services.Pctl.ParentalControlServiceFactory _titleId = titleId; // TODO: Call nn::arp::GetApplicationControlProperty here when implemented, if it return ResultCode.Success we assign fields. - - int[] tempRatingAge = new int[32]; - - for (int i = 0; i < 32; i++) - { - tempRatingAge[i] = Convert.ToInt32(context.Device.Processes.ActiveApplication.ApplicationControlProperties.RatingAge[i]); - } - - Array.Copy(tempRatingAge, _ratingAge, tempRatingAge.Length); - + _ratingAge = Array.ConvertAll(context.Device.Processes.ActiveApplication.ApplicationControlProperties.RatingAge.ItemsRo.ToArray(), Convert.ToInt32); _parentalControlFlag = context.Device.Processes.ActiveApplication.ApplicationControlProperties.ParentalControlFlag; } } diff --git a/src/Ryujinx.HLE/HOS/Services/Sdb/Pdm/QueryService/QueryPlayStatisticsManager.cs b/src/Ryujinx.HLE/HOS/Services/Sdb/Pdm/QueryService/QueryPlayStatisticsManager.cs index a8fed55af..701cdd94e 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sdb/Pdm/QueryService/QueryPlayStatisticsManager.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sdb/Pdm/QueryService/QueryPlayStatisticsManager.cs @@ -45,10 +45,7 @@ namespace Ryujinx.HLE.HOS.Services.Sdb.Pdm.QueryService // Check if input title ids are in the whitelist. foreach (ulong titleId in titleIds) { - ReadOnlySpan temp = context.Device.Processes.ActiveApplication - .ApplicationControlProperties.PlayLogQueryableApplicationId; - - if (!temp.Contains(titleId)) + if (!context.Device.Processes.ActiveApplication.ApplicationControlProperties.PlayLogQueryableApplicationId.ItemsRo.Contains(titleId)) { return (ResultCode)Am.ResultCode.ObjectInvalid; } diff --git a/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs b/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs index 33448d893..dec52e2e3 100644 --- a/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs +++ b/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs @@ -91,13 +91,7 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions if (string.IsNullOrWhiteSpace(programName)) { - foreach (ApplicationControlProperty.ApplicationTitle nacpTitles in nacpData.Value.Title) - { - if (nacpTitles.Name[0] != 0) - continue; - - programName = nacpTitles.NameString.ToString(); - } + programName = Array.Find(nacpData.Value.Title.ItemsRo.ToArray(), x => x.Name[0] != 0).NameString.ToString(); } } diff --git a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs index 51165d590..3ff26196f 100644 --- a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs +++ b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs @@ -195,22 +195,16 @@ namespace Ryujinx.HLE.Loaders.Processes nacpStorage.Read(0, nacpData.ByteSpan); programName = nacpData.Value.Title[(int)_device.System.State.DesiredTitleLanguage].NameString.ToString(); - - if (string.IsNullOrWhiteSpace(programName)) - { - foreach (ApplicationControlProperty.ApplicationTitle nacpTitles in nacpData.Value.Title) - { - if (nacpTitles.Name[0] != 0) - continue; - - programName = nacpTitles.NameString.ToString(); - } - } if ("Switch Verification" == nacpData.Value.Title[(int)TitleLanguage.AmericanEnglish].NameString.ToString()) throw new InvalidOperationException(); - + + if (string.IsNullOrWhiteSpace(programName)) + { + programName = Array.Find(nacpData.Value.Title.ItemsRo.ToArray(), x => x.Name[0] != 0).NameString.ToString(); + } + if (nacpData.Value.PresenceGroupId != 0) { programId = nacpData.Value.PresenceGroupId; diff --git a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs index 5729052e8..cedd11ae9 100644 --- a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs +++ b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs @@ -258,7 +258,7 @@ namespace Ryujinx.HLE.Loaders.Processes { buildIds[i] = (executables[i] switch { - NsoExecutable nso => Convert.ToHexString(nso.BuildId), + NsoExecutable nso => Convert.ToHexString(nso.BuildId.ItemsRo.ToArray()), NroExecutable nro => Convert.ToHexString(nro.Header.BuildId), _ => string.Empty }).ToUpper(); diff --git a/src/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs b/src/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs index f34fdb8ad..6fd9408ed 100644 --- a/src/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs +++ b/src/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs @@ -59,13 +59,7 @@ namespace Ryujinx.HLE.Loaders.Processes if (string.IsNullOrWhiteSpace(Name)) { - foreach (ApplicationControlProperty.ApplicationTitle nacpTitles in ApplicationControlProperties.Title) - { - if (nacpTitles.Name[0] != 0) - continue; - - Name = nacpTitles.NameString.ToString(); - } + Name = Array.Find(ApplicationControlProperties.Title.ItemsRo.ToArray(), x => x.Name[0] != 0).NameString.ToString(); } DisplayVersion = ApplicationControlProperties.DisplayVersionString.ToString(); diff --git a/src/Ryujinx/Systems/AppLibrary/ApplicationData.cs b/src/Ryujinx/Systems/AppLibrary/ApplicationData.cs index 9e288e9a1..0819b86b8 100644 --- a/src/Ryujinx/Systems/AppLibrary/ApplicationData.cs +++ b/src/Ryujinx/Systems/AppLibrary/ApplicationData.cs @@ -221,7 +221,7 @@ namespace Ryujinx.Ava.Systems.AppLibrary NsoReader reader = new(); reader.Initialize(nsoFile.Release().AsStorage().AsFile(OpenMode.Read)).ThrowIfFailure(); - return Convert.ToHexString(reader.Header.ModuleId).Replace("-", string.Empty).ToUpper()[..16]; + return Convert.ToHexString(reader.Header.ModuleId.ItemsRo.ToArray()).Replace("-", string.Empty).ToUpper()[..16]; } } } diff --git a/src/Ryujinx/Systems/AppLibrary/ApplicationLibrary.cs b/src/Ryujinx/Systems/AppLibrary/ApplicationLibrary.cs index 618bc2b66..8d4b38a81 100644 --- a/src/Ryujinx/Systems/AppLibrary/ApplicationLibrary.cs +++ b/src/Ryujinx/Systems/AppLibrary/ApplicationLibrary.cs @@ -1367,7 +1367,7 @@ namespace Ryujinx.Ava.Systems.AppLibrary { _ = Enum.TryParse(DesiredLanguage.ToString(), out TitleLanguage desiredTitleLanguage); - if (controlData.Title.Length > (int)desiredTitleLanguage) + if (controlData.Title.ItemsRo.Length > (int)desiredTitleLanguage) { data.Name = controlData.Title[(int)desiredTitleLanguage].NameString.ToString(); data.Developer = controlData.Title[(int)desiredTitleLanguage].PublisherString.ToString(); @@ -1380,7 +1380,7 @@ namespace Ryujinx.Ava.Systems.AppLibrary if (string.IsNullOrWhiteSpace(data.Name)) { - foreach (ref readonly ApplicationControlProperty.ApplicationTitle controlTitle in controlData.Title) + foreach (ref readonly ApplicationControlProperty.ApplicationTitle controlTitle in controlData.Title.ItemsRo) { if (!controlTitle.NameString.IsEmpty()) { @@ -1393,7 +1393,7 @@ namespace Ryujinx.Ava.Systems.AppLibrary if (string.IsNullOrWhiteSpace(data.Developer)) { - foreach (ref readonly ApplicationControlProperty.ApplicationTitle controlTitle in controlData.Title) + foreach (ref readonly ApplicationControlProperty.ApplicationTitle controlTitle in controlData.Title.ItemsRo) { if (!controlTitle.PublisherString.IsEmpty()) { diff --git a/src/Ryujinx/Systems/AppLibrary/LdnGameData.cs b/src/Ryujinx/Systems/AppLibrary/LdnGameData.cs index dc27b4e5c..6750983d6 100644 --- a/src/Ryujinx/Systems/AppLibrary/LdnGameData.cs +++ b/src/Ryujinx/Systems/AppLibrary/LdnGameData.cs @@ -20,11 +20,10 @@ namespace Ryujinx.Ava.Systems.AppLibrary public static Array GetArrayForApp( LdnGameData[] receivedData, ref ApplicationControlProperty acp) { - ReadOnlySpan communicationId = acp.LocalCommunicationId; - ulong[] allowedTitleIds = communicationId.ToArray(); - + LibHac.Common.FixedArrays.Array8 communicationId = acp.LocalCommunicationId; + return new Array(receivedData.Where(game => - allowedTitleIds.Contains(game.TitleId.ToULong()) + communicationId.Items.Contains(game.TitleId.ToULong()) )); }