mirror of
https://github.com/Thealexbarney/LibHac.git
synced 2024-11-14 10:49:41 +01:00
Move Npdm, LayeredFileSystem
This commit is contained in:
parent
a289059ecf
commit
14fcdc9d67
18 changed files with 201 additions and 197 deletions
|
@ -1,172 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace LibHac.Npdm;
|
|
||||||
|
|
||||||
public class KernelAccessControl
|
|
||||||
{
|
|
||||||
public List<KernelAccessControlItem> Items { get; }
|
|
||||||
|
|
||||||
public KernelAccessControl(Stream stream, int offset, int size)
|
|
||||||
{
|
|
||||||
stream.Seek(offset, SeekOrigin.Begin);
|
|
||||||
|
|
||||||
var reader = new BinaryReader(stream);
|
|
||||||
|
|
||||||
var items = new KernelAccessControlItem[size / 4];
|
|
||||||
|
|
||||||
for (int index = 0; index < size / 4; index++)
|
|
||||||
{
|
|
||||||
uint descriptor = reader.ReadUInt32();
|
|
||||||
|
|
||||||
//Ignore the descriptor.
|
|
||||||
if (descriptor == 0xffffffff)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
items[index] = new KernelAccessControlItem();
|
|
||||||
|
|
||||||
int lowBits = 0;
|
|
||||||
|
|
||||||
while ((descriptor & 1) != 0)
|
|
||||||
{
|
|
||||||
descriptor >>= 1;
|
|
||||||
|
|
||||||
lowBits++;
|
|
||||||
}
|
|
||||||
|
|
||||||
descriptor >>= 1;
|
|
||||||
|
|
||||||
switch (lowBits)
|
|
||||||
{
|
|
||||||
//Kernel flags.
|
|
||||||
case 3:
|
|
||||||
{
|
|
||||||
items[index].HasKernelFlags = true;
|
|
||||||
|
|
||||||
items[index].HighestThreadPriority = (descriptor >> 0) & 0x3f;
|
|
||||||
items[index].LowestThreadPriority = (descriptor >> 6) & 0x3f;
|
|
||||||
items[index].LowestCpuId = (descriptor >> 12) & 0xff;
|
|
||||||
items[index].HighestCpuId = (descriptor >> 20) & 0xff;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Syscall mask.
|
|
||||||
case 4:
|
|
||||||
{
|
|
||||||
items[index].HasSvcFlags = true;
|
|
||||||
|
|
||||||
items[index].AllowedSvcs = new bool[0x80];
|
|
||||||
|
|
||||||
int sysCallBase = (int)(descriptor >> 24) * 0x18;
|
|
||||||
|
|
||||||
for (int sysCall = 0; sysCall < 0x18 && sysCallBase + sysCall < 0x80; sysCall++)
|
|
||||||
{
|
|
||||||
items[index].AllowedSvcs[sysCallBase + sysCall] = (descriptor & 1) != 0;
|
|
||||||
|
|
||||||
descriptor >>= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Map IO/Normal.
|
|
||||||
case 6:
|
|
||||||
{
|
|
||||||
ulong address = (descriptor & 0xffffff) << 12;
|
|
||||||
bool isRo = (descriptor >> 24) != 0;
|
|
||||||
|
|
||||||
if (index == size / 4 - 1)
|
|
||||||
{
|
|
||||||
throw new Exception("Invalid Kernel Access Control Descriptors!");
|
|
||||||
}
|
|
||||||
|
|
||||||
descriptor = reader.ReadUInt32();
|
|
||||||
|
|
||||||
if ((descriptor & 0x7f) != 0x3f)
|
|
||||||
{
|
|
||||||
throw new Exception("Invalid Kernel Access Control Descriptors!");
|
|
||||||
}
|
|
||||||
|
|
||||||
descriptor >>= 7;
|
|
||||||
|
|
||||||
ulong mmioSize = (descriptor & 0xffffff) << 12;
|
|
||||||
bool isNormal = (descriptor >> 24) != 0;
|
|
||||||
|
|
||||||
items[index].NormalMmio.Add(new KernelAccessControlMmio(address, mmioSize, isRo, isNormal));
|
|
||||||
|
|
||||||
index++;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Map Normal Page.
|
|
||||||
case 7:
|
|
||||||
{
|
|
||||||
ulong address = descriptor << 12;
|
|
||||||
|
|
||||||
items[index].PageMmio.Add(new KernelAccessControlMmio(address, 0x1000, false, false));
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
//IRQ Pair.
|
|
||||||
case 11:
|
|
||||||
{
|
|
||||||
items[index].Irq.Add(new KernelAccessControlIrq(
|
|
||||||
(descriptor >> 0) & 0x3ff,
|
|
||||||
(descriptor >> 10) & 0x3ff));
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Application Type.
|
|
||||||
case 13:
|
|
||||||
{
|
|
||||||
items[index].HasApplicationType = true;
|
|
||||||
|
|
||||||
items[index].ApplicationType = (int)descriptor & 7;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Kernel Release Version.
|
|
||||||
case 14:
|
|
||||||
{
|
|
||||||
items[index].HasKernelVersion = true;
|
|
||||||
|
|
||||||
items[index].KernelVersionRelease = (int)descriptor;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Handle Table Size.
|
|
||||||
case 15:
|
|
||||||
{
|
|
||||||
items[index].HasHandleTableSize = true;
|
|
||||||
|
|
||||||
items[index].HandleTableSize = (int)descriptor;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Debug Flags.
|
|
||||||
case 16:
|
|
||||||
{
|
|
||||||
items[index].HasDebugFlags = true;
|
|
||||||
|
|
||||||
items[index].AllowDebug = ((descriptor >> 0) & 1) != 0;
|
|
||||||
items[index].ForceDebug = ((descriptor >> 1) & 1) != 0;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Items = items.ToList();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -5,7 +5,7 @@ using LibHac.Fs;
|
||||||
using LibHac.Fs.Fsa;
|
using LibHac.Fs.Fsa;
|
||||||
using LibHac.Util;
|
using LibHac.Util;
|
||||||
|
|
||||||
namespace LibHac.FsSystem;
|
namespace LibHac.Tools.FsSystem;
|
||||||
|
|
||||||
public class LayeredFileSystem : IFileSystem
|
public class LayeredFileSystem : IFileSystem
|
||||||
{
|
{
|
|
@ -1,9 +1,10 @@
|
||||||
// ReSharper disable UnusedVariable
|
// ReSharper disable UnusedVariable
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using LibHac.Common;
|
using LibHac.Common;
|
||||||
|
|
||||||
namespace LibHac.Npdm;
|
namespace LibHac.Tools.Npdm;
|
||||||
|
|
||||||
public class Aci0
|
public class Aci0
|
||||||
{
|
{
|
|
@ -1,11 +1,12 @@
|
||||||
// ReSharper disable UnusedVariable
|
// ReSharper disable UnusedVariable
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using LibHac.Common;
|
using LibHac.Common;
|
||||||
using LibHac.Common.Keys;
|
using LibHac.Common.Keys;
|
||||||
using LibHac.Tools.Crypto;
|
using LibHac.Tools.Crypto;
|
||||||
|
|
||||||
namespace LibHac.Npdm;
|
namespace LibHac.Tools.Npdm;
|
||||||
|
|
||||||
public class Acid
|
public class Acid
|
||||||
{
|
{
|
|
@ -1,4 +1,4 @@
|
||||||
namespace LibHac.Npdm;
|
namespace LibHac.Tools.Npdm;
|
||||||
|
|
||||||
internal enum ApplicationType
|
internal enum ApplicationType
|
||||||
{
|
{
|
|
@ -1,6 +1,6 @@
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
|
||||||
namespace LibHac.Npdm;
|
namespace LibHac.Tools.Npdm;
|
||||||
|
|
||||||
public class FsAccessControl
|
public class FsAccessControl
|
||||||
{
|
{
|
|
@ -1,8 +1,9 @@
|
||||||
// ReSharper disable UnusedVariable
|
// ReSharper disable UnusedVariable
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
|
||||||
namespace LibHac.Npdm;
|
namespace LibHac.Tools.Npdm;
|
||||||
|
|
||||||
public class FsAccessHeader
|
public class FsAccessHeader
|
||||||
{
|
{
|
|
@ -1,5 +1,5 @@
|
||||||
// ReSharper disable InconsistentNaming
|
// ReSharper disable InconsistentNaming
|
||||||
namespace LibHac.Npdm;
|
namespace LibHac.Tools.Npdm;
|
||||||
|
|
||||||
public enum FsPermissionBool : ulong
|
public enum FsPermissionBool : ulong
|
||||||
{
|
{
|
|
@ -1,5 +1,5 @@
|
||||||
// ReSharper disable InconsistentNaming
|
// ReSharper disable InconsistentNaming
|
||||||
namespace LibHac.Npdm;
|
namespace LibHac.Tools.Npdm;
|
||||||
|
|
||||||
public enum FsPermissionRw : ulong
|
public enum FsPermissionRw : ulong
|
||||||
{
|
{
|
172
src/LibHac/Tools/Npdm/KernelAccessControl.cs
Normal file
172
src/LibHac/Tools/Npdm/KernelAccessControl.cs
Normal file
|
@ -0,0 +1,172 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace LibHac.Tools.Npdm;
|
||||||
|
|
||||||
|
public class KernelAccessControl
|
||||||
|
{
|
||||||
|
public List<KernelAccessControlItem> Items { get; }
|
||||||
|
|
||||||
|
public KernelAccessControl(Stream stream, int offset, int size)
|
||||||
|
{
|
||||||
|
stream.Seek(offset, SeekOrigin.Begin);
|
||||||
|
|
||||||
|
var reader = new BinaryReader(stream);
|
||||||
|
|
||||||
|
var items = new KernelAccessControlItem[size / 4];
|
||||||
|
|
||||||
|
for (int index = 0; index < size / 4; index++)
|
||||||
|
{
|
||||||
|
uint descriptor = reader.ReadUInt32();
|
||||||
|
|
||||||
|
//Ignore the descriptor.
|
||||||
|
if (descriptor == 0xffffffff)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
items[index] = new KernelAccessControlItem();
|
||||||
|
|
||||||
|
int lowBits = 0;
|
||||||
|
|
||||||
|
while ((descriptor & 1) != 0)
|
||||||
|
{
|
||||||
|
descriptor >>= 1;
|
||||||
|
|
||||||
|
lowBits++;
|
||||||
|
}
|
||||||
|
|
||||||
|
descriptor >>= 1;
|
||||||
|
|
||||||
|
switch (lowBits)
|
||||||
|
{
|
||||||
|
//Kernel flags.
|
||||||
|
case 3:
|
||||||
|
{
|
||||||
|
items[index].HasKernelFlags = true;
|
||||||
|
|
||||||
|
items[index].HighestThreadPriority = (descriptor >> 0) & 0x3f;
|
||||||
|
items[index].LowestThreadPriority = (descriptor >> 6) & 0x3f;
|
||||||
|
items[index].LowestCpuId = (descriptor >> 12) & 0xff;
|
||||||
|
items[index].HighestCpuId = (descriptor >> 20) & 0xff;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Syscall mask.
|
||||||
|
case 4:
|
||||||
|
{
|
||||||
|
items[index].HasSvcFlags = true;
|
||||||
|
|
||||||
|
items[index].AllowedSvcs = new bool[0x80];
|
||||||
|
|
||||||
|
int sysCallBase = (int)(descriptor >> 24) * 0x18;
|
||||||
|
|
||||||
|
for (int sysCall = 0; sysCall < 0x18 && sysCallBase + sysCall < 0x80; sysCall++)
|
||||||
|
{
|
||||||
|
items[index].AllowedSvcs[sysCallBase + sysCall] = (descriptor & 1) != 0;
|
||||||
|
|
||||||
|
descriptor >>= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Map IO/Normal.
|
||||||
|
case 6:
|
||||||
|
{
|
||||||
|
ulong address = (descriptor & 0xffffff) << 12;
|
||||||
|
bool isRo = (descriptor >> 24) != 0;
|
||||||
|
|
||||||
|
if (index == size / 4 - 1)
|
||||||
|
{
|
||||||
|
throw new Exception("Invalid Kernel Access Control Descriptors!");
|
||||||
|
}
|
||||||
|
|
||||||
|
descriptor = reader.ReadUInt32();
|
||||||
|
|
||||||
|
if ((descriptor & 0x7f) != 0x3f)
|
||||||
|
{
|
||||||
|
throw new Exception("Invalid Kernel Access Control Descriptors!");
|
||||||
|
}
|
||||||
|
|
||||||
|
descriptor >>= 7;
|
||||||
|
|
||||||
|
ulong mmioSize = (descriptor & 0xffffff) << 12;
|
||||||
|
bool isNormal = (descriptor >> 24) != 0;
|
||||||
|
|
||||||
|
items[index].NormalMmio.Add(new KernelAccessControlMmio(address, mmioSize, isRo, isNormal));
|
||||||
|
|
||||||
|
index++;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Map Normal Page.
|
||||||
|
case 7:
|
||||||
|
{
|
||||||
|
ulong address = descriptor << 12;
|
||||||
|
|
||||||
|
items[index].PageMmio.Add(new KernelAccessControlMmio(address, 0x1000, false, false));
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//IRQ Pair.
|
||||||
|
case 11:
|
||||||
|
{
|
||||||
|
items[index].Irq.Add(new KernelAccessControlIrq(
|
||||||
|
(descriptor >> 0) & 0x3ff,
|
||||||
|
(descriptor >> 10) & 0x3ff));
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Application Type.
|
||||||
|
case 13:
|
||||||
|
{
|
||||||
|
items[index].HasApplicationType = true;
|
||||||
|
|
||||||
|
items[index].ApplicationType = (int)descriptor & 7;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Kernel Release Version.
|
||||||
|
case 14:
|
||||||
|
{
|
||||||
|
items[index].HasKernelVersion = true;
|
||||||
|
|
||||||
|
items[index].KernelVersionRelease = (int)descriptor;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Handle Table Size.
|
||||||
|
case 15:
|
||||||
|
{
|
||||||
|
items[index].HasHandleTableSize = true;
|
||||||
|
|
||||||
|
items[index].HandleTableSize = (int)descriptor;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Debug Flags.
|
||||||
|
case 16:
|
||||||
|
{
|
||||||
|
items[index].HasDebugFlags = true;
|
||||||
|
|
||||||
|
items[index].AllowDebug = ((descriptor >> 0) & 1) != 0;
|
||||||
|
items[index].ForceDebug = ((descriptor >> 1) & 1) != 0;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Items = items.ToList();
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
namespace LibHac.Npdm;
|
namespace LibHac.Tools.Npdm;
|
||||||
|
|
||||||
public struct KernelAccessControlIrq
|
public struct KernelAccessControlIrq
|
||||||
{
|
{
|
|
@ -1,4 +1,4 @@
|
||||||
namespace LibHac.Npdm;
|
namespace LibHac.Tools.Npdm;
|
||||||
|
|
||||||
public struct KernelAccessControlMmio
|
public struct KernelAccessControlMmio
|
||||||
{
|
{
|
|
@ -1,6 +1,6 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace LibHac.Npdm;
|
namespace LibHac.Tools.Npdm;
|
||||||
|
|
||||||
public class KernelAccessControlItem
|
public class KernelAccessControlItem
|
||||||
{
|
{
|
|
@ -1,11 +1,12 @@
|
||||||
// ReSharper disable UnusedVariable
|
// ReSharper disable UnusedVariable
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Buffers.Binary;
|
using System.Buffers.Binary;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using LibHac.Common;
|
using LibHac.Common;
|
||||||
using LibHac.Common.Keys;
|
using LibHac.Common.Keys;
|
||||||
|
|
||||||
namespace LibHac.Npdm;
|
namespace LibHac.Tools.Npdm;
|
||||||
|
|
||||||
//https://github.com/Ryujinx/Ryujinx/blob/master/Ryujinx.HLE/Loaders/Npdm/Npdm.cs
|
//https://github.com/Ryujinx/Ryujinx/blob/master/Ryujinx.HLE/Loaders/Npdm/Npdm.cs
|
||||||
//https://github.com/SciresM/hactool/blob/master/npdm.c
|
//https://github.com/SciresM/hactool/blob/master/npdm.c
|
|
@ -3,7 +3,7 @@ using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using LibHac.Common;
|
using LibHac.Common;
|
||||||
|
|
||||||
namespace LibHac.Npdm;
|
namespace LibHac.Tools.Npdm;
|
||||||
|
|
||||||
public class ServiceAccessControl
|
public class ServiceAccessControl
|
||||||
{
|
{
|
|
@ -1,4 +1,4 @@
|
||||||
namespace LibHac.Npdm;
|
namespace LibHac.Tools.Npdm;
|
||||||
|
|
||||||
public enum SvcName
|
public enum SvcName
|
||||||
{
|
{
|
|
@ -6,10 +6,10 @@ using LibHac.Fs;
|
||||||
using LibHac.Fs.Fsa;
|
using LibHac.Fs.Fsa;
|
||||||
using LibHac.Fs.Impl;
|
using LibHac.Fs.Impl;
|
||||||
using LibHac.FsSystem;
|
using LibHac.FsSystem;
|
||||||
using LibHac.Npdm;
|
|
||||||
using LibHac.Tools.Fs;
|
using LibHac.Tools.Fs;
|
||||||
using LibHac.Tools.FsSystem;
|
using LibHac.Tools.FsSystem;
|
||||||
using LibHac.Tools.FsSystem.NcaUtils;
|
using LibHac.Tools.FsSystem.NcaUtils;
|
||||||
|
using LibHac.Tools.Npdm;
|
||||||
using static hactoolnet.Print;
|
using static hactoolnet.Print;
|
||||||
|
|
||||||
namespace hactoolnet;
|
namespace hactoolnet;
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
using LibHac.Common;
|
using LibHac.Common;
|
||||||
using LibHac.Fs;
|
using LibHac.Fs;
|
||||||
using LibHac.Fs.Fsa;
|
using LibHac.Fs.Fsa;
|
||||||
using LibHac.FsSystem;
|
|
||||||
using LibHac.Tools.Fs;
|
using LibHac.Tools.Fs;
|
||||||
|
using LibHac.Tools.FsSystem;
|
||||||
using LibHac.Util;
|
using LibHac.Util;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue