Support HomeBrew Loader (#577)

* Make it possibles to load hb-loader and hb-menu

One issue remains with hb-menu homebrew icons because of SIMD issues
(libjpeg-turbo related) and netloader doesn't work.

* Implement GetApplicationControlData

* Fix shared fonts for NSO/NRO

* Add homebrew NRO romfs support

This readd the NRO support by parsing the ASET header

* Address comments about HomebrewRomFs

* override Dispose in homebrew romfs stream

* Use a struct for file timestamp

* Simplify positional increments in GetApplicationControlData

* Address comments

* improve readability of the memory permission check in SetProcessMemoryPermission

* Fix previous broken check

* Add address space checks in SetProcessMemoryPermission
This commit is contained in:
Thomas Guillemard 2019-02-14 01:44:39 +01:00 committed by jduncanator
parent 7e9f555574
commit b126ea48c6
17 changed files with 633 additions and 17 deletions

View file

@ -38,8 +38,8 @@ namespace Ryujinx.HLE.HOS.Services.FspSrv
{ 10, Commit },
{ 11, GetFreeSpaceSize },
{ 12, GetTotalSpaceSize },
{ 13, CleanDirectoryRecursively }
//{ 14, GetFileTimeStampRaw }
{ 13, CleanDirectoryRecursively },
{ 14, GetFileTimeStampRaw }
};
_openPaths = new HashSet<string>();
@ -368,6 +368,34 @@ namespace Ryujinx.HLE.HOS.Services.FspSrv
return 0;
}
// GetFileTimeStampRaw(buffer<bytes<0x301>, 0x19, 0x301> path) -> bytes<0x20> timestamp
public long GetFileTimeStampRaw(ServiceCtx context)
{
string name = ReadUtf8String(context);
string path = _provider.GetFullPath(name);
if (_provider.FileExists(path) || _provider.DirectoryExists(path))
{
FileTimestamp timestamp = _provider.GetFileTimeStampRaw(path);
context.ResponseData.Write(new DateTimeOffset(timestamp.CreationDateTime).ToUnixTimeSeconds());
context.ResponseData.Write(new DateTimeOffset(timestamp.ModifiedDateTime).ToUnixTimeSeconds());
context.ResponseData.Write(new DateTimeOffset(timestamp.LastAccessDateTime).ToUnixTimeSeconds());
byte[] data = new byte[8];
// is valid?
data[0] = 1;
context.ResponseData.Write(data);
return 0;
}
return MakeError(ErrorModule.Fs, FsErr.PathDoesNotExist);
}
private bool IsPathAlreadyInUse(string path)
{
lock (_openPaths)