read system firmware version from nand

This commit is contained in:
emmaus 2018-11-04 18:02:00 +00:00
parent 2d31c4394a
commit 220cd16380
3 changed files with 75 additions and 1 deletions

View file

@ -23,8 +23,8 @@ namespace Ryujinx.HLE.HOS.Services.FspSrv
m_Commands = new Dictionary<int, ServiceProcessRequest>()
{
{ 1, SetCurrentProcess },
{ 11, OpenBisFileSystem },
{ 8, OpenFileSystemWithId },
{ 11, OpenBisFileSystem },
{ 18, OpenSdCardFileSystem },
{ 51, OpenSaveDataFileSystem },
{ 52, OpenSaveDataFileSystemBySystemSaveDataId },

View file

@ -5,6 +5,8 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using LibHac;
using Ryujinx.HLE.FileSystem;
namespace Ryujinx.HLE.HOS.Services.Set
{
@ -18,6 +20,7 @@ namespace Ryujinx.HLE.HOS.Services.Set
{
m_Commands = new Dictionary<int, ServiceProcessRequest>()
{
{ 3, GetFirmwareVersion },
{ 4, GetFirmwareVersion2 },
{ 23, GetColorSetId },
{ 24, SetColorSetId },
@ -25,11 +28,25 @@ namespace Ryujinx.HLE.HOS.Services.Set
};
}
public static long GetFirmwareVersion(ServiceCtx Context)
{
return GetFirmwareVersion2(Context);
}
public static long GetFirmwareVersion2(ServiceCtx Context)
{
long ReplyPos = Context.Request.RecvListBuff[0].Position;
long ReplySize = Context.Request.RecvListBuff[0].Size;
byte[] FirmwareData = GetFirmwareData(Context.Device);
if (FirmwareData != null)
{
Context.Memory.WriteBytes(ReplyPos, FirmwareData);
return 0;
}
const byte MajorFWVersion = 0x03;
const byte MinorFWVersion = 0x00;
const byte MicroFWVersion = 0x00;
@ -148,5 +165,48 @@ namespace Ryujinx.HLE.HOS.Services.Set
return 0;
}
public static byte[] GetFirmwareData(Switch Device)
{
byte[] Data = null;
long TitleId = 0x0100000000000809;
string Path = Device.System.ContentManager.GetInstalledPath(TitleId, ContentType.Data, StorageId.NandSystem);
if(string.IsNullOrWhiteSpace(Path))
{
return null;
}
FileStream FirmwareStream = File.Open(Path, FileMode.Open, FileAccess.Read);
Nca FirmwareContent = new Nca(Device.System.KeySet, FirmwareStream, false);
Stream RomFsStream = FirmwareContent.OpenSection(0, false, Device.System.FsIntegrityCheckLevel);
if(RomFsStream == null)
{
return null;
}
Romfs FirmwareRomFs = new Romfs(RomFsStream);
using(MemoryStream MemoryStream = new MemoryStream())
{
using (Stream FirmwareFile = FirmwareRomFs.OpenFile("/file"))
{
FirmwareFile.CopyTo(MemoryStream);
}
Data = MemoryStream.ToArray();
}
FirmwareContent.Dispose();
FirmwareStream.Dispose();
return Data;
}
}
}

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<PublishProtocol>FileSystem</PublishProtocol>
<Configuration>Release</Configuration>
<Platform>Any CPU</Platform>
<TargetFramework>netcoreapp2.1</TargetFramework>
<PublishDir>bin\Release\netcoreapp2.1\publish\</PublishDir>
<RuntimeIdentifier>win10-x64</RuntimeIdentifier>
</PropertyGroup>
</Project>