From: chaoskagami Date: Fri, 14 Oct 2016 11:14:52 +0000 (-0400) Subject: Add the fs:LDR patch into ctru X-Git-Url: https://chaos.moe/g/?a=commitdiff_plain;h=361f8d402eb16c09a49d184f3fa58844fce0e48a;p=corbenik%2Fctrulib.git Add the fs:LDR patch into ctru --- diff --git a/libctru/source/services/fs.c b/libctru/source/services/fs.c index 4c5adaa..771c48a 100644 --- a/libctru/source/services/fs.c +++ b/libctru/source/services/fs.c @@ -5,6 +5,7 @@ #include <3ds/srv.h> #include <3ds/synchronization.h> #include <3ds/services/fs.h> +#include <3ds/services/fsreg.h> #include <3ds/ipc.h> #include <3ds/env.h> #include "../internal.h" @@ -35,6 +36,27 @@ static Handle fsSessionForArchive(FS_Archive archive) return fsSession(); } +static Result +fsldrPatchPermissions(void) +{ + u32 pid; + Result res; + FS_ProgramInfo info; + u32 storage[8] = { 0 }; + + storage[6] = 0x680; // SDMC access and NAND access flag + info.programId = 0x0004013000001302LL; // loader PID + info.mediaType = MEDIATYPE_NAND; + + res = svcGetProcessId(&pid, 0xFFFF8001); + + if (R_SUCCEEDED(res)) { + res = FSREG_Register(pid, 0xFFFF000000000000LL, &info, (u8 *)storage); + } + + return res; +} + Result fsInitFromService(const char* service) { Result ret = 0; @@ -43,6 +65,8 @@ Result fsInitFromService(const char* service) { ret = srvGetServiceHandleDirect(&fsuHandle, service); if (R_SUCCEEDED(ret)) { + if (!strcmp(service, "fs:LDR")) + fsldrPatchPermissions(); ret = FSUSER_Initialize(fsuHandle); if (R_FAILED(ret)) svcCloseHandle(fsuHandle); }