aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Homebrew.cs
blob: b0e05554b903a468256eb205655dd799b8bf8a06 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
using ChocolArm64.Memory;
using System.Text;

namespace Ryujinx.HLE.HOS
{
    static class Homebrew
    {
        public const string TemporaryNroSuffix = ".ryu_tmp.nro";

        //http://switchbrew.org/index.php?title=Homebrew_ABI
        public static void WriteHbAbiData(MemoryManager memory, long position, int mainThreadHandle, string switchPath)
        {
            //MainThreadHandle.
            WriteConfigEntry(memory, ref position, 1, 0, mainThreadHandle);

            //NextLoadPath.
            WriteConfigEntry(memory, ref position, 2, 0, position + 0x200, position + 0x400);

            //Argv.
            long argvPosition = position + 0xC00;

            memory.WriteBytes(argvPosition, Encoding.ASCII.GetBytes(switchPath + "\0"));

            WriteConfigEntry(memory, ref position, 5, 0, 0, argvPosition);

            //AppletType.
            WriteConfigEntry(memory, ref position, 7);

            //EndOfList.
            WriteConfigEntry(memory, ref position, 0);
        }

        private static void WriteConfigEntry(
            MemoryManager  memory,
            ref long       position,
            int            key,
            int            flags  = 0,
            long           value0 = 0,
            long           value1 = 0)
        {
            memory.WriteInt32(position + 0x00, key);
            memory.WriteInt32(position + 0x04, flags);
            memory.WriteInt64(position + 0x08, value0);
            memory.WriteInt64(position + 0x10, value1);

            position += 0x18;
        }

        public static string ReadHbAbiNextLoadPath(MemoryManager memory, long position)
        {
            string fileName = null;

            while (true)
            {
                long key = memory.ReadInt64(position);

                if (key == 2)
                {
                    long value0 = memory.ReadInt64(position + 0x08);
                    long value1 = memory.ReadInt64(position + 0x10);

                    fileName = MemoryHelper.ReadAsciiString(memory, value0, value1 - value0);

                    break;
                }
                else if (key == 0)
                {
                    break;
                }

                position += 0x18;
            }

            return fileName;
        }
    }
}