From 5345d2747e0412c1f11b142650b3ac863fdab951 Mon Sep 17 00:00:00 2001 From: Alex Barney Date: Mon, 24 Feb 2020 14:45:51 -0700 Subject: [PATCH 1/6] Generate Results from a .csv file --- build/Build.cs | 9 +- build/CodeGen/IndentingStringBuilder.cs | 74 ++++++ build/CodeGen/ResultCodegen.cs | 300 ++++++++++++++++++++++++ build/CodeGen/result_modules.csv | 4 + build/CodeGen/result_paths.csv | 4 + build/CodeGen/results.csv | 199 ++++++++++++++++ build/_build.csproj | 2 + src/LibHac/Fs/ResultFs.cs | 37 +-- 8 files changed, 592 insertions(+), 37 deletions(-) create mode 100644 build/CodeGen/IndentingStringBuilder.cs create mode 100644 build/CodeGen/ResultCodegen.cs create mode 100644 build/CodeGen/result_modules.csv create mode 100644 build/CodeGen/result_paths.csv create mode 100644 build/CodeGen/results.csv diff --git a/build/Build.cs b/build/Build.cs index 0b1d0012..83379fbc 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -8,6 +8,7 @@ using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; using ICSharpCode.SharpZipLib.Zip; +using LibHacBuild.CodeGen; using Nuke.Common; using Nuke.Common.CI.AppVeyor; using Nuke.Common.Git; @@ -181,8 +182,14 @@ namespace LibHacBuild DotNetRestore(s => settings); }); + Target Codegen => _ => _ + .Executes(() => + { + ResultCodeGen.Run(); + }); + Target Compile => _ => _ - .DependsOn(Restore, SetVersion) + .DependsOn(Restore, SetVersion, Codegen) .Executes(() => { DotNetBuildSettings buildSettings = new DotNetBuildSettings() diff --git a/build/CodeGen/IndentingStringBuilder.cs b/build/CodeGen/IndentingStringBuilder.cs new file mode 100644 index 00000000..31b601d4 --- /dev/null +++ b/build/CodeGen/IndentingStringBuilder.cs @@ -0,0 +1,74 @@ +using System; +using System.Text; + +namespace LibHacBuild.CodeGen +{ + public class IndentingStringBuilder + { + public int LevelSize { get; set; } = 4; + public int Level { get; private set; } + + private StringBuilder _sb = new StringBuilder(); + private string _indentation = string.Empty; + private bool _hasIndentedCurrentLine; + + public IndentingStringBuilder() { } + public IndentingStringBuilder(int levelSize) => LevelSize = levelSize; + + public void SetLevel(int level) + { + Level = Math.Max(level, 0); + _indentation = new string(' ', Level * LevelSize); + } + + public void IncreaseLevel() => SetLevel(Level + 1); + public void DecreaseLevel() => SetLevel(Level - 1); + + public IndentingStringBuilder AppendLine() + { + _sb.AppendLine(); + _hasIndentedCurrentLine = false; + return this; + } + + public IndentingStringBuilder AppendLine(string value) + { + IndentIfNeeded(); + _sb.AppendLine(value); + _hasIndentedCurrentLine = false; + return this; + } + + public IndentingStringBuilder Append(string value) + { + IndentIfNeeded(); + _sb.Append(value); + return this; + } + + public IndentingStringBuilder AppendLineAndIncrease(string value) + { + AppendLine(value); + IncreaseLevel(); + return this; + } + + public IndentingStringBuilder DecreaseAndAppendLine(string value) + { + DecreaseLevel(); + AppendLine(value); + return this; + } + + private void IndentIfNeeded() + { + if (!_hasIndentedCurrentLine) + { + _sb.Append(_indentation); + _hasIndentedCurrentLine = true; + } + } + + public override string ToString() => _sb.ToString(); + } +} diff --git a/build/CodeGen/ResultCodegen.cs b/build/CodeGen/ResultCodegen.cs new file mode 100644 index 00000000..df4f7af9 --- /dev/null +++ b/build/CodeGen/ResultCodegen.cs @@ -0,0 +1,300 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using CsvHelper; +using Nuke.Common; + +namespace LibHacBuild.CodeGen +{ + public static class ResultCodeGen + { + // RyuJIT will always be inlined a function if its CIL size is <= 0x10 bytes + private const int InlineThreshold = 0x10; + + public static void Run() + { + ModuleInfo[] modules = ReadResults(); + + SetEmptyResultNames(modules); + CheckIfAggressiveInliningNeeded(modules); + SetOutputPaths(modules); + + foreach (ModuleInfo module in modules) + { + string moduleResultFile = PrintModule(module); + + WriteOutput(module, moduleResultFile); + } + } + + private static ModuleInfo[] ReadResults() + { + ModuleIndex[] moduleNames = ReadCsv("result_modules.csv"); + ModulePath[] modulePaths = ReadCsv("result_paths.csv"); + ResultInfo[] results = ReadCsv("results.csv"); + + var modules = new Dictionary(); + + foreach (ModuleIndex name in moduleNames) + { + var module = new ModuleInfo(); + module.Name = name.Name; + module.Index = name.Index; + + modules.Add(name.Name, module); + } + + foreach (ModulePath path in modulePaths) + { + ModuleInfo module = modules[path.Name]; + module.Namespace = path.Namespace; + module.Path = path.Path; + } + + foreach (ModuleInfo module in modules.Values) + { + module.Results = results.Where(x => x.Module == module.Index).OrderBy(x => x.DescriptionStart) + .ToArray(); + } + + return modules.Values.ToArray(); + } + + private static void SetEmptyResultNames(ModuleInfo[] modules) + { + foreach (ModuleInfo module in modules) + { + foreach (ResultInfo result in module.Results.Where(x => string.IsNullOrWhiteSpace(x.Name))) + { + if (result.DescriptionEnd.HasValue) + { + result.Name += $"Range{result.DescriptionStart}To{result.DescriptionEnd}"; + } + else + { + result.Name = $"Result{result.DescriptionStart}"; + } + } + } + } + + private static void CheckIfAggressiveInliningNeeded(ModuleInfo[] modules) + { + foreach (ModuleInfo module in modules) + { + module.NeedsAggressiveInlining = module.Results.Any(x => EstimateCilSize(x) > InlineThreshold); + } + } + + private static void SetOutputPaths(ModuleInfo[] modules) + { + string rootPath = FindProjectDirectory(); + + foreach (ModuleInfo module in modules.Where(x => !string.IsNullOrWhiteSpace(x.Path))) + { + module.FullPath = Path.Combine(rootPath, module.Path); + } + } + + private static string PrintModule(ModuleInfo module) + { + var sb = new IndentingStringBuilder(); + + if (module.NeedsAggressiveInlining) + { + sb.AppendLine("using System.Runtime.CompilerServices;"); + sb.AppendLine(); + } + + sb.AppendLine($"namespace {module.Namespace}"); + sb.AppendLineAndIncrease("{"); + + sb.AppendLine($"public static class Result{module.Name}"); + sb.AppendLineAndIncrease("{"); + + sb.AppendLine($"public const int Module{module.Name} = {module.Index};"); + sb.AppendLine(); + + foreach (ResultInfo result in module.Results) + { + PrintResult(sb, module.Name, result); + } + + sb.DecreaseAndAppendLine("}"); + sb.DecreaseAndAppendLine("}"); + + return sb.ToString(); + } + + private static void PrintResult(IndentingStringBuilder sb, string moduleName, ResultInfo result) + { + string descriptionArgs; + + if (result.DescriptionEnd.HasValue) + { + descriptionArgs = $"{result.DescriptionStart}, {result.DescriptionEnd}"; + } + else + { + descriptionArgs = $"{result.DescriptionStart}"; + } + + // sb.AppendLine($"/// Error code: {result.ErrorCode}; Inner value: 0x{result.InnerValue:x}"); + + string resultCtor = $"new Result.Base(Module{moduleName}, {descriptionArgs});"; + sb.Append($"public static Result.Base {result.Name} "); + + if (EstimateCilSize(result) > InlineThreshold) + { + sb.AppendLine($"{{ [MethodImpl(MethodImplOptions.AggressiveInlining)] get => {resultCtor} }}"); + } + else + { + sb.AppendLine($"=> {resultCtor}"); + } + } + + // Write the file only if it has changed + // Preserve the UTF-8 BOM usage if the file already exists + private static void WriteOutput(ModuleInfo module, string text) + { + if (string.IsNullOrWhiteSpace(module.FullPath)) + return; + + // Default is true because Visual Studio saves .cs files with the BOM by default + bool hasBom = true; + byte[] bom = Encoding.UTF8.GetPreamble(); + byte[] oldFile = null; + + if (File.Exists(module.FullPath)) + { + oldFile = File.ReadAllBytes(module.FullPath); + + if (oldFile.Length >= 3) + hasBom = oldFile.AsSpan(0, 3).SequenceEqual(bom); + } + + byte[] newFile = (hasBom ? bom : new byte[0]).Concat(Encoding.UTF8.GetBytes(text)).ToArray(); + + if (oldFile?.SequenceEqual(newFile) == true) + { + Logger.Normal($"{module.Path} is already up-to-date"); + return; + } + + Logger.Normal($"Generated file {module.Path}"); + File.WriteAllBytes(module.FullPath, newFile); + } + + private static T[] ReadCsv(string name) + { + using (var csv = new CsvReader(new StreamReader(GetResource(name)), CultureInfo.InvariantCulture)) + { + csv.Configuration.AllowComments = true; + + return csv.GetRecords().ToArray(); + } + } + + private static Stream GetResource(string name) + { + var assembly = Assembly.GetExecutingAssembly(); + string path = $"LibHacBuild.CodeGen.{name}"; + + Stream stream = assembly.GetManifestResourceStream(path); + if (stream == null) throw new FileNotFoundException($"Resource {path} was not found."); + + return stream; + } + + private static string FindProjectDirectory() + { + string currentDir = Environment.CurrentDirectory; + + while (currentDir != null) + { + if (File.Exists(Path.Combine(currentDir, "LibHac.sln"))) + { + break; + } + + currentDir = Path.GetDirectoryName(currentDir); + } + + if (currentDir == null) + throw new DirectoryNotFoundException("Unable to find project directory."); + + return Path.Combine(currentDir, "src"); + } + + private static int EstimateCilSize(ResultInfo result) + { + int size = 0; + + size += GetLoadSize(result.Module); + size += GetLoadSize(result.DescriptionStart); + + if (result.DescriptionEnd.HasValue) + size += GetLoadSize(result.DescriptionEnd.Value); + + size += 5; // newobj + size += 1; // ret + + return size; + + static int GetLoadSize(int value) + { + if (value >= -1 && value <= 8) + return 1; // ldc.i4.X + + if (value >= sbyte.MinValue && value <= sbyte.MaxValue) + return 2; // ldc.i4.s XX + + return 5; // ldc.i4 XXXXXXXX + } + } + } + + public class ModuleIndex + { + public string Name { get; set; } + public int Index { get; set; } + } + + public class ModulePath + { + public string Name { get; set; } + public string Namespace { get; set; } + public string Path { get; set; } + } + + [DebuggerDisplay("{" + nameof(Name) + ",nq}")] + public class ModuleInfo + { + public string Name { get; set; } + public int Index { get; set; } + public string Namespace { get; set; } + public string Path { get; set; } + + public string FullPath { get; set; } + public bool NeedsAggressiveInlining { get; set; } + public ResultInfo[] Results { get; set; } + } + + [DebuggerDisplay("{" + nameof(Name) + ",nq}")] + public class ResultInfo + { + public int Module { get; set; } + public int DescriptionStart { get; set; } + public int? DescriptionEnd { get; set; } + public string Name { get; set; } + + public string ErrorCode => $"{2000 + Module:d4}-{DescriptionStart:d4}"; + public int InnerValue => Module & 0x1ff | ((DescriptionStart & 0x7ffff) << 9); + } +} diff --git a/build/CodeGen/result_modules.csv b/build/CodeGen/result_modules.csv new file mode 100644 index 00000000..ffd4d6e4 --- /dev/null +++ b/build/CodeGen/result_modules.csv @@ -0,0 +1,4 @@ +Name,Index +Fs,2 +Kvdb,20 +Sdmmc,24 \ No newline at end of file diff --git a/build/CodeGen/result_paths.csv b/build/CodeGen/result_paths.csv new file mode 100644 index 00000000..cca028c2 --- /dev/null +++ b/build/CodeGen/result_paths.csv @@ -0,0 +1,4 @@ +Name,Namespace,Path +Fs,LibHac.Fs,LibHac/Fs/ResultFs.cs +Kvdb,LibHac.Kvdb,LibHac/Kvdb/ResultKvdb.cs +Sdmmc,LibHac.FsService,LibHac/FsService/ResultSdmmc.cs \ No newline at end of file diff --git a/build/CodeGen/results.csv b/build/CodeGen/results.csv new file mode 100644 index 00000000..86b52cd1 --- /dev/null +++ b/build/CodeGen/results.csv @@ -0,0 +1,199 @@ +Module,DescriptionStart,DescriptionEnd,Name +2,1,,PathNotFound +2,2,,PathAlreadyExists +2,7,,TargetLocked +2,8,,DirectoryNotEmpty + +2,30,45,InsufficientFreeSpace +2,34,38,InsufficientFreeSpaceBis +2,35,,InsufficientFreeSpaceBisCalibration +2,36,,InsufficientFreeSpaceBisSafe +2,37,,InsufficientFreeSpaceBisUser +2,38,,InsufficientFreeSpaceBisSystem +2,39,,InsufficientFreeSpaceSdCard +2,60,,MountNameAlreadyExists + +2,1001,,PartitionNotFound +2,1002,,TargetNotFound +2,1004,,ExternalKeyNotFound + +2,2000,2499,SdCardAccessFailed +2,2001,,SdCardNotFound +2,2004,,SdCardAsleep + +2,2500,2999,GameCardAccessFailed +2,2503,,InvalidBufferForGameCard +2,2520,,GameCardNotInserted +2,2951,,GameCardNotInsertedOnGetHandle +2,2952,,InvalidGameCardHandleOnRead +2,2954,,InvalidGameCardHandleOnGetCardInfo +2,2960,,InvalidGameCardHandleOnOpenNormalPartition +2,2961,,InvalidGameCardHandleOnOpenSecurePartition + +2,3001,,NotImplemented +2,3002,, +2,3003,,SaveDataPathAlreadyExists +2,3005,,OutOfRange + +2,3200,3499,AllocationMemoryFailed +2,3312,,AesXtsFileFileStorageAllocationError +2,3313,,AesXtsFileXtsStorageAllocationError +2,3314,,AesXtsFileAlignmentStorageAllocationError +2,3315,,AesXtsFileStorageFileAllocationError +2,3383,,AesXtsFileSubStorageAllocationError + +2,3500,3999,MmcAccessFailed + +2,4000,4999,DataCorrupted +2,4001,4299,RomCorrupted +2,4023,,InvalidIndirectStorageSource + +2,4301,4499,SaveDataCorrupted +2,4302,, +2,4303,,InvalidSaveDataEntryType +2,4315,,InvalidSaveDataHeader +2,4362,, +2,4363,, +2,4364,,InvalidHashInSaveIvfc +2,4372,,SaveIvfcHashIsEmpty +2,4373,,InvalidHashInSaveIvfcTopLayer + +2,4402,, +2,4427,, +2,4462,,SaveDataAllocationTableCorrupted +2,4463,,SaveDataFileTableCorrupted +2,4464,,AllocationTableIteratedRangeEntry + +2,4501,4599,NcaCorrupted + +2,4601,4639,IntegrityVerificationStorageCorrupted +2,4602,, +2,4603,, +2,4604,,InvalidHashInIvfc +2,4612,,IvfcHashIsEmpty +2,4613,,InvalidHashInIvfcTopLayer + +2,4641,4659,PartitionFileSystemCorrupted +2,4642,,InvalidPartitionFileSystemHashOffset +2,4643,,InvalidPartitionFileSystemHash +2,4644,,InvalidPartitionFileSystemMagic +2,4645,,InvalidHashedPartitionFileSystemMagic +2,4646,,InvalidPartitionFileSystemEntryNameOffset + +2,4661,4679,BuiltInStorageCorrupted +2,4662,, + +2,4681,4699,FatFileSystemCorrupted +2,4701,4719,HostFileSystemCorrupted + +2,4721,4739,DatabaseCorrupted +2,4722,,SaveDataAllocationTableCorruptedInternal +2,4723,,SaveDataFileTableCorruptedInternal +2,4724,,AllocationTableIteratedRangeEntryInternal + +2,4741,4759,AesXtsFileSystemCorrupted +2,4742,,AesXtsFileHeaderTooShort +2,4743,,AesXtsFileHeaderInvalidKeys +2,4744,,AesXtsFileHeaderInvalidMagic +2,4745,,AesXtsFileTooShort +2,4746,,AesXtsFileHeaderTooShortInSetSize +2,4747,,AesXtsFileHeaderInvalidKeysInRenameFile +2,4748,,AesXtsFileHeaderInvalidKeysInSetSize + +2,4761,4769,SaveDataTransferDataCorrupted +2,4771,4779,SignedSystemPartitionDataCorrupted +2,4781,,GameCardLogoDataCorrupted + +2,4811,4819, +2,4812,, + +2,5000,5999,Unexpected +2,5307,,UnexpectedErrorInHostFileFlush +2,5308,,UnexpectedErrorInHostFileGetSize +2,5309,,UnknownHostFileSystemError +2,5320,,InvalidNcaMountPoint + +2,6000,,PreconditionViolation +2,6001,,InvalidArgument +2,6002,,InvalidPath +2,6003,,TooLongPath +2,6004,,InvalidCharacter +2,6005,,InvalidPathFormat +2,6006,,DirectoryUnobtainable +2,6007,,NotNormalized + +2,6030,6059,InvalidPathForOperation +2,6031,,DirectoryNotDeletable +2,6032,,DestinationIsSubPathOfSource +2,6033,,PathNotFoundInSaveDataFileTable +2,6034,,DifferentDestFileSystem + +2,6061,,InvalidOffset +2,6062,,InvalidSize +2,6063,,NullArgument +2,6065,,InvalidMountName +2,6066,,ExtensionSizeTooLarge +2,6067,,ExtensionSizeInvalid +2,6068,,ReadOldSaveDataInfoReader + +2,6080,6099,InvalidEnumValue +2,6081,,InvalidSaveDataState +2,6082,,InvalidSaveDataSpaceId + +2,6200,6299,InvalidOperationForOpenMode +2,6201,,FileExtensionWithoutOpenModeAllowAppend +2,6202,,InvalidOpenModeForRead +2,6203,,InvalidOpenModeForWrite + +2,6300,6399,UnsupportedOperation +2,6302,,SubStorageNotResizable +2,6303,,SubStorageNotResizableMiddleOfFile +2,6304,,UnsupportedOperationInMemoryStorageSetSize +2,6306,,UnsupportedOperationInFileStorageOperateRange +2,6310,,UnsupportedOperationInAesCtrExStorageWrite +2,6316,,UnsupportedOperationInHierarchicalIvfcStorageSetSize +2,6324,,UnsupportedOperationInIndirectStorageWrite +2,6325,,UnsupportedOperationInIndirectStorageSetSize +2,6350,,UnsupportedOperationInRoGameCardStorageWrite +2,6351,,UnsupportedOperationInRoGameCardStorageSetSize +2,6359,,UnsupportedOperationInConcatFsQueryEntry +2,6364,,UnsupportedOperationModifyRomFsFileSystem +2,6366,,UnsupportedOperationRomFsFileSystemGetSpace +2,6367,,UnsupportedOperationModifyRomFsFile +2,6369,,UnsupportedOperationModifyReadOnlyFileSystem +2,6371,,UnsupportedOperationReadOnlyFileSystemGetSpace +2,6372,,UnsupportedOperationModifyReadOnlyFile +2,6374,,UnsupportedOperationModifyPartitionFileSystem +2,6376,,UnsupportedOperationInPartitionFileSetSize +2,6377,,UnsupportedOperationIdInPartitionFileSystem + +2,6400,6449,PermissionDenied + +2,6452,,ExternalKeyAlreadyRegistered +2,6454,,WriteStateUnflushed +2,6457,,WritableFileOpen +2,6461,,AllocatorAlignmentViolation +2,6465,,UserNotExist + +2,6600,6699,EntryNotFound +2,6700,6799,OutOfResource +2,6706,,MappingTableFull +2,6707,,AllocationTableInsufficientFreeBlocks +2,6709,,OpenCountLimit + +2,6800,6899,MappingFailed +2,6811,,RemapStorageMapFull + +2,6900,6999,BadState +2,6902,,SubStorageNotInitialized +2,6905,,NotMounted +2,6906,,SaveDataIsExtending + +20,1,,TooLargeKeyOrDbFull +20,2,,KeyNotFound +20,4,,AllocationFailed +20,5,,InvalidKeyValue +20,6,,BufferInsufficient + +24,1,,DeviceNotFound +24,4,,DeviceAsleep \ No newline at end of file diff --git a/build/_build.csproj b/build/_build.csproj index fc171fc0..a5b96802 100644 --- a/build/_build.csproj +++ b/build/_build.csproj @@ -11,6 +11,7 @@ + @@ -20,6 +21,7 @@ + diff --git a/src/LibHac/Fs/ResultFs.cs b/src/LibHac/Fs/ResultFs.cs index c6bcd284..a4d5366b 100644 --- a/src/LibHac/Fs/ResultFs.cs +++ b/src/LibHac/Fs/ResultFs.cs @@ -16,45 +16,36 @@ namespace LibHac.Fs public static Result.Base InsufficientFreeSpaceBisSafe => new Result.Base(ModuleFs, 36); public static Result.Base InsufficientFreeSpaceBisUser => new Result.Base(ModuleFs, 37); public static Result.Base InsufficientFreeSpaceBisSystem => new Result.Base(ModuleFs, 38); - public static Result.Base InsufficientFreeSpaceSdCard => new Result.Base(ModuleFs, 38); + public static Result.Base InsufficientFreeSpaceSdCard => new Result.Base(ModuleFs, 39); public static Result.Base MountNameAlreadyExists => new Result.Base(ModuleFs, 60); - public static Result.Base PartitionNotFound => new Result.Base(ModuleFs, 1001); public static Result.Base TargetNotFound => new Result.Base(ModuleFs, 1002); public static Result.Base ExternalKeyNotFound => new Result.Base(ModuleFs, 1004); - public static Result.Base SdCardAccessFailed { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 2000, 2499); } public static Result.Base SdCardNotFound => new Result.Base(ModuleFs, 2001); public static Result.Base SdCardAsleep => new Result.Base(ModuleFs, 2004); - public static Result.Base GameCardAccessFailed { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 2500, 2999); } public static Result.Base InvalidBufferForGameCard => new Result.Base(ModuleFs, 2503); public static Result.Base GameCardNotInserted => new Result.Base(ModuleFs, 2520); - public static Result.Base GameCardNotInsertedOnGetHandle => new Result.Base(ModuleFs, 2951); public static Result.Base InvalidGameCardHandleOnRead => new Result.Base(ModuleFs, 2952); public static Result.Base InvalidGameCardHandleOnGetCardInfo => new Result.Base(ModuleFs, 2954); public static Result.Base InvalidGameCardHandleOnOpenNormalPartition => new Result.Base(ModuleFs, 2960); public static Result.Base InvalidGameCardHandleOnOpenSecurePartition => new Result.Base(ModuleFs, 2961); - public static Result.Base NotImplemented => new Result.Base(ModuleFs, 3001); public static Result.Base Result3002 => new Result.Base(ModuleFs, 3002); public static Result.Base SaveDataPathAlreadyExists => new Result.Base(ModuleFs, 3003); public static Result.Base OutOfRange => new Result.Base(ModuleFs, 3005); - public static Result.Base AllocationMemoryFailed { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 3200, 3499); } public static Result.Base AesXtsFileFileStorageAllocationError => new Result.Base(ModuleFs, 3312); public static Result.Base AesXtsFileXtsStorageAllocationError => new Result.Base(ModuleFs, 3313); public static Result.Base AesXtsFileAlignmentStorageAllocationError => new Result.Base(ModuleFs, 3314); public static Result.Base AesXtsFileStorageFileAllocationError => new Result.Base(ModuleFs, 3315); public static Result.Base AesXtsFileSubStorageAllocationError => new Result.Base(ModuleFs, 3383); - public static Result.Base MmcAccessFailed { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 3500, 3999); } - public static Result.Base DataCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4000, 4999); } public static Result.Base RomCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4001, 4299); } public static Result.Base InvalidIndirectStorageSource => new Result.Base(ModuleFs, 4023); - public static Result.Base SaveDataCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4301, 4499); } public static Result.Base Result4302 => new Result.Base(ModuleFs, 4302); public static Result.Base InvalidSaveDataEntryType => new Result.Base(ModuleFs, 4303); @@ -64,40 +55,32 @@ namespace LibHac.Fs public static Result.Base InvalidHashInSaveIvfc => new Result.Base(ModuleFs, 4364); public static Result.Base SaveIvfcHashIsEmpty => new Result.Base(ModuleFs, 4372); public static Result.Base InvalidHashInSaveIvfcTopLayer => new Result.Base(ModuleFs, 4373); - public static Result.Base Result4402 => new Result.Base(ModuleFs, 4402); public static Result.Base Result4427 => new Result.Base(ModuleFs, 4427); public static Result.Base SaveDataAllocationTableCorrupted => new Result.Base(ModuleFs, 4462); public static Result.Base SaveDataFileTableCorrupted => new Result.Base(ModuleFs, 4463); public static Result.Base AllocationTableIteratedRangeEntry => new Result.Base(ModuleFs, 4464); - public static Result.Base NcaCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4501, 4599); } - public static Result.Base IntegrityVerificationStorageCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4601, 4639); } public static Result.Base Result4602 => new Result.Base(ModuleFs, 4602); public static Result.Base Result4603 => new Result.Base(ModuleFs, 4603); public static Result.Base InvalidHashInIvfc => new Result.Base(ModuleFs, 4604); public static Result.Base IvfcHashIsEmpty => new Result.Base(ModuleFs, 4612); public static Result.Base InvalidHashInIvfcTopLayer => new Result.Base(ModuleFs, 4613); - public static Result.Base PartitionFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4641, 4659); } public static Result.Base InvalidPartitionFileSystemHashOffset => new Result.Base(ModuleFs, 4642); public static Result.Base InvalidPartitionFileSystemHash => new Result.Base(ModuleFs, 4643); public static Result.Base InvalidPartitionFileSystemMagic => new Result.Base(ModuleFs, 4644); public static Result.Base InvalidHashedPartitionFileSystemMagic => new Result.Base(ModuleFs, 4645); public static Result.Base InvalidPartitionFileSystemEntryNameOffset => new Result.Base(ModuleFs, 4646); - public static Result.Base BuiltInStorageCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4661, 4679); } public static Result.Base Result4662 => new Result.Base(ModuleFs, 4662); - public static Result.Base FatFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4681, 4699); } public static Result.Base HostFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4701, 4719); } - public static Result.Base DatabaseCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4721, 4739); } public static Result.Base SaveDataAllocationTableCorruptedInternal => new Result.Base(ModuleFs, 4722); public static Result.Base SaveDataFileTableCorruptedInternal => new Result.Base(ModuleFs, 4723); public static Result.Base AllocationTableIteratedRangeEntryInternal => new Result.Base(ModuleFs, 4724); - public static Result.Base AesXtsFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4741, 4759); } public static Result.Base AesXtsFileHeaderTooShort => new Result.Base(ModuleFs, 4742); public static Result.Base AesXtsFileHeaderInvalidKeys => new Result.Base(ModuleFs, 4743); @@ -106,23 +89,16 @@ namespace LibHac.Fs public static Result.Base AesXtsFileHeaderTooShortInSetSize => new Result.Base(ModuleFs, 4746); public static Result.Base AesXtsFileHeaderInvalidKeysInRenameFile => new Result.Base(ModuleFs, 4747); public static Result.Base AesXtsFileHeaderInvalidKeysInSetSize => new Result.Base(ModuleFs, 4748); - public static Result.Base SaveDataTransferDataCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4761, 4769); } public static Result.Base SignedSystemPartitionDataCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4771, 4779); } - public static Result.Base GameCardLogoDataCorrupted => new Result.Base(ModuleFs, 4781); - public static Result.Base Range4811To4819 { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4811, 4819); } public static Result.Base Result4812 => new Result.Base(ModuleFs, 4812); - public static Result.Base Unexpected { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 5000, 5999); } - public static Result.Base UnexpectedErrorInHostFileFlush => new Result.Base(ModuleFs, 5307); public static Result.Base UnexpectedErrorInHostFileGetSize => new Result.Base(ModuleFs, 5308); public static Result.Base UnknownHostFileSystemError => new Result.Base(ModuleFs, 5309); - public static Result.Base InvalidNcaMountPoint => new Result.Base(ModuleFs, 5320); - public static Result.Base PreconditionViolation => new Result.Base(ModuleFs, 6000); public static Result.Base InvalidArgument => new Result.Base(ModuleFs, 6001); public static Result.Base InvalidPath => new Result.Base(ModuleFs, 6002); @@ -131,13 +107,11 @@ namespace LibHac.Fs public static Result.Base InvalidPathFormat => new Result.Base(ModuleFs, 6005); public static Result.Base DirectoryUnobtainable => new Result.Base(ModuleFs, 6006); public static Result.Base NotNormalized => new Result.Base(ModuleFs, 6007); - public static Result.Base InvalidPathForOperation { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6030, 6059); } public static Result.Base DirectoryNotDeletable => new Result.Base(ModuleFs, 6031); public static Result.Base DestinationIsSubPathOfSource => new Result.Base(ModuleFs, 6032); public static Result.Base PathNotFoundInSaveDataFileTable => new Result.Base(ModuleFs, 6033); public static Result.Base DifferentDestFileSystem => new Result.Base(ModuleFs, 6034); - public static Result.Base InvalidOffset => new Result.Base(ModuleFs, 6061); public static Result.Base InvalidSize => new Result.Base(ModuleFs, 6062); public static Result.Base NullArgument => new Result.Base(ModuleFs, 6063); @@ -145,16 +119,13 @@ namespace LibHac.Fs public static Result.Base ExtensionSizeTooLarge => new Result.Base(ModuleFs, 6066); public static Result.Base ExtensionSizeInvalid => new Result.Base(ModuleFs, 6067); public static Result.Base ReadOldSaveDataInfoReader => new Result.Base(ModuleFs, 6068); - public static Result.Base InvalidEnumValue { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6080, 6099); } public static Result.Base InvalidSaveDataState => new Result.Base(ModuleFs, 6081); public static Result.Base InvalidSaveDataSpaceId => new Result.Base(ModuleFs, 6082); - public static Result.Base InvalidOperationForOpenMode { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6200, 6299); } public static Result.Base FileExtensionWithoutOpenModeAllowAppend => new Result.Base(ModuleFs, 6201); public static Result.Base InvalidOpenModeForRead => new Result.Base(ModuleFs, 6202); public static Result.Base InvalidOpenModeForWrite => new Result.Base(ModuleFs, 6203); - public static Result.Base UnsupportedOperation { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6300, 6399); } public static Result.Base SubStorageNotResizable => new Result.Base(ModuleFs, 6302); public static Result.Base SubStorageNotResizableMiddleOfFile => new Result.Base(ModuleFs, 6303); @@ -176,25 +147,19 @@ namespace LibHac.Fs public static Result.Base UnsupportedOperationModifyPartitionFileSystem => new Result.Base(ModuleFs, 6374); public static Result.Base UnsupportedOperationInPartitionFileSetSize => new Result.Base(ModuleFs, 6376); public static Result.Base UnsupportedOperationIdInPartitionFileSystem => new Result.Base(ModuleFs, 6377); - public static Result.Base PermissionDenied { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6400, 6449); } - public static Result.Base ExternalKeyAlreadyRegistered => new Result.Base(ModuleFs, 6452); public static Result.Base WriteStateUnflushed => new Result.Base(ModuleFs, 6454); public static Result.Base WritableFileOpen => new Result.Base(ModuleFs, 6457); public static Result.Base AllocatorAlignmentViolation => new Result.Base(ModuleFs, 6461); public static Result.Base UserNotExist => new Result.Base(ModuleFs, 6465); - public static Result.Base EntryNotFound { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6600, 6699); } - public static Result.Base OutOfResource { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6700, 6799); } public static Result.Base MappingTableFull => new Result.Base(ModuleFs, 6706); public static Result.Base AllocationTableInsufficientFreeBlocks => new Result.Base(ModuleFs, 6707); public static Result.Base OpenCountLimit => new Result.Base(ModuleFs, 6709); - public static Result.Base MappingFailed { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6800, 6899); } public static Result.Base RemapStorageMapFull => new Result.Base(ModuleFs, 6811); - public static Result.Base BadState { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6900, 6999); } public static Result.Base SubStorageNotInitialized => new Result.Base(ModuleFs, 6902); public static Result.Base NotMounted => new Result.Base(ModuleFs, 6905); From 07d8b7c21e07ef45029f33e81986e11942822506 Mon Sep 17 00:00:00 2001 From: Alex Barney Date: Tue, 25 Feb 2020 17:32:30 -0700 Subject: [PATCH 2/6] Add results found in a Unity game --- build/CodeGen/results.csv | 56 +++++++++++++++++-- src/LibHac/Fs/Accessors/FileSystemAccessor.cs | 2 +- src/LibHac/Fs/ResultFs.cs | 26 +++++++-- .../FsSystem/DirectorySaveDataFileSystem.cs | 2 +- 4 files changed, 75 insertions(+), 11 deletions(-) diff --git a/build/CodeGen/results.csv b/build/CodeGen/results.csv index 86b52cd1..c26e8a7f 100644 --- a/build/CodeGen/results.csv +++ b/build/CodeGen/results.csv @@ -1,16 +1,20 @@ Module,DescriptionStart,DescriptionEnd,Name +2,0,999,HandledByAllProcess 2,1,,PathNotFound 2,2,,PathAlreadyExists 2,7,,TargetLocked 2,8,,DirectoryNotEmpty +2,13,,DirectoryStatusChanged 2,30,45,InsufficientFreeSpace +2,31,,UsableSpaceNotEnoughForSaveData 2,34,38,InsufficientFreeSpaceBis 2,35,,InsufficientFreeSpaceBisCalibration 2,36,,InsufficientFreeSpaceBisSafe 2,37,,InsufficientFreeSpaceBisUser 2,38,,InsufficientFreeSpaceBisSystem 2,39,,InsufficientFreeSpaceSdCard +2,50,,UnsupportedSdkVersion 2,60,,MountNameAlreadyExists 2,1001,,PartitionNotFound @@ -48,6 +52,12 @@ Module,DescriptionStart,DescriptionEnd,Name 2,4001,4299,RomCorrupted 2,4023,,InvalidIndirectStorageSource +2,4241,4259,RomHostFileSystemCorrupted +2,4242,,RomHostEntryCorrupted +2,4243,,RomHostFileDataCorrupted +2,4244,,RomHostFileCorrupted +2,4245,,InvalidRomHostHandle + 2,4301,4499,SaveDataCorrupted 2,4302,, 2,4303,,InvalidSaveDataEntryType @@ -60,6 +70,12 @@ Module,DescriptionStart,DescriptionEnd,Name 2,4402,, 2,4427,, +2,4441,4459,SaveDataHostFileSystemCorrupted +2,4442,,SaveDataHostEntryCorrupted +2,4443,,SaveDataHostFileDataCorrupted +2,4444,,SaveDataHostFileCorrupted +2,4445,,InvalidSaveDataHostHandle + 2,4462,,SaveDataAllocationTableCorrupted 2,4463,,SaveDataFileTableCorrupted 2,4464,,AllocationTableIteratedRangeEntry @@ -84,7 +100,12 @@ Module,DescriptionStart,DescriptionEnd,Name 2,4662,, 2,4681,4699,FatFileSystemCorrupted + 2,4701,4719,HostFileSystemCorrupted +2,4702,,HostEntryCorrupted +2,4703,,HostFileDataCorrupted +2,4704,,HostFileCorrupted +2,4705,,InvalidHostHandle 2,4721,4739,DatabaseCorrupted 2,4722,,SaveDataAllocationTableCorruptedInternal @@ -113,9 +134,9 @@ Module,DescriptionStart,DescriptionEnd,Name 2,5309,,UnknownHostFileSystemError 2,5320,,InvalidNcaMountPoint -2,6000,,PreconditionViolation -2,6001,,InvalidArgument -2,6002,,InvalidPath +2,6000,6499,PreconditionViolation +2,6001,6199,InvalidArgument +2,6002,6029,InvalidPath 2,6003,,TooLongPath 2,6004,,InvalidCharacter 2,6005,,InvalidPathFormat @@ -171,7 +192,7 @@ Module,DescriptionStart,DescriptionEnd,Name 2,6452,,ExternalKeyAlreadyRegistered 2,6454,,WriteStateUnflushed -2,6457,,WritableFileOpen +2,6457,,WriteModeFileNotClosed 2,6461,,AllocatorAlignmentViolation 2,6465,,UserNotExist @@ -196,4 +217,29 @@ Module,DescriptionStart,DescriptionEnd,Name 20,6,,BufferInsufficient 24,1,,DeviceNotFound -24,4,,DeviceAsleep \ No newline at end of file +24,4,,DeviceAsleep + +123,0,4999,SslService + +124,0,,Cancelled +124,1,,CancelledByUser +124,100,,UserNotExist +124,200,269,NetworkServiceAccountUnavailable +124,430,499,TokenCacheUnavailable +124,3000,8191,NetworkCommunicationError + +202,140,149,Invalid +202,601,,DualConnected +202,602,,SameJoyTypeConnected +202,603,,ColorNotAvailable +202,604,,ControllerNotConnected +202,3101,,Canceled +202,3102,,NotSupportedNpadStyle +202,3200,3209,ControllerFirmwareUpdateError +202,3201,,ControllerFirmwareUpdateFailed + +205,110,119,IrsensorUnavailable +205,110,,IrsensorUnconnected +205,111,,IrsensorUnsupported +205,120,,IrsensorNotReady +205,122,139,IrsensorDeviceError \ No newline at end of file diff --git a/src/LibHac/Fs/Accessors/FileSystemAccessor.cs b/src/LibHac/Fs/Accessors/FileSystemAccessor.cs index abe91a07..22bc24f4 100644 --- a/src/LibHac/Fs/Accessors/FileSystemAccessor.cs +++ b/src/LibHac/Fs/Accessors/FileSystemAccessor.cs @@ -138,7 +138,7 @@ namespace LibHac.Fs.Accessors { if (OpenFiles.Any(x => (x.OpenMode & OpenMode.Write) != 0)) { - return ResultFs.WritableFileOpen.Log(); + return ResultFs.WriteModeFileNotClosed.Log(); } return FileSystem.Commit(); diff --git a/src/LibHac/Fs/ResultFs.cs b/src/LibHac/Fs/ResultFs.cs index a4d5366b..07b45851 100644 --- a/src/LibHac/Fs/ResultFs.cs +++ b/src/LibHac/Fs/ResultFs.cs @@ -6,17 +6,21 @@ namespace LibHac.Fs { public const int ModuleFs = 2; + public static Result.Base HandledByAllProcess => new Result.Base(ModuleFs, 0, 999); public static Result.Base PathNotFound => new Result.Base(ModuleFs, 1); public static Result.Base PathAlreadyExists => new Result.Base(ModuleFs, 2); public static Result.Base TargetLocked => new Result.Base(ModuleFs, 7); public static Result.Base DirectoryNotEmpty => new Result.Base(ModuleFs, 8); + public static Result.Base DirectoryStatusChanged => new Result.Base(ModuleFs, 13); public static Result.Base InsufficientFreeSpace => new Result.Base(ModuleFs, 30, 45); + public static Result.Base UsableSpaceNotEnoughForSaveData => new Result.Base(ModuleFs, 31); public static Result.Base InsufficientFreeSpaceBis => new Result.Base(ModuleFs, 34, 38); public static Result.Base InsufficientFreeSpaceBisCalibration => new Result.Base(ModuleFs, 35); public static Result.Base InsufficientFreeSpaceBisSafe => new Result.Base(ModuleFs, 36); public static Result.Base InsufficientFreeSpaceBisUser => new Result.Base(ModuleFs, 37); public static Result.Base InsufficientFreeSpaceBisSystem => new Result.Base(ModuleFs, 38); public static Result.Base InsufficientFreeSpaceSdCard => new Result.Base(ModuleFs, 39); + public static Result.Base UnsupportedSdkVersion => new Result.Base(ModuleFs, 50); public static Result.Base MountNameAlreadyExists => new Result.Base(ModuleFs, 60); public static Result.Base PartitionNotFound => new Result.Base(ModuleFs, 1001); public static Result.Base TargetNotFound => new Result.Base(ModuleFs, 1002); @@ -46,6 +50,11 @@ namespace LibHac.Fs public static Result.Base DataCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4000, 4999); } public static Result.Base RomCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4001, 4299); } public static Result.Base InvalidIndirectStorageSource => new Result.Base(ModuleFs, 4023); + public static Result.Base RomHostFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4241, 4259); } + public static Result.Base RomHostEntryCorrupted => new Result.Base(ModuleFs, 4242); + public static Result.Base RomHostFileDataCorrupted => new Result.Base(ModuleFs, 4243); + public static Result.Base RomHostFileCorrupted => new Result.Base(ModuleFs, 4244); + public static Result.Base InvalidRomHostHandle => new Result.Base(ModuleFs, 4245); public static Result.Base SaveDataCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4301, 4499); } public static Result.Base Result4302 => new Result.Base(ModuleFs, 4302); public static Result.Base InvalidSaveDataEntryType => new Result.Base(ModuleFs, 4303); @@ -57,6 +66,11 @@ namespace LibHac.Fs public static Result.Base InvalidHashInSaveIvfcTopLayer => new Result.Base(ModuleFs, 4373); public static Result.Base Result4402 => new Result.Base(ModuleFs, 4402); public static Result.Base Result4427 => new Result.Base(ModuleFs, 4427); + public static Result.Base SaveDataHostFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4441, 4459); } + public static Result.Base SaveDataHostEntryCorrupted => new Result.Base(ModuleFs, 4442); + public static Result.Base SaveDataHostFileDataCorrupted => new Result.Base(ModuleFs, 4443); + public static Result.Base SaveDataHostFileCorrupted => new Result.Base(ModuleFs, 4444); + public static Result.Base InvalidSaveDataHostHandle => new Result.Base(ModuleFs, 4445); public static Result.Base SaveDataAllocationTableCorrupted => new Result.Base(ModuleFs, 4462); public static Result.Base SaveDataFileTableCorrupted => new Result.Base(ModuleFs, 4463); public static Result.Base AllocationTableIteratedRangeEntry => new Result.Base(ModuleFs, 4464); @@ -77,6 +91,10 @@ namespace LibHac.Fs public static Result.Base Result4662 => new Result.Base(ModuleFs, 4662); public static Result.Base FatFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4681, 4699); } public static Result.Base HostFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4701, 4719); } + public static Result.Base HostEntryCorrupted => new Result.Base(ModuleFs, 4702); + public static Result.Base HostFileDataCorrupted => new Result.Base(ModuleFs, 4703); + public static Result.Base HostFileCorrupted => new Result.Base(ModuleFs, 4704); + public static Result.Base InvalidHostHandle => new Result.Base(ModuleFs, 4705); public static Result.Base DatabaseCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4721, 4739); } public static Result.Base SaveDataAllocationTableCorruptedInternal => new Result.Base(ModuleFs, 4722); public static Result.Base SaveDataFileTableCorruptedInternal => new Result.Base(ModuleFs, 4723); @@ -99,9 +117,9 @@ namespace LibHac.Fs public static Result.Base UnexpectedErrorInHostFileGetSize => new Result.Base(ModuleFs, 5308); public static Result.Base UnknownHostFileSystemError => new Result.Base(ModuleFs, 5309); public static Result.Base InvalidNcaMountPoint => new Result.Base(ModuleFs, 5320); - public static Result.Base PreconditionViolation => new Result.Base(ModuleFs, 6000); - public static Result.Base InvalidArgument => new Result.Base(ModuleFs, 6001); - public static Result.Base InvalidPath => new Result.Base(ModuleFs, 6002); + public static Result.Base PreconditionViolation { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6000, 6499); } + public static Result.Base InvalidArgument { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6001, 6199); } + public static Result.Base InvalidPath { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6002, 6029); } public static Result.Base TooLongPath => new Result.Base(ModuleFs, 6003); public static Result.Base InvalidCharacter => new Result.Base(ModuleFs, 6004); public static Result.Base InvalidPathFormat => new Result.Base(ModuleFs, 6005); @@ -150,7 +168,7 @@ namespace LibHac.Fs public static Result.Base PermissionDenied { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6400, 6449); } public static Result.Base ExternalKeyAlreadyRegistered => new Result.Base(ModuleFs, 6452); public static Result.Base WriteStateUnflushed => new Result.Base(ModuleFs, 6454); - public static Result.Base WritableFileOpen => new Result.Base(ModuleFs, 6457); + public static Result.Base WriteModeFileNotClosed => new Result.Base(ModuleFs, 6457); public static Result.Base AllocatorAlignmentViolation => new Result.Base(ModuleFs, 6461); public static Result.Base UserNotExist => new Result.Base(ModuleFs, 6465); public static Result.Base EntryNotFound { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6600, 6699); } diff --git a/src/LibHac/FsSystem/DirectorySaveDataFileSystem.cs b/src/LibHac/FsSystem/DirectorySaveDataFileSystem.cs index aa0d2d1a..4eea8b81 100644 --- a/src/LibHac/FsSystem/DirectorySaveDataFileSystem.cs +++ b/src/LibHac/FsSystem/DirectorySaveDataFileSystem.cs @@ -215,7 +215,7 @@ namespace LibHac.FsSystem if (OpenWritableFileCount > 0) { // All files must be closed before commiting save data. - return ResultFs.WritableFileOpen.Log(); + return ResultFs.WriteModeFileNotClosed.Log(); } // Get rid of the previous commit by renaming the folder From 27618bbc45e3d5bad89a29e87b0d3a6287ce12db Mon Sep 17 00:00:00 2001 From: Alex Barney Date: Wed, 26 Feb 2020 00:55:53 -0700 Subject: [PATCH 3/6] Indent results based on hierarchy --- build/CodeGen/IndentingStringBuilder.cs | 15 + build/CodeGen/ResultCodegen.cs | 119 +++++++- src/LibHac/Fs/ResultFs.cs | 354 +++++++++++++----------- src/LibHac/Result.cs | 4 +- 4 files changed, 326 insertions(+), 166 deletions(-) diff --git a/build/CodeGen/IndentingStringBuilder.cs b/build/CodeGen/IndentingStringBuilder.cs index 31b601d4..2d0e8ab3 100644 --- a/build/CodeGen/IndentingStringBuilder.cs +++ b/build/CodeGen/IndentingStringBuilder.cs @@ -11,6 +11,7 @@ namespace LibHacBuild.CodeGen private StringBuilder _sb = new StringBuilder(); private string _indentation = string.Empty; private bool _hasIndentedCurrentLine; + private bool _lastLineWasEmpty; public IndentingStringBuilder() { } public IndentingStringBuilder(int levelSize) => LevelSize = levelSize; @@ -28,6 +29,19 @@ namespace LibHacBuild.CodeGen { _sb.AppendLine(); _hasIndentedCurrentLine = false; + _lastLineWasEmpty = true; + return this; + } + + public IndentingStringBuilder AppendSpacerLine() + { + if (!_lastLineWasEmpty) + { + _sb.AppendLine(); + _hasIndentedCurrentLine = false; + _lastLineWasEmpty = true; + } + return this; } @@ -36,6 +50,7 @@ namespace LibHacBuild.CodeGen IndentIfNeeded(); _sb.AppendLine(value); _hasIndentedCurrentLine = false; + _lastLineWasEmpty = string.IsNullOrWhiteSpace(value); return this; } diff --git a/build/CodeGen/ResultCodegen.cs b/build/CodeGen/ResultCodegen.cs index df4f7af9..dd777069 100644 --- a/build/CodeGen/ResultCodegen.cs +++ b/build/CodeGen/ResultCodegen.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Reflection; using System.Text; using CsvHelper; +using CsvHelper.Configuration; using Nuke.Common; namespace LibHacBuild.CodeGen @@ -20,7 +21,9 @@ namespace LibHacBuild.CodeGen { ModuleInfo[] modules = ReadResults(); - SetEmptyResultNames(modules); + SetEmptyResultValues(modules); + ValidateResults(modules); + ValidateHierarchy(modules); CheckIfAggressiveInliningNeeded(modules); SetOutputPaths(modules); @@ -65,19 +68,68 @@ namespace LibHacBuild.CodeGen return modules.Values.ToArray(); } - private static void SetEmptyResultNames(ModuleInfo[] modules) + private static void SetEmptyResultValues(ModuleInfo[] modules) { foreach (ModuleInfo module in modules) { foreach (ResultInfo result in module.Results.Where(x => string.IsNullOrWhiteSpace(x.Name))) { - if (result.DescriptionEnd.HasValue) + if (result.IsRange) { result.Name += $"Range{result.DescriptionStart}To{result.DescriptionEnd}"; } else { result.Name = $"Result{result.DescriptionStart}"; + result.DescriptionEnd = result.DescriptionStart; + } + } + } + } + + private static void ValidateResults(ModuleInfo[] modules) + { + foreach (ModuleInfo module in modules) + { + foreach (ResultInfo result in module.Results) + { + // Logic should match Result.Base.ctor + Assert(1 <= result.Module && result.Module < 512, "Invalid Module"); + Assert(0 <= result.DescriptionStart && result.DescriptionStart < 8192, "Invalid Description Start"); + Assert(0 <= result.DescriptionEnd && result.DescriptionEnd < 8192, "Invalid Description End"); + Assert(result.DescriptionStart <= result.DescriptionEnd, "descriptionStart must be <= descriptionEnd"); + + // ReSharper disable once ParameterOnlyUsedForPreconditionCheck.Local + void Assert(bool condition, string message) + { + if (!condition) + throw new InvalidDataException($"Result {result.Module}-{result.DescriptionStart}: {message}"); + } + } + } + } + + private static void ValidateHierarchy(ModuleInfo[] modules) + { + foreach (ModuleInfo module in modules) + { + var hierarchy = new Stack(); + + foreach (ResultInfo result in module.Results) + { + while (hierarchy.Count > 0 && hierarchy.Peek().DescriptionEnd < result.DescriptionStart) + { + hierarchy.Pop(); + } + + if (result.IsRange) + { + if (hierarchy.Count > 0 && result.DescriptionEnd > hierarchy.Peek().DescriptionEnd) + { + throw new InvalidDataException($"Result {result.Module}-{result.DescriptionStart} is not nested properly."); + } + + hierarchy.Push(result); } } } @@ -120,9 +172,38 @@ namespace LibHacBuild.CodeGen sb.AppendLine($"public const int Module{module.Name} = {module.Index};"); sb.AppendLine(); + var hierarchy = new Stack(); + bool justIndented = false; + foreach (ResultInfo result in module.Results) { + while (hierarchy.Count > 0 && hierarchy.Peek().DescriptionEnd < result.DescriptionStart) + { + hierarchy.Pop(); + sb.DecreaseLevel(); + sb.AppendSpacerLine(); + } + + if (!justIndented && result.IsRange) + { + sb.AppendSpacerLine(); + } + PrintResult(sb, module.Name, result); + + if (result.IsRange) + { + hierarchy.Push(result); + sb.IncreaseLevel(); + } + + justIndented = result.IsRange; + } + + while (hierarchy.Count > 0) + { + hierarchy.Pop(); + sb.DecreaseLevel(); } sb.DecreaseAndAppendLine("}"); @@ -135,7 +216,7 @@ namespace LibHacBuild.CodeGen { string descriptionArgs; - if (result.DescriptionEnd.HasValue) + if (result.IsRange) { descriptionArgs = $"{result.DescriptionStart}, {result.DescriptionEnd}"; } @@ -197,6 +278,11 @@ namespace LibHacBuild.CodeGen { csv.Configuration.AllowComments = true; + if (typeof(T) == typeof(ResultInfo)) + { + csv.Configuration.RegisterClassMap(); + } + return csv.GetRecords().ToArray(); } } @@ -239,8 +325,8 @@ namespace LibHacBuild.CodeGen size += GetLoadSize(result.Module); size += GetLoadSize(result.DescriptionStart); - if (result.DescriptionEnd.HasValue) - size += GetLoadSize(result.DescriptionEnd.Value); + if (result.IsRange) + size += GetLoadSize(result.DescriptionEnd); size += 5; // newobj size += 1; // ret @@ -291,10 +377,29 @@ namespace LibHacBuild.CodeGen { public int Module { get; set; } public int DescriptionStart { get; set; } - public int? DescriptionEnd { get; set; } + public int DescriptionEnd { get; set; } public string Name { get; set; } + public bool IsRange => DescriptionStart != DescriptionEnd; public string ErrorCode => $"{2000 + Module:d4}-{DescriptionStart:d4}"; public int InnerValue => Module & 0x1ff | ((DescriptionStart & 0x7ffff) << 9); } + + public sealed class ResultMap : ClassMap + { + public ResultMap() + { + Map(m => m.Module); + Map(m => m.Name); + Map(m => m.DescriptionStart); + Map(m => m.DescriptionEnd).ConvertUsing(row => + { + string field = row.GetField("DescriptionEnd"); + if (string.IsNullOrWhiteSpace(field)) + field = row.GetField("DescriptionStart"); + + return int.Parse(field); + }); + } + } } diff --git a/src/LibHac/Fs/ResultFs.cs b/src/LibHac/Fs/ResultFs.cs index 07b45851..a9a25766 100644 --- a/src/LibHac/Fs/ResultFs.cs +++ b/src/LibHac/Fs/ResultFs.cs @@ -7,180 +7,220 @@ namespace LibHac.Fs public const int ModuleFs = 2; public static Result.Base HandledByAllProcess => new Result.Base(ModuleFs, 0, 999); - public static Result.Base PathNotFound => new Result.Base(ModuleFs, 1); - public static Result.Base PathAlreadyExists => new Result.Base(ModuleFs, 2); - public static Result.Base TargetLocked => new Result.Base(ModuleFs, 7); - public static Result.Base DirectoryNotEmpty => new Result.Base(ModuleFs, 8); - public static Result.Base DirectoryStatusChanged => new Result.Base(ModuleFs, 13); - public static Result.Base InsufficientFreeSpace => new Result.Base(ModuleFs, 30, 45); - public static Result.Base UsableSpaceNotEnoughForSaveData => new Result.Base(ModuleFs, 31); - public static Result.Base InsufficientFreeSpaceBis => new Result.Base(ModuleFs, 34, 38); - public static Result.Base InsufficientFreeSpaceBisCalibration => new Result.Base(ModuleFs, 35); - public static Result.Base InsufficientFreeSpaceBisSafe => new Result.Base(ModuleFs, 36); - public static Result.Base InsufficientFreeSpaceBisUser => new Result.Base(ModuleFs, 37); - public static Result.Base InsufficientFreeSpaceBisSystem => new Result.Base(ModuleFs, 38); - public static Result.Base InsufficientFreeSpaceSdCard => new Result.Base(ModuleFs, 39); - public static Result.Base UnsupportedSdkVersion => new Result.Base(ModuleFs, 50); - public static Result.Base MountNameAlreadyExists => new Result.Base(ModuleFs, 60); + public static Result.Base PathNotFound => new Result.Base(ModuleFs, 1); + public static Result.Base PathAlreadyExists => new Result.Base(ModuleFs, 2); + public static Result.Base TargetLocked => new Result.Base(ModuleFs, 7); + public static Result.Base DirectoryNotEmpty => new Result.Base(ModuleFs, 8); + public static Result.Base DirectoryStatusChanged => new Result.Base(ModuleFs, 13); + + public static Result.Base InsufficientFreeSpace => new Result.Base(ModuleFs, 30, 45); + public static Result.Base UsableSpaceNotEnoughForSaveData => new Result.Base(ModuleFs, 31); + + public static Result.Base InsufficientFreeSpaceBis => new Result.Base(ModuleFs, 34, 38); + public static Result.Base InsufficientFreeSpaceBisCalibration => new Result.Base(ModuleFs, 35); + public static Result.Base InsufficientFreeSpaceBisSafe => new Result.Base(ModuleFs, 36); + public static Result.Base InsufficientFreeSpaceBisUser => new Result.Base(ModuleFs, 37); + public static Result.Base InsufficientFreeSpaceBisSystem => new Result.Base(ModuleFs, 38); + + public static Result.Base InsufficientFreeSpaceSdCard => new Result.Base(ModuleFs, 39); + + public static Result.Base UnsupportedSdkVersion => new Result.Base(ModuleFs, 50); + public static Result.Base MountNameAlreadyExists => new Result.Base(ModuleFs, 60); + public static Result.Base PartitionNotFound => new Result.Base(ModuleFs, 1001); public static Result.Base TargetNotFound => new Result.Base(ModuleFs, 1002); public static Result.Base ExternalKeyNotFound => new Result.Base(ModuleFs, 1004); + public static Result.Base SdCardAccessFailed { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 2000, 2499); } - public static Result.Base SdCardNotFound => new Result.Base(ModuleFs, 2001); - public static Result.Base SdCardAsleep => new Result.Base(ModuleFs, 2004); + public static Result.Base SdCardNotFound => new Result.Base(ModuleFs, 2001); + public static Result.Base SdCardAsleep => new Result.Base(ModuleFs, 2004); + public static Result.Base GameCardAccessFailed { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 2500, 2999); } - public static Result.Base InvalidBufferForGameCard => new Result.Base(ModuleFs, 2503); - public static Result.Base GameCardNotInserted => new Result.Base(ModuleFs, 2520); - public static Result.Base GameCardNotInsertedOnGetHandle => new Result.Base(ModuleFs, 2951); - public static Result.Base InvalidGameCardHandleOnRead => new Result.Base(ModuleFs, 2952); - public static Result.Base InvalidGameCardHandleOnGetCardInfo => new Result.Base(ModuleFs, 2954); - public static Result.Base InvalidGameCardHandleOnOpenNormalPartition => new Result.Base(ModuleFs, 2960); - public static Result.Base InvalidGameCardHandleOnOpenSecurePartition => new Result.Base(ModuleFs, 2961); + public static Result.Base InvalidBufferForGameCard => new Result.Base(ModuleFs, 2503); + public static Result.Base GameCardNotInserted => new Result.Base(ModuleFs, 2520); + public static Result.Base GameCardNotInsertedOnGetHandle => new Result.Base(ModuleFs, 2951); + public static Result.Base InvalidGameCardHandleOnRead => new Result.Base(ModuleFs, 2952); + public static Result.Base InvalidGameCardHandleOnGetCardInfo => new Result.Base(ModuleFs, 2954); + public static Result.Base InvalidGameCardHandleOnOpenNormalPartition => new Result.Base(ModuleFs, 2960); + public static Result.Base InvalidGameCardHandleOnOpenSecurePartition => new Result.Base(ModuleFs, 2961); + public static Result.Base NotImplemented => new Result.Base(ModuleFs, 3001); public static Result.Base Result3002 => new Result.Base(ModuleFs, 3002); public static Result.Base SaveDataPathAlreadyExists => new Result.Base(ModuleFs, 3003); public static Result.Base OutOfRange => new Result.Base(ModuleFs, 3005); + public static Result.Base AllocationMemoryFailed { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 3200, 3499); } - public static Result.Base AesXtsFileFileStorageAllocationError => new Result.Base(ModuleFs, 3312); - public static Result.Base AesXtsFileXtsStorageAllocationError => new Result.Base(ModuleFs, 3313); - public static Result.Base AesXtsFileAlignmentStorageAllocationError => new Result.Base(ModuleFs, 3314); - public static Result.Base AesXtsFileStorageFileAllocationError => new Result.Base(ModuleFs, 3315); - public static Result.Base AesXtsFileSubStorageAllocationError => new Result.Base(ModuleFs, 3383); + public static Result.Base AesXtsFileFileStorageAllocationError => new Result.Base(ModuleFs, 3312); + public static Result.Base AesXtsFileXtsStorageAllocationError => new Result.Base(ModuleFs, 3313); + public static Result.Base AesXtsFileAlignmentStorageAllocationError => new Result.Base(ModuleFs, 3314); + public static Result.Base AesXtsFileStorageFileAllocationError => new Result.Base(ModuleFs, 3315); + public static Result.Base AesXtsFileSubStorageAllocationError => new Result.Base(ModuleFs, 3383); + public static Result.Base MmcAccessFailed { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 3500, 3999); } + public static Result.Base DataCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4000, 4999); } - public static Result.Base RomCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4001, 4299); } - public static Result.Base InvalidIndirectStorageSource => new Result.Base(ModuleFs, 4023); - public static Result.Base RomHostFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4241, 4259); } - public static Result.Base RomHostEntryCorrupted => new Result.Base(ModuleFs, 4242); - public static Result.Base RomHostFileDataCorrupted => new Result.Base(ModuleFs, 4243); - public static Result.Base RomHostFileCorrupted => new Result.Base(ModuleFs, 4244); - public static Result.Base InvalidRomHostHandle => new Result.Base(ModuleFs, 4245); - public static Result.Base SaveDataCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4301, 4499); } - public static Result.Base Result4302 => new Result.Base(ModuleFs, 4302); - public static Result.Base InvalidSaveDataEntryType => new Result.Base(ModuleFs, 4303); - public static Result.Base InvalidSaveDataHeader => new Result.Base(ModuleFs, 4315); - public static Result.Base Result4362 => new Result.Base(ModuleFs, 4362); - public static Result.Base Result4363 => new Result.Base(ModuleFs, 4363); - public static Result.Base InvalidHashInSaveIvfc => new Result.Base(ModuleFs, 4364); - public static Result.Base SaveIvfcHashIsEmpty => new Result.Base(ModuleFs, 4372); - public static Result.Base InvalidHashInSaveIvfcTopLayer => new Result.Base(ModuleFs, 4373); - public static Result.Base Result4402 => new Result.Base(ModuleFs, 4402); - public static Result.Base Result4427 => new Result.Base(ModuleFs, 4427); - public static Result.Base SaveDataHostFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4441, 4459); } - public static Result.Base SaveDataHostEntryCorrupted => new Result.Base(ModuleFs, 4442); - public static Result.Base SaveDataHostFileDataCorrupted => new Result.Base(ModuleFs, 4443); - public static Result.Base SaveDataHostFileCorrupted => new Result.Base(ModuleFs, 4444); - public static Result.Base InvalidSaveDataHostHandle => new Result.Base(ModuleFs, 4445); - public static Result.Base SaveDataAllocationTableCorrupted => new Result.Base(ModuleFs, 4462); - public static Result.Base SaveDataFileTableCorrupted => new Result.Base(ModuleFs, 4463); - public static Result.Base AllocationTableIteratedRangeEntry => new Result.Base(ModuleFs, 4464); - public static Result.Base NcaCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4501, 4599); } - public static Result.Base IntegrityVerificationStorageCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4601, 4639); } - public static Result.Base Result4602 => new Result.Base(ModuleFs, 4602); - public static Result.Base Result4603 => new Result.Base(ModuleFs, 4603); - public static Result.Base InvalidHashInIvfc => new Result.Base(ModuleFs, 4604); - public static Result.Base IvfcHashIsEmpty => new Result.Base(ModuleFs, 4612); - public static Result.Base InvalidHashInIvfcTopLayer => new Result.Base(ModuleFs, 4613); - public static Result.Base PartitionFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4641, 4659); } - public static Result.Base InvalidPartitionFileSystemHashOffset => new Result.Base(ModuleFs, 4642); - public static Result.Base InvalidPartitionFileSystemHash => new Result.Base(ModuleFs, 4643); - public static Result.Base InvalidPartitionFileSystemMagic => new Result.Base(ModuleFs, 4644); - public static Result.Base InvalidHashedPartitionFileSystemMagic => new Result.Base(ModuleFs, 4645); - public static Result.Base InvalidPartitionFileSystemEntryNameOffset => new Result.Base(ModuleFs, 4646); - public static Result.Base BuiltInStorageCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4661, 4679); } - public static Result.Base Result4662 => new Result.Base(ModuleFs, 4662); - public static Result.Base FatFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4681, 4699); } - public static Result.Base HostFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4701, 4719); } - public static Result.Base HostEntryCorrupted => new Result.Base(ModuleFs, 4702); - public static Result.Base HostFileDataCorrupted => new Result.Base(ModuleFs, 4703); - public static Result.Base HostFileCorrupted => new Result.Base(ModuleFs, 4704); - public static Result.Base InvalidHostHandle => new Result.Base(ModuleFs, 4705); - public static Result.Base DatabaseCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4721, 4739); } - public static Result.Base SaveDataAllocationTableCorruptedInternal => new Result.Base(ModuleFs, 4722); - public static Result.Base SaveDataFileTableCorruptedInternal => new Result.Base(ModuleFs, 4723); - public static Result.Base AllocationTableIteratedRangeEntryInternal => new Result.Base(ModuleFs, 4724); - public static Result.Base AesXtsFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4741, 4759); } - public static Result.Base AesXtsFileHeaderTooShort => new Result.Base(ModuleFs, 4742); - public static Result.Base AesXtsFileHeaderInvalidKeys => new Result.Base(ModuleFs, 4743); - public static Result.Base AesXtsFileHeaderInvalidMagic => new Result.Base(ModuleFs, 4744); - public static Result.Base AesXtsFileTooShort => new Result.Base(ModuleFs, 4745); - public static Result.Base AesXtsFileHeaderTooShortInSetSize => new Result.Base(ModuleFs, 4746); - public static Result.Base AesXtsFileHeaderInvalidKeysInRenameFile => new Result.Base(ModuleFs, 4747); - public static Result.Base AesXtsFileHeaderInvalidKeysInSetSize => new Result.Base(ModuleFs, 4748); - public static Result.Base SaveDataTransferDataCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4761, 4769); } - public static Result.Base SignedSystemPartitionDataCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4771, 4779); } - public static Result.Base GameCardLogoDataCorrupted => new Result.Base(ModuleFs, 4781); - public static Result.Base Range4811To4819 { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4811, 4819); } - public static Result.Base Result4812 => new Result.Base(ModuleFs, 4812); + public static Result.Base RomCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4001, 4299); } + public static Result.Base InvalidIndirectStorageSource => new Result.Base(ModuleFs, 4023); + + public static Result.Base RomHostFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4241, 4259); } + public static Result.Base RomHostEntryCorrupted => new Result.Base(ModuleFs, 4242); + public static Result.Base RomHostFileDataCorrupted => new Result.Base(ModuleFs, 4243); + public static Result.Base RomHostFileCorrupted => new Result.Base(ModuleFs, 4244); + public static Result.Base InvalidRomHostHandle => new Result.Base(ModuleFs, 4245); + + public static Result.Base SaveDataCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4301, 4499); } + public static Result.Base Result4302 => new Result.Base(ModuleFs, 4302); + public static Result.Base InvalidSaveDataEntryType => new Result.Base(ModuleFs, 4303); + public static Result.Base InvalidSaveDataHeader => new Result.Base(ModuleFs, 4315); + public static Result.Base Result4362 => new Result.Base(ModuleFs, 4362); + public static Result.Base Result4363 => new Result.Base(ModuleFs, 4363); + public static Result.Base InvalidHashInSaveIvfc => new Result.Base(ModuleFs, 4364); + public static Result.Base SaveIvfcHashIsEmpty => new Result.Base(ModuleFs, 4372); + public static Result.Base InvalidHashInSaveIvfcTopLayer => new Result.Base(ModuleFs, 4373); + public static Result.Base Result4402 => new Result.Base(ModuleFs, 4402); + public static Result.Base Result4427 => new Result.Base(ModuleFs, 4427); + + public static Result.Base SaveDataHostFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4441, 4459); } + public static Result.Base SaveDataHostEntryCorrupted => new Result.Base(ModuleFs, 4442); + public static Result.Base SaveDataHostFileDataCorrupted => new Result.Base(ModuleFs, 4443); + public static Result.Base SaveDataHostFileCorrupted => new Result.Base(ModuleFs, 4444); + public static Result.Base InvalidSaveDataHostHandle => new Result.Base(ModuleFs, 4445); + + public static Result.Base SaveDataAllocationTableCorrupted => new Result.Base(ModuleFs, 4462); + public static Result.Base SaveDataFileTableCorrupted => new Result.Base(ModuleFs, 4463); + public static Result.Base AllocationTableIteratedRangeEntry => new Result.Base(ModuleFs, 4464); + + public static Result.Base NcaCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4501, 4599); } + + public static Result.Base IntegrityVerificationStorageCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4601, 4639); } + public static Result.Base Result4602 => new Result.Base(ModuleFs, 4602); + public static Result.Base Result4603 => new Result.Base(ModuleFs, 4603); + public static Result.Base InvalidHashInIvfc => new Result.Base(ModuleFs, 4604); + public static Result.Base IvfcHashIsEmpty => new Result.Base(ModuleFs, 4612); + public static Result.Base InvalidHashInIvfcTopLayer => new Result.Base(ModuleFs, 4613); + + public static Result.Base PartitionFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4641, 4659); } + public static Result.Base InvalidPartitionFileSystemHashOffset => new Result.Base(ModuleFs, 4642); + public static Result.Base InvalidPartitionFileSystemHash => new Result.Base(ModuleFs, 4643); + public static Result.Base InvalidPartitionFileSystemMagic => new Result.Base(ModuleFs, 4644); + public static Result.Base InvalidHashedPartitionFileSystemMagic => new Result.Base(ModuleFs, 4645); + public static Result.Base InvalidPartitionFileSystemEntryNameOffset => new Result.Base(ModuleFs, 4646); + + public static Result.Base BuiltInStorageCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4661, 4679); } + public static Result.Base Result4662 => new Result.Base(ModuleFs, 4662); + + public static Result.Base FatFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4681, 4699); } + + public static Result.Base HostFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4701, 4719); } + public static Result.Base HostEntryCorrupted => new Result.Base(ModuleFs, 4702); + public static Result.Base HostFileDataCorrupted => new Result.Base(ModuleFs, 4703); + public static Result.Base HostFileCorrupted => new Result.Base(ModuleFs, 4704); + public static Result.Base InvalidHostHandle => new Result.Base(ModuleFs, 4705); + + public static Result.Base DatabaseCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4721, 4739); } + public static Result.Base SaveDataAllocationTableCorruptedInternal => new Result.Base(ModuleFs, 4722); + public static Result.Base SaveDataFileTableCorruptedInternal => new Result.Base(ModuleFs, 4723); + public static Result.Base AllocationTableIteratedRangeEntryInternal => new Result.Base(ModuleFs, 4724); + + public static Result.Base AesXtsFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4741, 4759); } + public static Result.Base AesXtsFileHeaderTooShort => new Result.Base(ModuleFs, 4742); + public static Result.Base AesXtsFileHeaderInvalidKeys => new Result.Base(ModuleFs, 4743); + public static Result.Base AesXtsFileHeaderInvalidMagic => new Result.Base(ModuleFs, 4744); + public static Result.Base AesXtsFileTooShort => new Result.Base(ModuleFs, 4745); + public static Result.Base AesXtsFileHeaderTooShortInSetSize => new Result.Base(ModuleFs, 4746); + public static Result.Base AesXtsFileHeaderInvalidKeysInRenameFile => new Result.Base(ModuleFs, 4747); + public static Result.Base AesXtsFileHeaderInvalidKeysInSetSize => new Result.Base(ModuleFs, 4748); + + public static Result.Base SaveDataTransferDataCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4761, 4769); } + + public static Result.Base SignedSystemPartitionDataCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4771, 4779); } + + public static Result.Base GameCardLogoDataCorrupted => new Result.Base(ModuleFs, 4781); + + public static Result.Base Range4811To4819 { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4811, 4819); } + public static Result.Base Result4812 => new Result.Base(ModuleFs, 4812); + public static Result.Base Unexpected { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 5000, 5999); } - public static Result.Base UnexpectedErrorInHostFileFlush => new Result.Base(ModuleFs, 5307); - public static Result.Base UnexpectedErrorInHostFileGetSize => new Result.Base(ModuleFs, 5308); - public static Result.Base UnknownHostFileSystemError => new Result.Base(ModuleFs, 5309); - public static Result.Base InvalidNcaMountPoint => new Result.Base(ModuleFs, 5320); + public static Result.Base UnexpectedErrorInHostFileFlush => new Result.Base(ModuleFs, 5307); + public static Result.Base UnexpectedErrorInHostFileGetSize => new Result.Base(ModuleFs, 5308); + public static Result.Base UnknownHostFileSystemError => new Result.Base(ModuleFs, 5309); + public static Result.Base InvalidNcaMountPoint => new Result.Base(ModuleFs, 5320); + public static Result.Base PreconditionViolation { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6000, 6499); } - public static Result.Base InvalidArgument { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6001, 6199); } - public static Result.Base InvalidPath { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6002, 6029); } - public static Result.Base TooLongPath => new Result.Base(ModuleFs, 6003); - public static Result.Base InvalidCharacter => new Result.Base(ModuleFs, 6004); - public static Result.Base InvalidPathFormat => new Result.Base(ModuleFs, 6005); - public static Result.Base DirectoryUnobtainable => new Result.Base(ModuleFs, 6006); - public static Result.Base NotNormalized => new Result.Base(ModuleFs, 6007); - public static Result.Base InvalidPathForOperation { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6030, 6059); } - public static Result.Base DirectoryNotDeletable => new Result.Base(ModuleFs, 6031); - public static Result.Base DestinationIsSubPathOfSource => new Result.Base(ModuleFs, 6032); - public static Result.Base PathNotFoundInSaveDataFileTable => new Result.Base(ModuleFs, 6033); - public static Result.Base DifferentDestFileSystem => new Result.Base(ModuleFs, 6034); - public static Result.Base InvalidOffset => new Result.Base(ModuleFs, 6061); - public static Result.Base InvalidSize => new Result.Base(ModuleFs, 6062); - public static Result.Base NullArgument => new Result.Base(ModuleFs, 6063); - public static Result.Base InvalidMountName => new Result.Base(ModuleFs, 6065); - public static Result.Base ExtensionSizeTooLarge => new Result.Base(ModuleFs, 6066); - public static Result.Base ExtensionSizeInvalid => new Result.Base(ModuleFs, 6067); - public static Result.Base ReadOldSaveDataInfoReader => new Result.Base(ModuleFs, 6068); - public static Result.Base InvalidEnumValue { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6080, 6099); } - public static Result.Base InvalidSaveDataState => new Result.Base(ModuleFs, 6081); - public static Result.Base InvalidSaveDataSpaceId => new Result.Base(ModuleFs, 6082); - public static Result.Base InvalidOperationForOpenMode { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6200, 6299); } - public static Result.Base FileExtensionWithoutOpenModeAllowAppend => new Result.Base(ModuleFs, 6201); - public static Result.Base InvalidOpenModeForRead => new Result.Base(ModuleFs, 6202); - public static Result.Base InvalidOpenModeForWrite => new Result.Base(ModuleFs, 6203); - public static Result.Base UnsupportedOperation { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6300, 6399); } - public static Result.Base SubStorageNotResizable => new Result.Base(ModuleFs, 6302); - public static Result.Base SubStorageNotResizableMiddleOfFile => new Result.Base(ModuleFs, 6303); - public static Result.Base UnsupportedOperationInMemoryStorageSetSize => new Result.Base(ModuleFs, 6304); - public static Result.Base UnsupportedOperationInFileStorageOperateRange => new Result.Base(ModuleFs, 6306); - public static Result.Base UnsupportedOperationInAesCtrExStorageWrite => new Result.Base(ModuleFs, 6310); - public static Result.Base UnsupportedOperationInHierarchicalIvfcStorageSetSize => new Result.Base(ModuleFs, 6316); - public static Result.Base UnsupportedOperationInIndirectStorageWrite => new Result.Base(ModuleFs, 6324); - public static Result.Base UnsupportedOperationInIndirectStorageSetSize => new Result.Base(ModuleFs, 6325); - public static Result.Base UnsupportedOperationInRoGameCardStorageWrite => new Result.Base(ModuleFs, 6350); - public static Result.Base UnsupportedOperationInRoGameCardStorageSetSize => new Result.Base(ModuleFs, 6351); - public static Result.Base UnsupportedOperationInConcatFsQueryEntry => new Result.Base(ModuleFs, 6359); - public static Result.Base UnsupportedOperationModifyRomFsFileSystem => new Result.Base(ModuleFs, 6364); - public static Result.Base UnsupportedOperationRomFsFileSystemGetSpace => new Result.Base(ModuleFs, 6366); - public static Result.Base UnsupportedOperationModifyRomFsFile => new Result.Base(ModuleFs, 6367); - public static Result.Base UnsupportedOperationModifyReadOnlyFileSystem => new Result.Base(ModuleFs, 6369); - public static Result.Base UnsupportedOperationReadOnlyFileSystemGetSpace => new Result.Base(ModuleFs, 6371); - public static Result.Base UnsupportedOperationModifyReadOnlyFile => new Result.Base(ModuleFs, 6372); - public static Result.Base UnsupportedOperationModifyPartitionFileSystem => new Result.Base(ModuleFs, 6374); - public static Result.Base UnsupportedOperationInPartitionFileSetSize => new Result.Base(ModuleFs, 6376); - public static Result.Base UnsupportedOperationIdInPartitionFileSystem => new Result.Base(ModuleFs, 6377); - public static Result.Base PermissionDenied { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6400, 6449); } - public static Result.Base ExternalKeyAlreadyRegistered => new Result.Base(ModuleFs, 6452); - public static Result.Base WriteStateUnflushed => new Result.Base(ModuleFs, 6454); - public static Result.Base WriteModeFileNotClosed => new Result.Base(ModuleFs, 6457); - public static Result.Base AllocatorAlignmentViolation => new Result.Base(ModuleFs, 6461); - public static Result.Base UserNotExist => new Result.Base(ModuleFs, 6465); + public static Result.Base InvalidArgument { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6001, 6199); } + public static Result.Base InvalidPath { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6002, 6029); } + public static Result.Base TooLongPath => new Result.Base(ModuleFs, 6003); + public static Result.Base InvalidCharacter => new Result.Base(ModuleFs, 6004); + public static Result.Base InvalidPathFormat => new Result.Base(ModuleFs, 6005); + public static Result.Base DirectoryUnobtainable => new Result.Base(ModuleFs, 6006); + public static Result.Base NotNormalized => new Result.Base(ModuleFs, 6007); + + public static Result.Base InvalidPathForOperation { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6030, 6059); } + public static Result.Base DirectoryNotDeletable => new Result.Base(ModuleFs, 6031); + public static Result.Base DestinationIsSubPathOfSource => new Result.Base(ModuleFs, 6032); + public static Result.Base PathNotFoundInSaveDataFileTable => new Result.Base(ModuleFs, 6033); + public static Result.Base DifferentDestFileSystem => new Result.Base(ModuleFs, 6034); + + public static Result.Base InvalidOffset => new Result.Base(ModuleFs, 6061); + public static Result.Base InvalidSize => new Result.Base(ModuleFs, 6062); + public static Result.Base NullArgument => new Result.Base(ModuleFs, 6063); + public static Result.Base InvalidMountName => new Result.Base(ModuleFs, 6065); + public static Result.Base ExtensionSizeTooLarge => new Result.Base(ModuleFs, 6066); + public static Result.Base ExtensionSizeInvalid => new Result.Base(ModuleFs, 6067); + public static Result.Base ReadOldSaveDataInfoReader => new Result.Base(ModuleFs, 6068); + + public static Result.Base InvalidEnumValue { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6080, 6099); } + public static Result.Base InvalidSaveDataState => new Result.Base(ModuleFs, 6081); + public static Result.Base InvalidSaveDataSpaceId => new Result.Base(ModuleFs, 6082); + + public static Result.Base InvalidOperationForOpenMode { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6200, 6299); } + public static Result.Base FileExtensionWithoutOpenModeAllowAppend => new Result.Base(ModuleFs, 6201); + public static Result.Base InvalidOpenModeForRead => new Result.Base(ModuleFs, 6202); + public static Result.Base InvalidOpenModeForWrite => new Result.Base(ModuleFs, 6203); + + public static Result.Base UnsupportedOperation { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6300, 6399); } + public static Result.Base SubStorageNotResizable => new Result.Base(ModuleFs, 6302); + public static Result.Base SubStorageNotResizableMiddleOfFile => new Result.Base(ModuleFs, 6303); + public static Result.Base UnsupportedOperationInMemoryStorageSetSize => new Result.Base(ModuleFs, 6304); + public static Result.Base UnsupportedOperationInFileStorageOperateRange => new Result.Base(ModuleFs, 6306); + public static Result.Base UnsupportedOperationInAesCtrExStorageWrite => new Result.Base(ModuleFs, 6310); + public static Result.Base UnsupportedOperationInHierarchicalIvfcStorageSetSize => new Result.Base(ModuleFs, 6316); + public static Result.Base UnsupportedOperationInIndirectStorageWrite => new Result.Base(ModuleFs, 6324); + public static Result.Base UnsupportedOperationInIndirectStorageSetSize => new Result.Base(ModuleFs, 6325); + public static Result.Base UnsupportedOperationInRoGameCardStorageWrite => new Result.Base(ModuleFs, 6350); + public static Result.Base UnsupportedOperationInRoGameCardStorageSetSize => new Result.Base(ModuleFs, 6351); + public static Result.Base UnsupportedOperationInConcatFsQueryEntry => new Result.Base(ModuleFs, 6359); + public static Result.Base UnsupportedOperationModifyRomFsFileSystem => new Result.Base(ModuleFs, 6364); + public static Result.Base UnsupportedOperationRomFsFileSystemGetSpace => new Result.Base(ModuleFs, 6366); + public static Result.Base UnsupportedOperationModifyRomFsFile => new Result.Base(ModuleFs, 6367); + public static Result.Base UnsupportedOperationModifyReadOnlyFileSystem => new Result.Base(ModuleFs, 6369); + public static Result.Base UnsupportedOperationReadOnlyFileSystemGetSpace => new Result.Base(ModuleFs, 6371); + public static Result.Base UnsupportedOperationModifyReadOnlyFile => new Result.Base(ModuleFs, 6372); + public static Result.Base UnsupportedOperationModifyPartitionFileSystem => new Result.Base(ModuleFs, 6374); + public static Result.Base UnsupportedOperationInPartitionFileSetSize => new Result.Base(ModuleFs, 6376); + public static Result.Base UnsupportedOperationIdInPartitionFileSystem => new Result.Base(ModuleFs, 6377); + + public static Result.Base PermissionDenied { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6400, 6449); } + + public static Result.Base ExternalKeyAlreadyRegistered => new Result.Base(ModuleFs, 6452); + public static Result.Base WriteStateUnflushed => new Result.Base(ModuleFs, 6454); + public static Result.Base WriteModeFileNotClosed => new Result.Base(ModuleFs, 6457); + public static Result.Base AllocatorAlignmentViolation => new Result.Base(ModuleFs, 6461); + public static Result.Base UserNotExist => new Result.Base(ModuleFs, 6465); + public static Result.Base EntryNotFound { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6600, 6699); } + public static Result.Base OutOfResource { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6700, 6799); } - public static Result.Base MappingTableFull => new Result.Base(ModuleFs, 6706); - public static Result.Base AllocationTableInsufficientFreeBlocks => new Result.Base(ModuleFs, 6707); - public static Result.Base OpenCountLimit => new Result.Base(ModuleFs, 6709); + public static Result.Base MappingTableFull => new Result.Base(ModuleFs, 6706); + public static Result.Base AllocationTableInsufficientFreeBlocks => new Result.Base(ModuleFs, 6707); + public static Result.Base OpenCountLimit => new Result.Base(ModuleFs, 6709); + public static Result.Base MappingFailed { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6800, 6899); } - public static Result.Base RemapStorageMapFull => new Result.Base(ModuleFs, 6811); + public static Result.Base RemapStorageMapFull => new Result.Base(ModuleFs, 6811); + public static Result.Base BadState { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6900, 6999); } - public static Result.Base SubStorageNotInitialized => new Result.Base(ModuleFs, 6902); - public static Result.Base NotMounted => new Result.Base(ModuleFs, 6905); - public static Result.Base SaveDataIsExtending => new Result.Base(ModuleFs, 6906); + public static Result.Base SubStorageNotInitialized => new Result.Base(ModuleFs, 6902); + public static Result.Base NotMounted => new Result.Base(ModuleFs, 6905); + public static Result.Base SaveDataIsExtending => new Result.Base(ModuleFs, 6906); } } diff --git a/src/LibHac/Result.cs b/src/LibHac/Result.cs index a189c463..f4e49af4 100644 --- a/src/LibHac/Result.cs +++ b/src/LibHac/Result.cs @@ -233,8 +233,8 @@ namespace LibHac public Base(int module, int descriptionStart, int descriptionEnd) { Debug.Assert(ModuleBegin <= module && module < ModuleEnd, "Invalid Module"); - Debug.Assert(DescriptionBegin <= descriptionStart && descriptionStart < DescriptionEnd, "Invalid Description"); - Debug.Assert(DescriptionBegin <= descriptionEnd && descriptionEnd < DescriptionEnd, "Invalid Description"); + Debug.Assert(DescriptionBegin <= descriptionStart && descriptionStart < DescriptionEnd, "Invalid Description Start"); + Debug.Assert(DescriptionBegin <= descriptionEnd && descriptionEnd < DescriptionEnd, "Invalid Description End"); Debug.Assert(descriptionStart <= descriptionEnd, "descriptionStart must be <= descriptionEnd"); _value = SetBitsValueLong(module, ModuleBitsOffset, ModuleBitsCount) | From 53c8dceb871a25ad53773d158afbb3bce098b9e5 Mon Sep 17 00:00:00 2001 From: Alex Barney Date: Wed, 26 Feb 2020 14:45:58 -0700 Subject: [PATCH 4/6] Add XML docs and a header to the Result files --- build/CodeGen/ResultCodegen.cs | 45 ++- build/CodeGen/results.csv | 410 ++++++++++++++-------------- src/LibHac/Fs/ResultFs.cs | 189 ++++++++++++- src/LibHac/FsService/ResultSdmmc.cs | 15 +- src/LibHac/Kvdb/ResultKvdb.cs | 18 +- 5 files changed, 468 insertions(+), 209 deletions(-) diff --git a/build/CodeGen/ResultCodegen.cs b/build/CodeGen/ResultCodegen.cs index dd777069..e5bd5c00 100644 --- a/build/CodeGen/ResultCodegen.cs +++ b/build/CodeGen/ResultCodegen.cs @@ -157,6 +157,9 @@ namespace LibHacBuild.CodeGen { var sb = new IndentingStringBuilder(); + sb.AppendLine(GetHeader()); + sb.AppendLine(); + if (module.NeedsAggressiveInlining) { sb.AppendLine("using System.Runtime.CompilerServices;"); @@ -225,7 +228,7 @@ namespace LibHacBuild.CodeGen descriptionArgs = $"{result.DescriptionStart}"; } - // sb.AppendLine($"/// Error code: {result.ErrorCode}; Inner value: 0x{result.InnerValue:x}"); + sb.AppendLine(GetXmlDoc(result)); string resultCtor = $"new Result.Base(Module{moduleName}, {descriptionArgs});"; sb.Append($"public static Result.Base {result.Name} "); @@ -240,6 +243,44 @@ namespace LibHacBuild.CodeGen } } + private static string GetXmlDoc(ResultInfo result) + { + string doc = "/// "; + + if (!string.IsNullOrWhiteSpace(result.Summary)) + { + doc += $"{result.Summary}
"; + } + + doc += $"Error code: {result.ErrorCode}"; + + if (result.IsRange) + { + doc += $"; Range: {result.DescriptionStart}-{result.DescriptionEnd}"; + } + + doc += $"; Inner value: 0x{result.InnerValue:x}"; + doc += "
"; + + return doc; + } + + private static string GetHeader() + { + string nl = Environment.NewLine; + return + "//-----------------------------------------------------------------------------" + nl + + "// This file was automatically generated." + nl + + "// Changes to this file will be lost when the file is regenerated." + nl + + "//" + nl + + "// To change this file, modify /build/CodeGen/results.csv at the root of this" + nl + + "// repo and run the build script." + nl + + "//" + nl + + "// The script can be run with the \"codegen\" option to run only the" + nl + + "// code generation portion of the build." + nl + + "//-----------------------------------------------------------------------------"; + } + // Write the file only if it has changed // Preserve the UTF-8 BOM usage if the file already exists private static void WriteOutput(ModuleInfo module, string text) @@ -379,6 +420,7 @@ namespace LibHacBuild.CodeGen public int DescriptionStart { get; set; } public int DescriptionEnd { get; set; } public string Name { get; set; } + public string Summary { get; set; } public bool IsRange => DescriptionStart != DescriptionEnd; public string ErrorCode => $"{2000 + Module:d4}-{DescriptionStart:d4}"; @@ -391,6 +433,7 @@ namespace LibHacBuild.CodeGen { Map(m => m.Module); Map(m => m.Name); + Map(m => m.Summary); Map(m => m.DescriptionStart); Map(m => m.DescriptionEnd).ConvertUsing(row => { diff --git a/build/CodeGen/results.csv b/build/CodeGen/results.csv index c26e8a7f..c95aa55b 100644 --- a/build/CodeGen/results.csv +++ b/build/CodeGen/results.csv @@ -1,245 +1,245 @@ -Module,DescriptionStart,DescriptionEnd,Name -2,0,999,HandledByAllProcess -2,1,,PathNotFound -2,2,,PathAlreadyExists -2,7,,TargetLocked -2,8,,DirectoryNotEmpty -2,13,,DirectoryStatusChanged +Module,DescriptionStart,DescriptionEnd,Name,Summary +2,0,999,HandledByAllProcess, +2,1,,PathNotFound,Specified path does not exist +2,2,,PathAlreadyExists,Specified path already exists +2,7,,TargetLocked,Resource already in use (file already opened, savedata filesystem already mounted) +2,8,,DirectoryNotEmpty,Specified directory is not empty when trying to delete it +2,13,,DirectoryStatusChanged, -2,30,45,InsufficientFreeSpace -2,31,,UsableSpaceNotEnoughForSaveData -2,34,38,InsufficientFreeSpaceBis -2,35,,InsufficientFreeSpaceBisCalibration -2,36,,InsufficientFreeSpaceBisSafe -2,37,,InsufficientFreeSpaceBisUser -2,38,,InsufficientFreeSpaceBisSystem -2,39,,InsufficientFreeSpaceSdCard -2,50,,UnsupportedSdkVersion -2,60,,MountNameAlreadyExists +2,30,45,InsufficientFreeSpace, +2,31,,UsableSpaceNotEnoughForSaveData, +2,34,38,InsufficientFreeSpaceBis, +2,35,,InsufficientFreeSpaceBisCalibration, +2,36,,InsufficientFreeSpaceBisSafe, +2,37,,InsufficientFreeSpaceBisUser, +2,38,,InsufficientFreeSpaceBisSystem, +2,39,,InsufficientFreeSpaceSdCard, +2,50,,UnsupportedSdkVersion, +2,60,,MountNameAlreadyExists, -2,1001,,PartitionNotFound -2,1002,,TargetNotFound -2,1004,,ExternalKeyNotFound +2,1001,,PartitionNotFound, +2,1002,,TargetNotFound, +2,1004,,ExternalKeyNotFound,The requested external key was not found -2,2000,2499,SdCardAccessFailed -2,2001,,SdCardNotFound -2,2004,,SdCardAsleep +2,2000,2499,SdCardAccessFailed, +2,2001,,SdCardNotFound, +2,2004,,SdCardAsleep, -2,2500,2999,GameCardAccessFailed -2,2503,,InvalidBufferForGameCard -2,2520,,GameCardNotInserted -2,2951,,GameCardNotInsertedOnGetHandle -2,2952,,InvalidGameCardHandleOnRead -2,2954,,InvalidGameCardHandleOnGetCardInfo -2,2960,,InvalidGameCardHandleOnOpenNormalPartition -2,2961,,InvalidGameCardHandleOnOpenSecurePartition +2,2500,2999,GameCardAccessFailed, +2,2503,,InvalidBufferForGameCard, +2,2520,,GameCardNotInserted, +2,2951,,GameCardNotInsertedOnGetHandle, +2,2952,,InvalidGameCardHandleOnRead, +2,2954,,InvalidGameCardHandleOnGetCardInfo, +2,2960,,InvalidGameCardHandleOnOpenNormalPartition, +2,2961,,InvalidGameCardHandleOnOpenSecurePartition, -2,3001,,NotImplemented -2,3002,, -2,3003,,SaveDataPathAlreadyExists -2,3005,,OutOfRange +2,3001,,NotImplemented, +2,3002,,, +2,3003,,SaveDataPathAlreadyExists, +2,3005,,OutOfRange, -2,3200,3499,AllocationMemoryFailed -2,3312,,AesXtsFileFileStorageAllocationError -2,3313,,AesXtsFileXtsStorageAllocationError -2,3314,,AesXtsFileAlignmentStorageAllocationError -2,3315,,AesXtsFileStorageFileAllocationError -2,3383,,AesXtsFileSubStorageAllocationError +2,3200,3499,AllocationMemoryFailed, +2,3312,,AesXtsFileFileStorageAllocationError, +2,3313,,AesXtsFileXtsStorageAllocationError, +2,3314,,AesXtsFileAlignmentStorageAllocationError, +2,3315,,AesXtsFileStorageFileAllocationError, +2,3383,,AesXtsFileSubStorageAllocationError, -2,3500,3999,MmcAccessFailed +2,3500,3999,MmcAccessFailed, -2,4000,4999,DataCorrupted -2,4001,4299,RomCorrupted -2,4023,,InvalidIndirectStorageSource +2,4000,4999,DataCorrupted, +2,4001,4299,RomCorrupted, +2,4023,,InvalidIndirectStorageSource, -2,4241,4259,RomHostFileSystemCorrupted -2,4242,,RomHostEntryCorrupted -2,4243,,RomHostFileDataCorrupted -2,4244,,RomHostFileCorrupted -2,4245,,InvalidRomHostHandle +2,4241,4259,RomHostFileSystemCorrupted, +2,4242,,RomHostEntryCorrupted, +2,4243,,RomHostFileDataCorrupted, +2,4244,,RomHostFileCorrupted, +2,4245,,InvalidRomHostHandle, -2,4301,4499,SaveDataCorrupted -2,4302,, -2,4303,,InvalidSaveDataEntryType -2,4315,,InvalidSaveDataHeader -2,4362,, -2,4363,, -2,4364,,InvalidHashInSaveIvfc -2,4372,,SaveIvfcHashIsEmpty -2,4373,,InvalidHashInSaveIvfcTopLayer +2,4301,4499,SaveDataCorrupted, +2,4302,,, +2,4303,,InvalidSaveDataEntryType, +2,4315,,InvalidSaveDataHeader, +2,4362,,, +2,4363,,, +2,4364,,InvalidHashInSaveIvfc, +2,4372,,SaveIvfcHashIsEmpty, +2,4373,,InvalidHashInSaveIvfcTopLayer, -2,4402,, -2,4427,, -2,4441,4459,SaveDataHostFileSystemCorrupted -2,4442,,SaveDataHostEntryCorrupted -2,4443,,SaveDataHostFileDataCorrupted -2,4444,,SaveDataHostFileCorrupted -2,4445,,InvalidSaveDataHostHandle +2,4402,,, +2,4427,,, +2,4441,4459,SaveDataHostFileSystemCorrupted, +2,4442,,SaveDataHostEntryCorrupted, +2,4443,,SaveDataHostFileDataCorrupted, +2,4444,,SaveDataHostFileCorrupted, +2,4445,,InvalidSaveDataHostHandle, -2,4462,,SaveDataAllocationTableCorrupted -2,4463,,SaveDataFileTableCorrupted -2,4464,,AllocationTableIteratedRangeEntry +2,4462,,SaveDataAllocationTableCorrupted, +2,4463,,SaveDataFileTableCorrupted, +2,4464,,AllocationTableIteratedRangeEntry, -2,4501,4599,NcaCorrupted +2,4501,4599,NcaCorrupted, -2,4601,4639,IntegrityVerificationStorageCorrupted -2,4602,, -2,4603,, -2,4604,,InvalidHashInIvfc -2,4612,,IvfcHashIsEmpty -2,4613,,InvalidHashInIvfcTopLayer +2,4601,4639,IntegrityVerificationStorageCorrupted, +2,4602,,, +2,4603,,, +2,4604,,InvalidHashInIvfc, +2,4612,,IvfcHashIsEmpty, +2,4613,,InvalidHashInIvfcTopLayer, -2,4641,4659,PartitionFileSystemCorrupted -2,4642,,InvalidPartitionFileSystemHashOffset -2,4643,,InvalidPartitionFileSystemHash -2,4644,,InvalidPartitionFileSystemMagic -2,4645,,InvalidHashedPartitionFileSystemMagic -2,4646,,InvalidPartitionFileSystemEntryNameOffset +2,4641,4659,PartitionFileSystemCorrupted, +2,4642,,InvalidPartitionFileSystemHashOffset, +2,4643,,InvalidPartitionFileSystemHash, +2,4644,,InvalidPartitionFileSystemMagic, +2,4645,,InvalidHashedPartitionFileSystemMagic, +2,4646,,InvalidPartitionFileSystemEntryNameOffset, -2,4661,4679,BuiltInStorageCorrupted -2,4662,, +2,4661,4679,BuiltInStorageCorrupted, +2,4662,,, -2,4681,4699,FatFileSystemCorrupted +2,4681,4699,FatFileSystemCorrupted, -2,4701,4719,HostFileSystemCorrupted -2,4702,,HostEntryCorrupted -2,4703,,HostFileDataCorrupted -2,4704,,HostFileCorrupted -2,4705,,InvalidHostHandle +2,4701,4719,HostFileSystemCorrupted, +2,4702,,HostEntryCorrupted, +2,4703,,HostFileDataCorrupted, +2,4704,,HostFileCorrupted, +2,4705,,InvalidHostHandle, -2,4721,4739,DatabaseCorrupted -2,4722,,SaveDataAllocationTableCorruptedInternal -2,4723,,SaveDataFileTableCorruptedInternal -2,4724,,AllocationTableIteratedRangeEntryInternal +2,4721,4739,DatabaseCorrupted, +2,4722,,SaveDataAllocationTableCorruptedInternal, +2,4723,,SaveDataFileTableCorruptedInternal, +2,4724,,AllocationTableIteratedRangeEntryInternal, -2,4741,4759,AesXtsFileSystemCorrupted -2,4742,,AesXtsFileHeaderTooShort -2,4743,,AesXtsFileHeaderInvalidKeys -2,4744,,AesXtsFileHeaderInvalidMagic -2,4745,,AesXtsFileTooShort -2,4746,,AesXtsFileHeaderTooShortInSetSize -2,4747,,AesXtsFileHeaderInvalidKeysInRenameFile -2,4748,,AesXtsFileHeaderInvalidKeysInSetSize +2,4741,4759,AesXtsFileSystemCorrupted, +2,4742,,AesXtsFileHeaderTooShort, +2,4743,,AesXtsFileHeaderInvalidKeys, +2,4744,,AesXtsFileHeaderInvalidMagic, +2,4745,,AesXtsFileTooShort, +2,4746,,AesXtsFileHeaderTooShortInSetSize, +2,4747,,AesXtsFileHeaderInvalidKeysInRenameFile, +2,4748,,AesXtsFileHeaderInvalidKeysInSetSize, -2,4761,4769,SaveDataTransferDataCorrupted -2,4771,4779,SignedSystemPartitionDataCorrupted -2,4781,,GameCardLogoDataCorrupted +2,4761,4769,SaveDataTransferDataCorrupted, +2,4771,4779,SignedSystemPartitionDataCorrupted, +2,4781,,GameCardLogoDataCorrupted, -2,4811,4819, -2,4812,, +2,4811,4819,, +2,4812,,, -2,5000,5999,Unexpected -2,5307,,UnexpectedErrorInHostFileFlush -2,5308,,UnexpectedErrorInHostFileGetSize -2,5309,,UnknownHostFileSystemError -2,5320,,InvalidNcaMountPoint +2,5000,5999,Unexpected, +2,5307,,UnexpectedErrorInHostFileFlush, +2,5308,,UnexpectedErrorInHostFileGetSize, +2,5309,,UnknownHostFileSystemError, +2,5320,,InvalidNcaMountPoint, -2,6000,6499,PreconditionViolation -2,6001,6199,InvalidArgument -2,6002,6029,InvalidPath -2,6003,,TooLongPath -2,6004,,InvalidCharacter -2,6005,,InvalidPathFormat -2,6006,,DirectoryUnobtainable -2,6007,,NotNormalized +2,6000,6499,PreconditionViolation, +2,6001,6199,InvalidArgument, +2,6002,6029,InvalidPath, +2,6003,,TooLongPath, +2,6004,,InvalidCharacter, +2,6005,,InvalidPathFormat, +2,6006,,DirectoryUnobtainable, +2,6007,,NotNormalized, -2,6030,6059,InvalidPathForOperation -2,6031,,DirectoryNotDeletable -2,6032,,DestinationIsSubPathOfSource -2,6033,,PathNotFoundInSaveDataFileTable -2,6034,,DifferentDestFileSystem +2,6030,6059,InvalidPathForOperation, +2,6031,,DirectoryNotDeletable, +2,6032,,DestinationIsSubPathOfSource, +2,6033,,PathNotFoundInSaveDataFileTable, +2,6034,,DifferentDestFileSystem, -2,6061,,InvalidOffset -2,6062,,InvalidSize -2,6063,,NullArgument -2,6065,,InvalidMountName -2,6066,,ExtensionSizeTooLarge -2,6067,,ExtensionSizeInvalid -2,6068,,ReadOldSaveDataInfoReader +2,6061,,InvalidOffset, +2,6062,,InvalidSize, +2,6063,,NullArgument, +2,6065,,InvalidMountName, +2,6066,,ExtensionSizeTooLarge, +2,6067,,ExtensionSizeInvalid, +2,6068,,ReadOldSaveDataInfoReader, -2,6080,6099,InvalidEnumValue -2,6081,,InvalidSaveDataState -2,6082,,InvalidSaveDataSpaceId +2,6080,6099,InvalidEnumValue, +2,6081,,InvalidSaveDataState, +2,6082,,InvalidSaveDataSpaceId, -2,6200,6299,InvalidOperationForOpenMode -2,6201,,FileExtensionWithoutOpenModeAllowAppend -2,6202,,InvalidOpenModeForRead -2,6203,,InvalidOpenModeForWrite +2,6200,6299,InvalidOperationForOpenMode, +2,6201,,FileExtensionWithoutOpenModeAllowAppend, +2,6202,,InvalidOpenModeForRead, +2,6203,,InvalidOpenModeForWrite, -2,6300,6399,UnsupportedOperation -2,6302,,SubStorageNotResizable -2,6303,,SubStorageNotResizableMiddleOfFile -2,6304,,UnsupportedOperationInMemoryStorageSetSize -2,6306,,UnsupportedOperationInFileStorageOperateRange -2,6310,,UnsupportedOperationInAesCtrExStorageWrite -2,6316,,UnsupportedOperationInHierarchicalIvfcStorageSetSize -2,6324,,UnsupportedOperationInIndirectStorageWrite -2,6325,,UnsupportedOperationInIndirectStorageSetSize -2,6350,,UnsupportedOperationInRoGameCardStorageWrite -2,6351,,UnsupportedOperationInRoGameCardStorageSetSize -2,6359,,UnsupportedOperationInConcatFsQueryEntry -2,6364,,UnsupportedOperationModifyRomFsFileSystem -2,6366,,UnsupportedOperationRomFsFileSystemGetSpace -2,6367,,UnsupportedOperationModifyRomFsFile -2,6369,,UnsupportedOperationModifyReadOnlyFileSystem -2,6371,,UnsupportedOperationReadOnlyFileSystemGetSpace -2,6372,,UnsupportedOperationModifyReadOnlyFile -2,6374,,UnsupportedOperationModifyPartitionFileSystem -2,6376,,UnsupportedOperationInPartitionFileSetSize -2,6377,,UnsupportedOperationIdInPartitionFileSystem +2,6300,6399,UnsupportedOperation, +2,6302,,SubStorageNotResizable, +2,6303,,SubStorageNotResizableMiddleOfFile, +2,6304,,UnsupportedOperationInMemoryStorageSetSize, +2,6306,,UnsupportedOperationInFileStorageOperateRange, +2,6310,,UnsupportedOperationInAesCtrExStorageWrite, +2,6316,,UnsupportedOperationInHierarchicalIvfcStorageSetSize, +2,6324,,UnsupportedOperationInIndirectStorageWrite, +2,6325,,UnsupportedOperationInIndirectStorageSetSize, +2,6350,,UnsupportedOperationInRoGameCardStorageWrite, +2,6351,,UnsupportedOperationInRoGameCardStorageSetSize, +2,6359,,UnsupportedOperationInConcatFsQueryEntry, +2,6364,,UnsupportedOperationModifyRomFsFileSystem, +2,6366,,UnsupportedOperationRomFsFileSystemGetSpace, +2,6367,,UnsupportedOperationModifyRomFsFile, +2,6369,,UnsupportedOperationModifyReadOnlyFileSystem, +2,6371,,UnsupportedOperationReadOnlyFileSystemGetSpace, +2,6372,,UnsupportedOperationModifyReadOnlyFile, +2,6374,,UnsupportedOperationModifyPartitionFileSystem, +2,6376,,UnsupportedOperationInPartitionFileSetSize, +2,6377,,UnsupportedOperationIdInPartitionFileSystem, -2,6400,6449,PermissionDenied +2,6400,6449,PermissionDenied, -2,6452,,ExternalKeyAlreadyRegistered -2,6454,,WriteStateUnflushed -2,6457,,WriteModeFileNotClosed -2,6461,,AllocatorAlignmentViolation -2,6465,,UserNotExist +2,6452,,ExternalKeyAlreadyRegistered, +2,6454,,WriteStateUnflushed, +2,6457,,WriteModeFileNotClosed, +2,6461,,AllocatorAlignmentViolation, +2,6465,,UserNotExist, -2,6600,6699,EntryNotFound -2,6700,6799,OutOfResource -2,6706,,MappingTableFull -2,6707,,AllocationTableInsufficientFreeBlocks -2,6709,,OpenCountLimit +2,6600,6699,EntryNotFound, +2,6700,6799,OutOfResource, +2,6706,,MappingTableFull, +2,6707,,AllocationTableInsufficientFreeBlocks, +2,6709,,OpenCountLimit, -2,6800,6899,MappingFailed -2,6811,,RemapStorageMapFull +2,6800,6899,MappingFailed, +2,6811,,RemapStorageMapFull, -2,6900,6999,BadState -2,6902,,SubStorageNotInitialized -2,6905,,NotMounted -2,6906,,SaveDataIsExtending +2,6900,6999,BadState, +2,6902,,SubStorageNotInitialized, +2,6905,,NotMounted, +2,6906,,SaveDataIsExtending, -20,1,,TooLargeKeyOrDbFull -20,2,,KeyNotFound -20,4,,AllocationFailed -20,5,,InvalidKeyValue -20,6,,BufferInsufficient +20,1,,TooLargeKeyOrDbFull, +20,2,,KeyNotFound, +20,4,,AllocationFailed, +20,5,,InvalidKeyValue, +20,6,,BufferInsufficient, -24,1,,DeviceNotFound -24,4,,DeviceAsleep +24,1,,DeviceNotFound, +24,4,,DeviceAsleep, -123,0,4999,SslService +123,0,4999,SslService, -124,0,,Cancelled -124,1,,CancelledByUser -124,100,,UserNotExist -124,200,269,NetworkServiceAccountUnavailable -124,430,499,TokenCacheUnavailable -124,3000,8191,NetworkCommunicationError +124,0,,Cancelled, +124,1,,CancelledByUser, +124,100,,UserNotExist, +124,200,269,NetworkServiceAccountUnavailable, +124,430,499,TokenCacheUnavailable, +124,3000,8191,NetworkCommunicationError, -202,140,149,Invalid -202,601,,DualConnected -202,602,,SameJoyTypeConnected -202,603,,ColorNotAvailable -202,604,,ControllerNotConnected -202,3101,,Canceled -202,3102,,NotSupportedNpadStyle -202,3200,3209,ControllerFirmwareUpdateError -202,3201,,ControllerFirmwareUpdateFailed +202,140,149,Invalid, +202,601,,DualConnected, +202,602,,SameJoyTypeConnected, +202,603,,ColorNotAvailable, +202,604,,ControllerNotConnected, +202,3101,,Canceled, +202,3102,,NotSupportedNpadStyle, +202,3200,3209,ControllerFirmwareUpdateError, +202,3201,,ControllerFirmwareUpdateFailed, -205,110,119,IrsensorUnavailable -205,110,,IrsensorUnconnected -205,111,,IrsensorUnsupported -205,120,,IrsensorNotReady -205,122,139,IrsensorDeviceError \ No newline at end of file +205,110,119,IrsensorUnavailable, +205,110,,IrsensorUnconnected, +205,111,,IrsensorUnsupported, +205,120,,IrsensorNotReady, +205,122,139,IrsensorDeviceError, \ No newline at end of file diff --git a/src/LibHac/Fs/ResultFs.cs b/src/LibHac/Fs/ResultFs.cs index a9a25766..2e67f58a 100644 --- a/src/LibHac/Fs/ResultFs.cs +++ b/src/LibHac/Fs/ResultFs.cs @@ -1,4 +1,15 @@ -using System.Runtime.CompilerServices; +//----------------------------------------------------------------------------- +// This file was automatically generated. +// Changes to this file will be lost when the file is regenerated. +// +// To change this file, modify /build/CodeGen/results.csv at the root of this +// repo and run the build script. +// +// The script can be run with the "codegen" option to run only the +// code generation portion of the build. +//----------------------------------------------------------------------------- + +using System.Runtime.CompilerServices; namespace LibHac.Fs { @@ -6,221 +17,397 @@ namespace LibHac.Fs { public const int ModuleFs = 2; + /// Error code: 2002-0000; Range: 0-999; Inner value: 0x2 public static Result.Base HandledByAllProcess => new Result.Base(ModuleFs, 0, 999); + /// Specified path does not exist
Error code: 2002-0001; Inner value: 0x202
public static Result.Base PathNotFound => new Result.Base(ModuleFs, 1); + /// Specified path already exists
Error code: 2002-0002; Inner value: 0x402
public static Result.Base PathAlreadyExists => new Result.Base(ModuleFs, 2); + /// Resource already in use (file already opened
Error code: 2002-0007; Inner value: 0xe02
public static Result.Base TargetLocked => new Result.Base(ModuleFs, 7); + /// Specified directory is not empty when trying to delete it
Error code: 2002-0008; Inner value: 0x1002
public static Result.Base DirectoryNotEmpty => new Result.Base(ModuleFs, 8); + /// Error code: 2002-0013; Inner value: 0x1a02 public static Result.Base DirectoryStatusChanged => new Result.Base(ModuleFs, 13); + /// Error code: 2002-0030; Range: 30-45; Inner value: 0x3c02 public static Result.Base InsufficientFreeSpace => new Result.Base(ModuleFs, 30, 45); + /// Error code: 2002-0031; Inner value: 0x3e02 public static Result.Base UsableSpaceNotEnoughForSaveData => new Result.Base(ModuleFs, 31); + /// Error code: 2002-0034; Range: 34-38; Inner value: 0x4402 public static Result.Base InsufficientFreeSpaceBis => new Result.Base(ModuleFs, 34, 38); + /// Error code: 2002-0035; Inner value: 0x4602 public static Result.Base InsufficientFreeSpaceBisCalibration => new Result.Base(ModuleFs, 35); + /// Error code: 2002-0036; Inner value: 0x4802 public static Result.Base InsufficientFreeSpaceBisSafe => new Result.Base(ModuleFs, 36); + /// Error code: 2002-0037; Inner value: 0x4a02 public static Result.Base InsufficientFreeSpaceBisUser => new Result.Base(ModuleFs, 37); + /// Error code: 2002-0038; Inner value: 0x4c02 public static Result.Base InsufficientFreeSpaceBisSystem => new Result.Base(ModuleFs, 38); + /// Error code: 2002-0039; Inner value: 0x4e02 public static Result.Base InsufficientFreeSpaceSdCard => new Result.Base(ModuleFs, 39); + /// Error code: 2002-0050; Inner value: 0x6402 public static Result.Base UnsupportedSdkVersion => new Result.Base(ModuleFs, 50); + /// Error code: 2002-0060; Inner value: 0x7802 public static Result.Base MountNameAlreadyExists => new Result.Base(ModuleFs, 60); + /// Error code: 2002-1001; Inner value: 0x7d202 public static Result.Base PartitionNotFound => new Result.Base(ModuleFs, 1001); + /// Error code: 2002-1002; Inner value: 0x7d402 public static Result.Base TargetNotFound => new Result.Base(ModuleFs, 1002); + /// The requested external key was not found
Error code: 2002-1004; Inner value: 0x7d802
public static Result.Base ExternalKeyNotFound => new Result.Base(ModuleFs, 1004); + /// Error code: 2002-2000; Range: 2000-2499; Inner value: 0xfa002 public static Result.Base SdCardAccessFailed { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 2000, 2499); } + /// Error code: 2002-2001; Inner value: 0xfa202 public static Result.Base SdCardNotFound => new Result.Base(ModuleFs, 2001); + /// Error code: 2002-2004; Inner value: 0xfa802 public static Result.Base SdCardAsleep => new Result.Base(ModuleFs, 2004); + /// Error code: 2002-2500; Range: 2500-2999; Inner value: 0x138802 public static Result.Base GameCardAccessFailed { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 2500, 2999); } + /// Error code: 2002-2503; Inner value: 0x138e02 public static Result.Base InvalidBufferForGameCard => new Result.Base(ModuleFs, 2503); + /// Error code: 2002-2520; Inner value: 0x13b002 public static Result.Base GameCardNotInserted => new Result.Base(ModuleFs, 2520); + /// Error code: 2002-2951; Inner value: 0x170e02 public static Result.Base GameCardNotInsertedOnGetHandle => new Result.Base(ModuleFs, 2951); + /// Error code: 2002-2952; Inner value: 0x171002 public static Result.Base InvalidGameCardHandleOnRead => new Result.Base(ModuleFs, 2952); + /// Error code: 2002-2954; Inner value: 0x171402 public static Result.Base InvalidGameCardHandleOnGetCardInfo => new Result.Base(ModuleFs, 2954); + /// Error code: 2002-2960; Inner value: 0x172002 public static Result.Base InvalidGameCardHandleOnOpenNormalPartition => new Result.Base(ModuleFs, 2960); + /// Error code: 2002-2961; Inner value: 0x172202 public static Result.Base InvalidGameCardHandleOnOpenSecurePartition => new Result.Base(ModuleFs, 2961); + /// Error code: 2002-3001; Inner value: 0x177202 public static Result.Base NotImplemented => new Result.Base(ModuleFs, 3001); + /// Error code: 2002-3002; Inner value: 0x177402 public static Result.Base Result3002 => new Result.Base(ModuleFs, 3002); + /// Error code: 2002-3003; Inner value: 0x177602 public static Result.Base SaveDataPathAlreadyExists => new Result.Base(ModuleFs, 3003); + /// Error code: 2002-3005; Inner value: 0x177a02 public static Result.Base OutOfRange => new Result.Base(ModuleFs, 3005); + /// Error code: 2002-3200; Range: 3200-3499; Inner value: 0x190002 public static Result.Base AllocationMemoryFailed { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 3200, 3499); } + /// Error code: 2002-3312; Inner value: 0x19e002 public static Result.Base AesXtsFileFileStorageAllocationError => new Result.Base(ModuleFs, 3312); + /// Error code: 2002-3313; Inner value: 0x19e202 public static Result.Base AesXtsFileXtsStorageAllocationError => new Result.Base(ModuleFs, 3313); + /// Error code: 2002-3314; Inner value: 0x19e402 public static Result.Base AesXtsFileAlignmentStorageAllocationError => new Result.Base(ModuleFs, 3314); + /// Error code: 2002-3315; Inner value: 0x19e602 public static Result.Base AesXtsFileStorageFileAllocationError => new Result.Base(ModuleFs, 3315); + /// Error code: 2002-3383; Inner value: 0x1a6e02 public static Result.Base AesXtsFileSubStorageAllocationError => new Result.Base(ModuleFs, 3383); + /// Error code: 2002-3500; Range: 3500-3999; Inner value: 0x1b5802 public static Result.Base MmcAccessFailed { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 3500, 3999); } + /// Error code: 2002-4000; Range: 4000-4999; Inner value: 0x1f4002 public static Result.Base DataCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4000, 4999); } + /// Error code: 2002-4001; Range: 4001-4299; Inner value: 0x1f4202 public static Result.Base RomCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4001, 4299); } + /// Error code: 2002-4023; Inner value: 0x1f6e02 public static Result.Base InvalidIndirectStorageSource => new Result.Base(ModuleFs, 4023); + /// Error code: 2002-4241; Range: 4241-4259; Inner value: 0x212202 public static Result.Base RomHostFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4241, 4259); } + /// Error code: 2002-4242; Inner value: 0x212402 public static Result.Base RomHostEntryCorrupted => new Result.Base(ModuleFs, 4242); + /// Error code: 2002-4243; Inner value: 0x212602 public static Result.Base RomHostFileDataCorrupted => new Result.Base(ModuleFs, 4243); + /// Error code: 2002-4244; Inner value: 0x212802 public static Result.Base RomHostFileCorrupted => new Result.Base(ModuleFs, 4244); + /// Error code: 2002-4245; Inner value: 0x212a02 public static Result.Base InvalidRomHostHandle => new Result.Base(ModuleFs, 4245); + /// Error code: 2002-4301; Range: 4301-4499; Inner value: 0x219a02 public static Result.Base SaveDataCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4301, 4499); } + /// Error code: 2002-4302; Inner value: 0x219c02 public static Result.Base Result4302 => new Result.Base(ModuleFs, 4302); + /// Error code: 2002-4303; Inner value: 0x219e02 public static Result.Base InvalidSaveDataEntryType => new Result.Base(ModuleFs, 4303); + /// Error code: 2002-4315; Inner value: 0x21b602 public static Result.Base InvalidSaveDataHeader => new Result.Base(ModuleFs, 4315); + /// Error code: 2002-4362; Inner value: 0x221402 public static Result.Base Result4362 => new Result.Base(ModuleFs, 4362); + /// Error code: 2002-4363; Inner value: 0x221602 public static Result.Base Result4363 => new Result.Base(ModuleFs, 4363); + /// Error code: 2002-4364; Inner value: 0x221802 public static Result.Base InvalidHashInSaveIvfc => new Result.Base(ModuleFs, 4364); + /// Error code: 2002-4372; Inner value: 0x222802 public static Result.Base SaveIvfcHashIsEmpty => new Result.Base(ModuleFs, 4372); + /// Error code: 2002-4373; Inner value: 0x222a02 public static Result.Base InvalidHashInSaveIvfcTopLayer => new Result.Base(ModuleFs, 4373); + /// Error code: 2002-4402; Inner value: 0x226402 public static Result.Base Result4402 => new Result.Base(ModuleFs, 4402); + /// Error code: 2002-4427; Inner value: 0x229602 public static Result.Base Result4427 => new Result.Base(ModuleFs, 4427); + /// Error code: 2002-4441; Range: 4441-4459; Inner value: 0x22b202 public static Result.Base SaveDataHostFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4441, 4459); } + /// Error code: 2002-4442; Inner value: 0x22b402 public static Result.Base SaveDataHostEntryCorrupted => new Result.Base(ModuleFs, 4442); + /// Error code: 2002-4443; Inner value: 0x22b602 public static Result.Base SaveDataHostFileDataCorrupted => new Result.Base(ModuleFs, 4443); + /// Error code: 2002-4444; Inner value: 0x22b802 public static Result.Base SaveDataHostFileCorrupted => new Result.Base(ModuleFs, 4444); + /// Error code: 2002-4445; Inner value: 0x22ba02 public static Result.Base InvalidSaveDataHostHandle => new Result.Base(ModuleFs, 4445); + /// Error code: 2002-4462; Inner value: 0x22dc02 public static Result.Base SaveDataAllocationTableCorrupted => new Result.Base(ModuleFs, 4462); + /// Error code: 2002-4463; Inner value: 0x22de02 public static Result.Base SaveDataFileTableCorrupted => new Result.Base(ModuleFs, 4463); + /// Error code: 2002-4464; Inner value: 0x22e002 public static Result.Base AllocationTableIteratedRangeEntry => new Result.Base(ModuleFs, 4464); + /// Error code: 2002-4501; Range: 4501-4599; Inner value: 0x232a02 public static Result.Base NcaCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4501, 4599); } + /// Error code: 2002-4601; Range: 4601-4639; Inner value: 0x23f202 public static Result.Base IntegrityVerificationStorageCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4601, 4639); } + /// Error code: 2002-4602; Inner value: 0x23f402 public static Result.Base Result4602 => new Result.Base(ModuleFs, 4602); + /// Error code: 2002-4603; Inner value: 0x23f602 public static Result.Base Result4603 => new Result.Base(ModuleFs, 4603); + /// Error code: 2002-4604; Inner value: 0x23f802 public static Result.Base InvalidHashInIvfc => new Result.Base(ModuleFs, 4604); + /// Error code: 2002-4612; Inner value: 0x240802 public static Result.Base IvfcHashIsEmpty => new Result.Base(ModuleFs, 4612); + /// Error code: 2002-4613; Inner value: 0x240a02 public static Result.Base InvalidHashInIvfcTopLayer => new Result.Base(ModuleFs, 4613); + /// Error code: 2002-4641; Range: 4641-4659; Inner value: 0x244202 public static Result.Base PartitionFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4641, 4659); } + /// Error code: 2002-4642; Inner value: 0x244402 public static Result.Base InvalidPartitionFileSystemHashOffset => new Result.Base(ModuleFs, 4642); + /// Error code: 2002-4643; Inner value: 0x244602 public static Result.Base InvalidPartitionFileSystemHash => new Result.Base(ModuleFs, 4643); + /// Error code: 2002-4644; Inner value: 0x244802 public static Result.Base InvalidPartitionFileSystemMagic => new Result.Base(ModuleFs, 4644); + /// Error code: 2002-4645; Inner value: 0x244a02 public static Result.Base InvalidHashedPartitionFileSystemMagic => new Result.Base(ModuleFs, 4645); + /// Error code: 2002-4646; Inner value: 0x244c02 public static Result.Base InvalidPartitionFileSystemEntryNameOffset => new Result.Base(ModuleFs, 4646); + /// Error code: 2002-4661; Range: 4661-4679; Inner value: 0x246a02 public static Result.Base BuiltInStorageCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4661, 4679); } + /// Error code: 2002-4662; Inner value: 0x246c02 public static Result.Base Result4662 => new Result.Base(ModuleFs, 4662); + /// Error code: 2002-4681; Range: 4681-4699; Inner value: 0x249202 public static Result.Base FatFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4681, 4699); } + /// Error code: 2002-4701; Range: 4701-4719; Inner value: 0x24ba02 public static Result.Base HostFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4701, 4719); } + /// Error code: 2002-4702; Inner value: 0x24bc02 public static Result.Base HostEntryCorrupted => new Result.Base(ModuleFs, 4702); + /// Error code: 2002-4703; Inner value: 0x24be02 public static Result.Base HostFileDataCorrupted => new Result.Base(ModuleFs, 4703); + /// Error code: 2002-4704; Inner value: 0x24c002 public static Result.Base HostFileCorrupted => new Result.Base(ModuleFs, 4704); + /// Error code: 2002-4705; Inner value: 0x24c202 public static Result.Base InvalidHostHandle => new Result.Base(ModuleFs, 4705); + /// Error code: 2002-4721; Range: 4721-4739; Inner value: 0x24e202 public static Result.Base DatabaseCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4721, 4739); } + /// Error code: 2002-4722; Inner value: 0x24e402 public static Result.Base SaveDataAllocationTableCorruptedInternal => new Result.Base(ModuleFs, 4722); + /// Error code: 2002-4723; Inner value: 0x24e602 public static Result.Base SaveDataFileTableCorruptedInternal => new Result.Base(ModuleFs, 4723); + /// Error code: 2002-4724; Inner value: 0x24e802 public static Result.Base AllocationTableIteratedRangeEntryInternal => new Result.Base(ModuleFs, 4724); + /// Error code: 2002-4741; Range: 4741-4759; Inner value: 0x250a02 public static Result.Base AesXtsFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4741, 4759); } + /// Error code: 2002-4742; Inner value: 0x250c02 public static Result.Base AesXtsFileHeaderTooShort => new Result.Base(ModuleFs, 4742); + /// Error code: 2002-4743; Inner value: 0x250e02 public static Result.Base AesXtsFileHeaderInvalidKeys => new Result.Base(ModuleFs, 4743); + /// Error code: 2002-4744; Inner value: 0x251002 public static Result.Base AesXtsFileHeaderInvalidMagic => new Result.Base(ModuleFs, 4744); + /// Error code: 2002-4745; Inner value: 0x251202 public static Result.Base AesXtsFileTooShort => new Result.Base(ModuleFs, 4745); + /// Error code: 2002-4746; Inner value: 0x251402 public static Result.Base AesXtsFileHeaderTooShortInSetSize => new Result.Base(ModuleFs, 4746); + /// Error code: 2002-4747; Inner value: 0x251602 public static Result.Base AesXtsFileHeaderInvalidKeysInRenameFile => new Result.Base(ModuleFs, 4747); + /// Error code: 2002-4748; Inner value: 0x251802 public static Result.Base AesXtsFileHeaderInvalidKeysInSetSize => new Result.Base(ModuleFs, 4748); + /// Error code: 2002-4761; Range: 4761-4769; Inner value: 0x253202 public static Result.Base SaveDataTransferDataCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4761, 4769); } + /// Error code: 2002-4771; Range: 4771-4779; Inner value: 0x254602 public static Result.Base SignedSystemPartitionDataCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4771, 4779); } + /// Error code: 2002-4781; Inner value: 0x255a02 public static Result.Base GameCardLogoDataCorrupted => new Result.Base(ModuleFs, 4781); + /// Error code: 2002-4811; Range: 4811-4819; Inner value: 0x259602 public static Result.Base Range4811To4819 { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4811, 4819); } + /// Error code: 2002-4812; Inner value: 0x259802 public static Result.Base Result4812 => new Result.Base(ModuleFs, 4812); + /// Error code: 2002-5000; Range: 5000-5999; Inner value: 0x271002 public static Result.Base Unexpected { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 5000, 5999); } + /// Error code: 2002-5307; Inner value: 0x297602 public static Result.Base UnexpectedErrorInHostFileFlush => new Result.Base(ModuleFs, 5307); + /// Error code: 2002-5308; Inner value: 0x297802 public static Result.Base UnexpectedErrorInHostFileGetSize => new Result.Base(ModuleFs, 5308); + /// Error code: 2002-5309; Inner value: 0x297a02 public static Result.Base UnknownHostFileSystemError => new Result.Base(ModuleFs, 5309); + /// Error code: 2002-5320; Inner value: 0x299002 public static Result.Base InvalidNcaMountPoint => new Result.Base(ModuleFs, 5320); + /// Error code: 2002-6000; Range: 6000-6499; Inner value: 0x2ee002 public static Result.Base PreconditionViolation { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6000, 6499); } + /// Error code: 2002-6001; Range: 6001-6199; Inner value: 0x2ee202 public static Result.Base InvalidArgument { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6001, 6199); } + /// Error code: 2002-6002; Range: 6002-6029; Inner value: 0x2ee402 public static Result.Base InvalidPath { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6002, 6029); } + /// Error code: 2002-6003; Inner value: 0x2ee602 public static Result.Base TooLongPath => new Result.Base(ModuleFs, 6003); + /// Error code: 2002-6004; Inner value: 0x2ee802 public static Result.Base InvalidCharacter => new Result.Base(ModuleFs, 6004); + /// Error code: 2002-6005; Inner value: 0x2eea02 public static Result.Base InvalidPathFormat => new Result.Base(ModuleFs, 6005); + /// Error code: 2002-6006; Inner value: 0x2eec02 public static Result.Base DirectoryUnobtainable => new Result.Base(ModuleFs, 6006); + /// Error code: 2002-6007; Inner value: 0x2eee02 public static Result.Base NotNormalized => new Result.Base(ModuleFs, 6007); + /// Error code: 2002-6030; Range: 6030-6059; Inner value: 0x2f1c02 public static Result.Base InvalidPathForOperation { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6030, 6059); } + /// Error code: 2002-6031; Inner value: 0x2f1e02 public static Result.Base DirectoryNotDeletable => new Result.Base(ModuleFs, 6031); + /// Error code: 2002-6032; Inner value: 0x2f2002 public static Result.Base DestinationIsSubPathOfSource => new Result.Base(ModuleFs, 6032); + /// Error code: 2002-6033; Inner value: 0x2f2202 public static Result.Base PathNotFoundInSaveDataFileTable => new Result.Base(ModuleFs, 6033); + /// Error code: 2002-6034; Inner value: 0x2f2402 public static Result.Base DifferentDestFileSystem => new Result.Base(ModuleFs, 6034); + /// Error code: 2002-6061; Inner value: 0x2f5a02 public static Result.Base InvalidOffset => new Result.Base(ModuleFs, 6061); + /// Error code: 2002-6062; Inner value: 0x2f5c02 public static Result.Base InvalidSize => new Result.Base(ModuleFs, 6062); + /// Error code: 2002-6063; Inner value: 0x2f5e02 public static Result.Base NullArgument => new Result.Base(ModuleFs, 6063); + /// Error code: 2002-6065; Inner value: 0x2f6202 public static Result.Base InvalidMountName => new Result.Base(ModuleFs, 6065); + /// Error code: 2002-6066; Inner value: 0x2f6402 public static Result.Base ExtensionSizeTooLarge => new Result.Base(ModuleFs, 6066); + /// Error code: 2002-6067; Inner value: 0x2f6602 public static Result.Base ExtensionSizeInvalid => new Result.Base(ModuleFs, 6067); + /// Error code: 2002-6068; Inner value: 0x2f6802 public static Result.Base ReadOldSaveDataInfoReader => new Result.Base(ModuleFs, 6068); + /// Error code: 2002-6080; Range: 6080-6099; Inner value: 0x2f8002 public static Result.Base InvalidEnumValue { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6080, 6099); } + /// Error code: 2002-6081; Inner value: 0x2f8202 public static Result.Base InvalidSaveDataState => new Result.Base(ModuleFs, 6081); + /// Error code: 2002-6082; Inner value: 0x2f8402 public static Result.Base InvalidSaveDataSpaceId => new Result.Base(ModuleFs, 6082); + /// Error code: 2002-6200; Range: 6200-6299; Inner value: 0x307002 public static Result.Base InvalidOperationForOpenMode { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6200, 6299); } + /// Error code: 2002-6201; Inner value: 0x307202 public static Result.Base FileExtensionWithoutOpenModeAllowAppend => new Result.Base(ModuleFs, 6201); + /// Error code: 2002-6202; Inner value: 0x307402 public static Result.Base InvalidOpenModeForRead => new Result.Base(ModuleFs, 6202); + /// Error code: 2002-6203; Inner value: 0x307602 public static Result.Base InvalidOpenModeForWrite => new Result.Base(ModuleFs, 6203); + /// Error code: 2002-6300; Range: 6300-6399; Inner value: 0x313802 public static Result.Base UnsupportedOperation { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6300, 6399); } + /// Error code: 2002-6302; Inner value: 0x313c02 public static Result.Base SubStorageNotResizable => new Result.Base(ModuleFs, 6302); + /// Error code: 2002-6303; Inner value: 0x313e02 public static Result.Base SubStorageNotResizableMiddleOfFile => new Result.Base(ModuleFs, 6303); + /// Error code: 2002-6304; Inner value: 0x314002 public static Result.Base UnsupportedOperationInMemoryStorageSetSize => new Result.Base(ModuleFs, 6304); + /// Error code: 2002-6306; Inner value: 0x314402 public static Result.Base UnsupportedOperationInFileStorageOperateRange => new Result.Base(ModuleFs, 6306); + /// Error code: 2002-6310; Inner value: 0x314c02 public static Result.Base UnsupportedOperationInAesCtrExStorageWrite => new Result.Base(ModuleFs, 6310); + /// Error code: 2002-6316; Inner value: 0x315802 public static Result.Base UnsupportedOperationInHierarchicalIvfcStorageSetSize => new Result.Base(ModuleFs, 6316); + /// Error code: 2002-6324; Inner value: 0x316802 public static Result.Base UnsupportedOperationInIndirectStorageWrite => new Result.Base(ModuleFs, 6324); + /// Error code: 2002-6325; Inner value: 0x316a02 public static Result.Base UnsupportedOperationInIndirectStorageSetSize => new Result.Base(ModuleFs, 6325); + /// Error code: 2002-6350; Inner value: 0x319c02 public static Result.Base UnsupportedOperationInRoGameCardStorageWrite => new Result.Base(ModuleFs, 6350); + /// Error code: 2002-6351; Inner value: 0x319e02 public static Result.Base UnsupportedOperationInRoGameCardStorageSetSize => new Result.Base(ModuleFs, 6351); + /// Error code: 2002-6359; Inner value: 0x31ae02 public static Result.Base UnsupportedOperationInConcatFsQueryEntry => new Result.Base(ModuleFs, 6359); + /// Error code: 2002-6364; Inner value: 0x31b802 public static Result.Base UnsupportedOperationModifyRomFsFileSystem => new Result.Base(ModuleFs, 6364); + /// Error code: 2002-6366; Inner value: 0x31bc02 public static Result.Base UnsupportedOperationRomFsFileSystemGetSpace => new Result.Base(ModuleFs, 6366); + /// Error code: 2002-6367; Inner value: 0x31be02 public static Result.Base UnsupportedOperationModifyRomFsFile => new Result.Base(ModuleFs, 6367); + /// Error code: 2002-6369; Inner value: 0x31c202 public static Result.Base UnsupportedOperationModifyReadOnlyFileSystem => new Result.Base(ModuleFs, 6369); + /// Error code: 2002-6371; Inner value: 0x31c602 public static Result.Base UnsupportedOperationReadOnlyFileSystemGetSpace => new Result.Base(ModuleFs, 6371); + /// Error code: 2002-6372; Inner value: 0x31c802 public static Result.Base UnsupportedOperationModifyReadOnlyFile => new Result.Base(ModuleFs, 6372); + /// Error code: 2002-6374; Inner value: 0x31cc02 public static Result.Base UnsupportedOperationModifyPartitionFileSystem => new Result.Base(ModuleFs, 6374); + /// Error code: 2002-6376; Inner value: 0x31d002 public static Result.Base UnsupportedOperationInPartitionFileSetSize => new Result.Base(ModuleFs, 6376); + /// Error code: 2002-6377; Inner value: 0x31d202 public static Result.Base UnsupportedOperationIdInPartitionFileSystem => new Result.Base(ModuleFs, 6377); + /// Error code: 2002-6400; Range: 6400-6449; Inner value: 0x320002 public static Result.Base PermissionDenied { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6400, 6449); } + /// Error code: 2002-6452; Inner value: 0x326802 public static Result.Base ExternalKeyAlreadyRegistered => new Result.Base(ModuleFs, 6452); + /// Error code: 2002-6454; Inner value: 0x326c02 public static Result.Base WriteStateUnflushed => new Result.Base(ModuleFs, 6454); + /// Error code: 2002-6457; Inner value: 0x327202 public static Result.Base WriteModeFileNotClosed => new Result.Base(ModuleFs, 6457); + /// Error code: 2002-6461; Inner value: 0x327a02 public static Result.Base AllocatorAlignmentViolation => new Result.Base(ModuleFs, 6461); + /// Error code: 2002-6465; Inner value: 0x328202 public static Result.Base UserNotExist => new Result.Base(ModuleFs, 6465); + /// Error code: 2002-6600; Range: 6600-6699; Inner value: 0x339002 public static Result.Base EntryNotFound { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6600, 6699); } + /// Error code: 2002-6700; Range: 6700-6799; Inner value: 0x345802 public static Result.Base OutOfResource { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6700, 6799); } + /// Error code: 2002-6706; Inner value: 0x346402 public static Result.Base MappingTableFull => new Result.Base(ModuleFs, 6706); + /// Error code: 2002-6707; Inner value: 0x346602 public static Result.Base AllocationTableInsufficientFreeBlocks => new Result.Base(ModuleFs, 6707); + /// Error code: 2002-6709; Inner value: 0x346a02 public static Result.Base OpenCountLimit => new Result.Base(ModuleFs, 6709); + /// Error code: 2002-6800; Range: 6800-6899; Inner value: 0x352002 public static Result.Base MappingFailed { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6800, 6899); } + /// Error code: 2002-6811; Inner value: 0x353602 public static Result.Base RemapStorageMapFull => new Result.Base(ModuleFs, 6811); + /// Error code: 2002-6900; Range: 6900-6999; Inner value: 0x35e802 public static Result.Base BadState { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6900, 6999); } + /// Error code: 2002-6902; Inner value: 0x35ec02 public static Result.Base SubStorageNotInitialized => new Result.Base(ModuleFs, 6902); + /// Error code: 2002-6905; Inner value: 0x35f202 public static Result.Base NotMounted => new Result.Base(ModuleFs, 6905); + /// Error code: 2002-6906; Inner value: 0x35f402 public static Result.Base SaveDataIsExtending => new Result.Base(ModuleFs, 6906); } } diff --git a/src/LibHac/FsService/ResultSdmmc.cs b/src/LibHac/FsService/ResultSdmmc.cs index 482132f3..db51c668 100644 --- a/src/LibHac/FsService/ResultSdmmc.cs +++ b/src/LibHac/FsService/ResultSdmmc.cs @@ -1,10 +1,23 @@ -namespace LibHac.FsService +//----------------------------------------------------------------------------- +// This file was automatically generated. +// Changes to this file will be lost when the file is regenerated. +// +// To change this file, modify /build/CodeGen/results.csv at the root of this +// repo and run the build script. +// +// The script can be run with the "codegen" option to run only the +// code generation portion of the build. +//----------------------------------------------------------------------------- + +namespace LibHac.FsService { public static class ResultSdmmc { public const int ModuleSdmmc = 24; + /// Error code: 2024-0001; Inner value: 0x218 public static Result.Base DeviceNotFound => new Result.Base(ModuleSdmmc, 1); + /// Error code: 2024-0004; Inner value: 0x818 public static Result.Base DeviceAsleep => new Result.Base(ModuleSdmmc, 4); } } diff --git a/src/LibHac/Kvdb/ResultKvdb.cs b/src/LibHac/Kvdb/ResultKvdb.cs index 5c677e34..3eece918 100644 --- a/src/LibHac/Kvdb/ResultKvdb.cs +++ b/src/LibHac/Kvdb/ResultKvdb.cs @@ -1,13 +1,29 @@ -namespace LibHac.Kvdb +//----------------------------------------------------------------------------- +// This file was automatically generated. +// Changes to this file will be lost when the file is regenerated. +// +// To change this file, modify /build/CodeGen/results.csv at the root of this +// repo and run the build script. +// +// The script can be run with the "codegen" option to run only the +// code generation portion of the build. +//----------------------------------------------------------------------------- + +namespace LibHac.Kvdb { public static class ResultKvdb { public const int ModuleKvdb = 20; + /// Error code: 2020-0001; Inner value: 0x214 public static Result.Base TooLargeKeyOrDbFull => new Result.Base(ModuleKvdb, 1); + /// Error code: 2020-0002; Inner value: 0x414 public static Result.Base KeyNotFound => new Result.Base(ModuleKvdb, 2); + /// Error code: 2020-0004; Inner value: 0x814 public static Result.Base AllocationFailed => new Result.Base(ModuleKvdb, 4); + /// Error code: 2020-0005; Inner value: 0xa14 public static Result.Base InvalidKeyValue => new Result.Base(ModuleKvdb, 5); + /// Error code: 2020-0006; Inner value: 0xc14 public static Result.Base BufferInsufficient => new Result.Base(ModuleKvdb, 6); } } From 14dd2190a5b3b3831b083b9c9b85bd00e2b6906c Mon Sep 17 00:00:00 2001 From: Alex Barney Date: Thu, 27 Feb 2020 00:42:53 -0700 Subject: [PATCH 5/6] Add a default, reflection-less Result name resolver --- .gitignore | 2 + build/CodeGen/ResultCodegen.cs | 192 +++++++++++++++++++---- src/LibHac/LibHac.csproj | 4 + src/LibHac/Result.cs | 2 +- src/LibHac/ResultNameResolver.Archive.cs | 15 ++ src/LibHac/ResultNameResolver.cs | 79 ++++++++++ src/hactoolnet/Program.cs | 2 - 7 files changed, 265 insertions(+), 31 deletions(-) create mode 100644 src/LibHac/ResultNameResolver.Archive.cs create mode 100644 src/LibHac/ResultNameResolver.cs diff --git a/.gitignore b/.gitignore index aca4195e..961d8cf4 100644 --- a/.gitignore +++ b/.gitignore @@ -266,3 +266,5 @@ global.json !tests/LibHac.Tests/CryptoTests/TestVectors/* **/DisasmoBin/ + +ResultNameResolver.Generated.cs \ No newline at end of file diff --git a/build/CodeGen/ResultCodegen.cs b/build/CodeGen/ResultCodegen.cs index e5bd5c00..6ca773b2 100644 --- a/build/CodeGen/ResultCodegen.cs +++ b/build/CodeGen/ResultCodegen.cs @@ -5,6 +5,8 @@ using System.Globalization; using System.IO; using System.Linq; using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; using System.Text; using CsvHelper; using CsvHelper.Configuration; @@ -25,14 +27,17 @@ namespace LibHacBuild.CodeGen ValidateResults(modules); ValidateHierarchy(modules); CheckIfAggressiveInliningNeeded(modules); - SetOutputPaths(modules); foreach (ModuleInfo module in modules) { string moduleResultFile = PrintModule(module); - WriteOutput(module, moduleResultFile); + WriteOutput(module.Path, moduleResultFile); } + + byte[] archive = BuildArchive(modules); + string archiveStr = PrintArchive(archive); + WriteOutput("LibHac/ResultNameResolver.Generated.cs", archiveStr); } private static ModuleInfo[] ReadResults() @@ -72,16 +77,21 @@ namespace LibHacBuild.CodeGen { foreach (ModuleInfo module in modules) { - foreach (ResultInfo result in module.Results.Where(x => string.IsNullOrWhiteSpace(x.Name))) + foreach (ResultInfo result in module.Results) { - if (result.IsRange) + result.FullName = $"Result{module.Name}{result.Name}"; + + if (string.IsNullOrWhiteSpace(result.Name)) { - result.Name += $"Range{result.DescriptionStart}To{result.DescriptionEnd}"; - } - else - { - result.Name = $"Result{result.DescriptionStart}"; - result.DescriptionEnd = result.DescriptionStart; + if (result.IsRange) + { + result.Name += $"Range{result.DescriptionStart}To{result.DescriptionEnd}"; + } + else + { + result.Name = $"Result{result.DescriptionStart}"; + result.DescriptionEnd = result.DescriptionStart; + } } } } @@ -143,16 +153,6 @@ namespace LibHacBuild.CodeGen } } - private static void SetOutputPaths(ModuleInfo[] modules) - { - string rootPath = FindProjectDirectory(); - - foreach (ModuleInfo module in modules.Where(x => !string.IsNullOrWhiteSpace(x.Path))) - { - module.FullPath = Path.Combine(rootPath, module.Path); - } - } - private static string PrintModule(ModuleInfo module) { var sb = new IndentingStringBuilder(); @@ -283,19 +283,22 @@ namespace LibHacBuild.CodeGen // Write the file only if it has changed // Preserve the UTF-8 BOM usage if the file already exists - private static void WriteOutput(ModuleInfo module, string text) + private static void WriteOutput(string relativePath, string text) { - if (string.IsNullOrWhiteSpace(module.FullPath)) + if (string.IsNullOrWhiteSpace(relativePath)) return; + string rootPath = FindProjectDirectory(); + string fullPath = Path.Combine(rootPath, relativePath); + // Default is true because Visual Studio saves .cs files with the BOM by default bool hasBom = true; byte[] bom = Encoding.UTF8.GetPreamble(); byte[] oldFile = null; - if (File.Exists(module.FullPath)) + if (File.Exists(fullPath)) { - oldFile = File.ReadAllBytes(module.FullPath); + oldFile = File.ReadAllBytes(fullPath); if (oldFile.Length >= 3) hasBom = oldFile.AsSpan(0, 3).SequenceEqual(bom); @@ -305,12 +308,66 @@ namespace LibHacBuild.CodeGen if (oldFile?.SequenceEqual(newFile) == true) { - Logger.Normal($"{module.Path} is already up-to-date"); + Logger.Normal($"{relativePath} is already up-to-date"); return; } - Logger.Normal($"Generated file {module.Path}"); - File.WriteAllBytes(module.FullPath, newFile); + Logger.Normal($"Generated file {relativePath}"); + File.WriteAllBytes(fullPath, newFile); + } + + private static byte[] BuildArchive(ModuleInfo[] modules) + { + var builder = new ResultArchiveBuilder(); + + foreach (ModuleInfo module in modules.OrderBy(x => x.Index)) + { + foreach (ResultInfo result in module.Results.OrderBy(x => x.DescriptionStart)) + { + builder.Add(result); + } + } + + return builder.Build(); + } + + private static string PrintArchive(ReadOnlySpan data) + { + var sb = new IndentingStringBuilder(); + + sb.AppendLine(GetHeader()); + sb.AppendLine(); + + sb.AppendLine("using System;"); + sb.AppendLine(); + + sb.AppendLine("namespace LibHac"); + sb.AppendLineAndIncrease("{"); + + sb.AppendLine("internal partial class ResultNameResolver"); + sb.AppendLineAndIncrease("{"); + + sb.AppendLine("private static ReadOnlySpan ArchiveData => new byte[]"); + sb.AppendLineAndIncrease("{"); + + for (int i = 0; i < data.Length; i++) + { + if (i % 16 != 0) sb.Append(" "); + sb.Append($"0x{data[i]:x2}"); + + if (i != data.Length - 1) + { + sb.Append(","); + if (i % 16 == 15) sb.AppendLine(); + } + } + + sb.AppendLine(); + sb.DecreaseAndAppendLine("};"); + sb.DecreaseAndAppendLine("}"); + sb.DecreaseAndAppendLine("}"); + + return sb.ToString(); } private static T[] ReadCsv(string name) @@ -387,6 +444,85 @@ namespace LibHacBuild.CodeGen } } + public class ResultArchiveBuilder + { + private List Results = new List(); + + public void Add(ResultInfo result) + { + Results.Add(result); + } + + public byte[] Build() + { + int tableOffset = CalculateNameTableOffset(); + var archive = new byte[tableOffset + CalculateNameTableSize()]; + + ref HeaderStruct header = ref Unsafe.As(ref archive[0]); + Span elements = MemoryMarshal.Cast( + archive.AsSpan(Unsafe.SizeOf(), Results.Count * Unsafe.SizeOf())); + Span nameTable = archive.AsSpan(tableOffset); + + header.ElementCount = Results.Count; + header.NameTableOffset = tableOffset; + + int curNameOffset = 0; + + for (int i = 0; i < Results.Count; i++) + { + ResultInfo result = Results[i]; + ref Element element = ref elements[i]; + + element.NameOffset = curNameOffset; + element.Module = (short)result.Module; + element.DescriptionStart = (short)result.DescriptionStart; + element.DescriptionEnd = (short)result.DescriptionEnd; + + Span utf8Name = Encoding.UTF8.GetBytes(result.FullName); + utf8Name.CopyTo(nameTable.Slice(curNameOffset)); + nameTable[curNameOffset + utf8Name.Length] = 0; + + curNameOffset += utf8Name.Length + 1; + } + + return archive; + } + + private int CalculateNameTableOffset() + { + return Unsafe.SizeOf() + Unsafe.SizeOf() * Results.Count; + } + + private int CalculateNameTableSize() + { + int size = 0; + Encoding encoding = Encoding.UTF8; + + foreach (ResultInfo result in Results) + { + size += encoding.GetByteCount(result.FullName) + 1; + } + + return size; + } + + // ReSharper disable NotAccessedField.Local + private struct HeaderStruct + { + public int ElementCount; + public int NameTableOffset; + } + + private struct Element + { + public int NameOffset; + public short Module; + public short DescriptionStart; + public short DescriptionEnd; + } + // ReSharper restore NotAccessedField.Local + } + public class ModuleIndex { public string Name { get; set; } @@ -408,7 +544,6 @@ namespace LibHacBuild.CodeGen public string Namespace { get; set; } public string Path { get; set; } - public string FullPath { get; set; } public bool NeedsAggressiveInlining { get; set; } public ResultInfo[] Results { get; set; } } @@ -420,6 +555,7 @@ namespace LibHacBuild.CodeGen public int DescriptionStart { get; set; } public int DescriptionEnd { get; set; } public string Name { get; set; } + public string FullName { get; set; } public string Summary { get; set; } public bool IsRange => DescriptionStart != DescriptionEnd; diff --git a/src/LibHac/LibHac.csproj b/src/LibHac/LibHac.csproj index 4f7b1741..a28cd574 100644 --- a/src/LibHac/LibHac.csproj +++ b/src/LibHac/LibHac.csproj @@ -37,6 +37,10 @@ + + + + diff --git a/src/LibHac/Result.cs b/src/LibHac/Result.cs index f4e49af4..3a8fd232 100644 --- a/src/LibHac/Result.cs +++ b/src/LibHac/Result.cs @@ -20,7 +20,7 @@ namespace LibHac public static Result Success => new Result(SuccessValue); private static IResultLogger Logger { get; set; } - private static IResultNameResolver NameResolver { get; set; } + private static IResultNameResolver NameResolver { get; set; } = new ResultNameResolver(); private const int ModuleBitsOffset = 0; private const int ModuleBitsCount = 9; diff --git a/src/LibHac/ResultNameResolver.Archive.cs b/src/LibHac/ResultNameResolver.Archive.cs new file mode 100644 index 00000000..a426721d --- /dev/null +++ b/src/LibHac/ResultNameResolver.Archive.cs @@ -0,0 +1,15 @@ +using System; + +namespace LibHac +{ + internal partial class ResultNameResolver + { + private static ReadOnlySpan ArchiveData => new byte[] + { + // This array will be populated when the build script is run. + + // The script can be run with the "codegen" option to run only the + // code generation portion of the build. + }; + } +} diff --git a/src/LibHac/ResultNameResolver.cs b/src/LibHac/ResultNameResolver.cs new file mode 100644 index 00000000..f251c675 --- /dev/null +++ b/src/LibHac/ResultNameResolver.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using LibHac.Common; + +namespace LibHac +{ + internal partial class ResultNameResolver : Result.IResultNameResolver + { + private Lazy> ResultNames { get; } = new Lazy>(GetResultNames); + + public bool TryResolveName(Result result, out string name) + { + return ResultNames.Value.TryGetValue(result, out name); + } + + private static Dictionary GetResultNames() + { + var archiveReader = new ResultArchiveReader(ArchiveData); + return archiveReader.GetDictionary(); + } + + private readonly ref struct ResultArchiveReader + { + private readonly ReadOnlySpan _data; + + private ref HeaderStruct Header => ref Unsafe.As(ref MemoryMarshal.GetReference(_data)); + private ReadOnlySpan NameTable => _data.Slice(Header.NameTableOffset); + private ReadOnlySpan Elements => MemoryMarshal.Cast( + _data.Slice(Unsafe.SizeOf(), Header.ElementCount * Unsafe.SizeOf())); + + public ResultArchiveReader(ReadOnlySpan archive) + { + _data = archive; + } + + public Dictionary GetDictionary() + { + var dict = new Dictionary(); + if (_data.Length < 8) return dict; + + ReadOnlySpan elements = Elements; + + foreach (ref readonly Element element in elements) + { + var result = new Result(element.Module, element.DescriptionStart); + dict.Add(result, GetName(element.NameOffset).ToString()); + } + + return dict; + } + + private U8Span GetName(int offset) + { + ReadOnlySpan untrimmed = NameTable.Slice(offset); + int len = StringUtils.GetLength(untrimmed); + + return new U8Span(untrimmed.Slice(0, len)); + } + +#pragma warning disable 649 + private struct HeaderStruct + { + public int ElementCount; + public int NameTableOffset; + } + + private struct Element + { + public int NameOffset; + public short Module; + public short DescriptionStart; + public short DescriptionEnd; + } +#pragma warning restore 649 + } + } +} diff --git a/src/hactoolnet/Program.cs b/src/hactoolnet/Program.cs index cb7f7672..108f8526 100644 --- a/src/hactoolnet/Program.cs +++ b/src/hactoolnet/Program.cs @@ -56,8 +56,6 @@ namespace hactoolnet try { - Result.SetNameResolver(new ResultNameResolver()); - using (var logger = new ProgressBar()) { ctx.Logger = logger; From 24f293c27ad43f048ea6e375c3719f4649b4b250 Mon Sep 17 00:00:00 2001 From: Alex Barney Date: Thu, 27 Feb 2020 22:45:45 -0700 Subject: [PATCH 6/6] Add names to Results missing them --- build/CodeGen/results.csv | 34 ++++++++++--------- src/LibHac/Fs/ResultFs.cs | 34 ++++++++++--------- .../FsSystem/IntegrityVerificationStorage.cs | 4 +-- src/LibHac/FsSystem/Save/SaveResults.cs | 32 ++++++++--------- src/LibHac/ResultNameResolver.cs | 2 ++ 5 files changed, 56 insertions(+), 50 deletions(-) diff --git a/build/CodeGen/results.csv b/build/CodeGen/results.csv index c95aa55b..39f37d15 100644 --- a/build/CodeGen/results.csv +++ b/build/CodeGen/results.csv @@ -35,7 +35,7 @@ Module,DescriptionStart,DescriptionEnd,Name,Summary 2,2961,,InvalidGameCardHandleOnOpenSecurePartition, 2,3001,,NotImplemented, -2,3002,,, +2,3002,,UnsupportedVersion, 2,3003,,SaveDataPathAlreadyExists, 2,3005,,OutOfRange, @@ -59,17 +59,17 @@ Module,DescriptionStart,DescriptionEnd,Name,Summary 2,4245,,InvalidRomHostHandle, 2,4301,4499,SaveDataCorrupted, -2,4302,,, +2,4302,,UnsupportedSaveVersion, 2,4303,,InvalidSaveDataEntryType, 2,4315,,InvalidSaveDataHeader, -2,4362,,, -2,4363,,, -2,4364,,InvalidHashInSaveIvfc, -2,4372,,SaveIvfcHashIsEmpty, -2,4373,,InvalidHashInSaveIvfcTopLayer, +2,4362,,InvalidSaveDataIvfcMagic, +2,4363,,InvalidSaveDataIvfcHashValidationBit, +2,4364,,InvalidSaveDataIvfcHash, +2,4372,,EmptySaveDataIvfcHash, +2,4373,,InvalidSaveDataHashInIvfcTopLayer, -2,4402,,, -2,4427,,, +2,4402,,SaveDataInvalidGptPartitionSignature, +2,4427,,IncompleteBlockInZeroBitmapHashStorageFileSaveData, 2,4441,4459,SaveDataHostFileSystemCorrupted, 2,4442,,SaveDataHostEntryCorrupted, 2,4443,,SaveDataHostFileDataCorrupted, @@ -83,10 +83,10 @@ Module,DescriptionStart,DescriptionEnd,Name,Summary 2,4501,4599,NcaCorrupted, 2,4601,4639,IntegrityVerificationStorageCorrupted, -2,4602,,, -2,4603,,, -2,4604,,InvalidHashInIvfc, -2,4612,,IvfcHashIsEmpty, +2,4602,,InvalidIvfcMagic, +2,4603,,InvalidIvfcHashValidationBit, +2,4604,,InvalidIvfcHash, +2,4612,,EmptyIvfcHash, 2,4613,,InvalidHashInIvfcTopLayer, 2,4641,4659,PartitionFileSystemCorrupted, @@ -97,7 +97,7 @@ Module,DescriptionStart,DescriptionEnd,Name,Summary 2,4646,,InvalidPartitionFileSystemEntryNameOffset, 2,4661,4679,BuiltInStorageCorrupted, -2,4662,,, +2,4662,,InvalidGptPartitionSignature, 2,4681,4699,FatFileSystemCorrupted, @@ -125,8 +125,9 @@ Module,DescriptionStart,DescriptionEnd,Name,Summary 2,4771,4779,SignedSystemPartitionDataCorrupted, 2,4781,,GameCardLogoDataCorrupted, -2,4811,4819,, -2,4812,,, +# The range name is a guess. 4812 is currently the only result in it +2,4811,4819,ZeroBitmapFileCorrupted, +2,4812,,IncompleteBlockInZeroBitmapHashStorageFile, 2,5000,5999,Unexpected, 2,5307,,UnexpectedErrorInHostFileFlush, @@ -197,6 +198,7 @@ Module,DescriptionStart,DescriptionEnd,Name,Summary 2,6465,,UserNotExist, 2,6600,6699,EntryNotFound, +2,6606,,TargetProgramIndexNotFound,Specified program index is not found 2,6700,6799,OutOfResource, 2,6706,,MappingTableFull, 2,6707,,AllocationTableInsufficientFreeBlocks, diff --git a/src/LibHac/Fs/ResultFs.cs b/src/LibHac/Fs/ResultFs.cs index 2e67f58a..871f9512 100644 --- a/src/LibHac/Fs/ResultFs.cs +++ b/src/LibHac/Fs/ResultFs.cs @@ -88,7 +88,7 @@ namespace LibHac.Fs /// Error code: 2002-3001; Inner value: 0x177202 public static Result.Base NotImplemented => new Result.Base(ModuleFs, 3001); /// Error code: 2002-3002; Inner value: 0x177402 - public static Result.Base Result3002 => new Result.Base(ModuleFs, 3002); + public static Result.Base UnsupportedVersion => new Result.Base(ModuleFs, 3002); /// Error code: 2002-3003; Inner value: 0x177602 public static Result.Base SaveDataPathAlreadyExists => new Result.Base(ModuleFs, 3003); /// Error code: 2002-3005; Inner value: 0x177a02 @@ -131,25 +131,25 @@ namespace LibHac.Fs /// Error code: 2002-4301; Range: 4301-4499; Inner value: 0x219a02 public static Result.Base SaveDataCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4301, 4499); } /// Error code: 2002-4302; Inner value: 0x219c02 - public static Result.Base Result4302 => new Result.Base(ModuleFs, 4302); + public static Result.Base UnsupportedSaveVersion => new Result.Base(ModuleFs, 4302); /// Error code: 2002-4303; Inner value: 0x219e02 public static Result.Base InvalidSaveDataEntryType => new Result.Base(ModuleFs, 4303); /// Error code: 2002-4315; Inner value: 0x21b602 public static Result.Base InvalidSaveDataHeader => new Result.Base(ModuleFs, 4315); /// Error code: 2002-4362; Inner value: 0x221402 - public static Result.Base Result4362 => new Result.Base(ModuleFs, 4362); + public static Result.Base InvalidSaveDataIvfcMagic => new Result.Base(ModuleFs, 4362); /// Error code: 2002-4363; Inner value: 0x221602 - public static Result.Base Result4363 => new Result.Base(ModuleFs, 4363); + public static Result.Base InvalidSaveDataIvfcHashValidationBit => new Result.Base(ModuleFs, 4363); /// Error code: 2002-4364; Inner value: 0x221802 - public static Result.Base InvalidHashInSaveIvfc => new Result.Base(ModuleFs, 4364); + public static Result.Base InvalidSaveDataIvfcHash => new Result.Base(ModuleFs, 4364); /// Error code: 2002-4372; Inner value: 0x222802 - public static Result.Base SaveIvfcHashIsEmpty => new Result.Base(ModuleFs, 4372); + public static Result.Base EmptySaveDataIvfcHash => new Result.Base(ModuleFs, 4372); /// Error code: 2002-4373; Inner value: 0x222a02 - public static Result.Base InvalidHashInSaveIvfcTopLayer => new Result.Base(ModuleFs, 4373); + public static Result.Base InvalidSaveDataHashInIvfcTopLayer => new Result.Base(ModuleFs, 4373); /// Error code: 2002-4402; Inner value: 0x226402 - public static Result.Base Result4402 => new Result.Base(ModuleFs, 4402); + public static Result.Base SaveDataInvalidGptPartitionSignature => new Result.Base(ModuleFs, 4402); /// Error code: 2002-4427; Inner value: 0x229602 - public static Result.Base Result4427 => new Result.Base(ModuleFs, 4427); + public static Result.Base IncompleteBlockInZeroBitmapHashStorageFileSaveData => new Result.Base(ModuleFs, 4427); /// Error code: 2002-4441; Range: 4441-4459; Inner value: 0x22b202 public static Result.Base SaveDataHostFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4441, 4459); } @@ -175,13 +175,13 @@ namespace LibHac.Fs /// Error code: 2002-4601; Range: 4601-4639; Inner value: 0x23f202 public static Result.Base IntegrityVerificationStorageCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4601, 4639); } /// Error code: 2002-4602; Inner value: 0x23f402 - public static Result.Base Result4602 => new Result.Base(ModuleFs, 4602); + public static Result.Base InvalidIvfcMagic => new Result.Base(ModuleFs, 4602); /// Error code: 2002-4603; Inner value: 0x23f602 - public static Result.Base Result4603 => new Result.Base(ModuleFs, 4603); + public static Result.Base InvalidIvfcHashValidationBit => new Result.Base(ModuleFs, 4603); /// Error code: 2002-4604; Inner value: 0x23f802 - public static Result.Base InvalidHashInIvfc => new Result.Base(ModuleFs, 4604); + public static Result.Base InvalidIvfcHash => new Result.Base(ModuleFs, 4604); /// Error code: 2002-4612; Inner value: 0x240802 - public static Result.Base IvfcHashIsEmpty => new Result.Base(ModuleFs, 4612); + public static Result.Base EmptyIvfcHash => new Result.Base(ModuleFs, 4612); /// Error code: 2002-4613; Inner value: 0x240a02 public static Result.Base InvalidHashInIvfcTopLayer => new Result.Base(ModuleFs, 4613); @@ -201,7 +201,7 @@ namespace LibHac.Fs /// Error code: 2002-4661; Range: 4661-4679; Inner value: 0x246a02 public static Result.Base BuiltInStorageCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4661, 4679); } /// Error code: 2002-4662; Inner value: 0x246c02 - public static Result.Base Result4662 => new Result.Base(ModuleFs, 4662); + public static Result.Base InvalidGptPartitionSignature => new Result.Base(ModuleFs, 4662); /// Error code: 2002-4681; Range: 4681-4699; Inner value: 0x249202 public static Result.Base FatFileSystemCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4681, 4699); } @@ -253,9 +253,9 @@ namespace LibHac.Fs public static Result.Base GameCardLogoDataCorrupted => new Result.Base(ModuleFs, 4781); /// Error code: 2002-4811; Range: 4811-4819; Inner value: 0x259602 - public static Result.Base Range4811To4819 { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4811, 4819); } + public static Result.Base ZeroBitmapFileCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4811, 4819); } /// Error code: 2002-4812; Inner value: 0x259802 - public static Result.Base Result4812 => new Result.Base(ModuleFs, 4812); + public static Result.Base IncompleteBlockInZeroBitmapHashStorageFile => new Result.Base(ModuleFs, 4812); /// Error code: 2002-5000; Range: 5000-5999; Inner value: 0x271002 public static Result.Base Unexpected { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 5000, 5999); } @@ -386,6 +386,8 @@ namespace LibHac.Fs /// Error code: 2002-6600; Range: 6600-6699; Inner value: 0x339002 public static Result.Base EntryNotFound { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6600, 6699); } + /// Specified program index is not found
Error code: 2002-6606; Inner value: 0x339c02
+ public static Result.Base TargetProgramIndexNotFound => new Result.Base(ModuleFs, 6606); /// Error code: 2002-6700; Range: 6700-6799; Inner value: 0x345802 public static Result.Base OutOfResource { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 6700, 6799); } diff --git a/src/LibHac/FsSystem/IntegrityVerificationStorage.cs b/src/LibHac/FsSystem/IntegrityVerificationStorage.cs index 1e9d9761..a0df10a0 100644 --- a/src/LibHac/FsSystem/IntegrityVerificationStorage.cs +++ b/src/LibHac/FsSystem/IntegrityVerificationStorage.cs @@ -45,7 +45,7 @@ namespace LibHac.FsSystem if (BlockValidities[blockIndex] == Validity.Invalid && integrityCheckLevel == IntegrityCheckLevel.ErrorOnInvalid) { // Todo: Differentiate between the top and lower layers - ThrowHelper.ThrowResult(ResultFs.InvalidHashInIvfc.Value, "Hash error!"); + ThrowHelper.ThrowResult(ResultFs.InvalidIvfcHash.Value, "Hash error!"); } bool needsHashCheck = integrityCheckLevel != IntegrityCheckLevel.None && @@ -106,7 +106,7 @@ namespace LibHac.FsSystem if (validity == Validity.Invalid && integrityCheckLevel == IntegrityCheckLevel.ErrorOnInvalid) { - ThrowHelper.ThrowResult(ResultFs.InvalidHashInIvfc.Value, "Hash error!"); + ThrowHelper.ThrowResult(ResultFs.InvalidIvfcHash.Value, "Hash error!"); } } finally diff --git a/src/LibHac/FsSystem/Save/SaveResults.cs b/src/LibHac/FsSystem/Save/SaveResults.cs index 768c8f08..a7b46196 100644 --- a/src/LibHac/FsSystem/Save/SaveResults.cs +++ b/src/LibHac/FsSystem/Save/SaveResults.cs @@ -18,36 +18,36 @@ namespace LibHac.FsSystem.Save return result; } - if (ResultFs.Result3002.Includes(result)) + if (ResultFs.UnsupportedVersion.Includes(result)) { - return ResultFs.Result4302.Value; + return ResultFs.UnsupportedSaveVersion.Value; } if (ResultFs.IntegrityVerificationStorageCorrupted.Includes(result)) { - if (ResultFs.Result4602.Includes(result)) + if (ResultFs.InvalidIvfcMagic.Includes(result)) { - return ResultFs.Result4362.Value; + return ResultFs.InvalidSaveDataIvfcMagic.Value; } - if (ResultFs.Result4603.Includes(result)) + if (ResultFs.InvalidIvfcHashValidationBit.Includes(result)) { - return ResultFs.Result4363.Value; + return ResultFs.InvalidSaveDataIvfcHashValidationBit.Value; } - if (ResultFs.InvalidHashInIvfc.Includes(result)) + if (ResultFs.InvalidIvfcHash.Includes(result)) { - return ResultFs.InvalidHashInSaveIvfc.Value; + return ResultFs.InvalidSaveDataIvfcHash.Value; } - if (ResultFs.IvfcHashIsEmpty.Includes(result)) + if (ResultFs.EmptyIvfcHash.Includes(result)) { - return ResultFs.SaveIvfcHashIsEmpty.Value; + return ResultFs.EmptySaveDataIvfcHash.Value; } if (ResultFs.InvalidHashInIvfcTopLayer.Includes(result)) { - return ResultFs.InvalidHashInSaveIvfcTopLayer.Value; + return ResultFs.InvalidSaveDataHashInIvfcTopLayer.Value; } return result; @@ -55,9 +55,9 @@ namespace LibHac.FsSystem.Save if (ResultFs.BuiltInStorageCorrupted.Includes(result)) { - if (ResultFs.Result4662.Includes(result)) + if (ResultFs.InvalidGptPartitionSignature.Includes(result)) { - return ResultFs.Result4402.Value; + return ResultFs.SaveDataInvalidGptPartitionSignature.Value; } return result; @@ -73,11 +73,11 @@ namespace LibHac.FsSystem.Save return result; } - if (ResultFs.Range4811To4819.Includes(result)) + if (ResultFs.ZeroBitmapFileCorrupted.Includes(result)) { - if (ResultFs.Result4812.Includes(result)) + if (ResultFs.IncompleteBlockInZeroBitmapHashStorageFile.Includes(result)) { - return ResultFs.Result4427.Value; + return ResultFs.IncompleteBlockInZeroBitmapHashStorageFileSaveData.Value; } return result; diff --git a/src/LibHac/ResultNameResolver.cs b/src/LibHac/ResultNameResolver.cs index f251c675..8cf1b9f8 100644 --- a/src/LibHac/ResultNameResolver.cs +++ b/src/LibHac/ResultNameResolver.cs @@ -21,6 +21,8 @@ namespace LibHac return archiveReader.GetDictionary(); } + // To save a bunch of space in the assembly, Results with their names are packed into + // an archive and unpacked at runtime. private readonly ref struct ResultArchiveReader { private readonly ReadOnlySpan _data;