diff --git a/source/core/util.c b/source/core/util.c index b5a8d4c..cc4af0b 100644 --- a/source/core/util.c +++ b/source/core/util.c @@ -317,6 +317,15 @@ u32 util_get_seed_response_code() { return import_response_code; } +FS_MediaType util_get_title_destination(u64 titleId) { + u16 platform = (u16) ((titleId >> 48) & 0xFFFF); + u16 category = (u16) ((titleId >> 32) & 0xFFFF); + u8 variation = (u8) (titleId & 0xFF); + + // DSiWare 3DS DSiWare, System, DLP Application System Title + return platform == 0x0003 || (platform == 0x0004 && ((category & 0x8011) != 0 || (category == 0x0000 && variation == 0x02))) ? MEDIATYPE_NAND : MEDIATYPE_SD; +} + static u32 sigSizes[6] = {0x240, 0x140, 0x80, 0x240, 0x140, 0x80}; u64 util_get_cia_title_id(u8* cia) { diff --git a/source/core/util.h b/source/core/util.h index f22f15b..eeaa8f5 100644 --- a/source/core/util.h +++ b/source/core/util.h @@ -54,6 +54,8 @@ void util_get_parent_path(char* out, const char* path, u32 size); Result util_import_seed(u64 titleId); u32 util_get_seed_response_code(); +FS_MediaType util_get_title_destination(u64 titleId); + u64 util_get_cia_title_id(u8* cia); Result util_get_cia_file_smdh(SMDH* smdh, Handle handle); u64 util_get_ticket_title_id(u8* ticket); diff --git a/source/ui/section/action/installcdn.c b/source/ui/section/action/installcdn.c index e143e92..6fd5a92 100644 --- a/source/ui/section/action/installcdn.c +++ b/source/ui/section/action/installcdn.c @@ -133,7 +133,7 @@ static Result action_install_cdn_close_dst(void* data, u32 index, bool succeeded } else { Result res = 0; if(R_SUCCEEDED(res = AM_InstallContentFinish(handle)) && index == 1 && installData->contentCount > 1 && (installData->ticket->titleId >> 32) == 0x0004008C) { - FS_MediaType dest = (installData->ticket->titleId & 0x0000801000000002) != 0 ? MEDIATYPE_NAND : MEDIATYPE_SD; + FS_MediaType dest = util_get_title_destination(installData->ticket->titleId); if(R_SUCCEEDED(res = AM_InstallTitleFinish()) && R_SUCCEEDED(res = AM_CommitImportTitles(dest, 1, false, &installData->ticket->titleId)) && R_SUCCEEDED(res = AM_InstallTitleBegin(dest, installData->ticket->titleId, false))) { @@ -181,7 +181,7 @@ static Result action_install_cdn_suspend(void* data, u32 index) { static Result action_install_cdn_restore(void* data, u32 index) { install_cdn_data* installData = (install_cdn_data*) data; - return AM_InstallTitleResume((installData->ticket->titleId & 0x0000801000000002) != 0 ? MEDIATYPE_NAND : MEDIATYPE_SD, installData->ticket->titleId); + return AM_InstallTitleResume(util_get_title_destination(installData->ticket->titleId), installData->ticket->titleId); } bool action_install_cdn_error(void* data, u32 index, Result res) { @@ -221,7 +221,7 @@ static void action_install_cdn_update(ui_view* view, void* data, float* progress if(R_SUCCEEDED(installData->installInfo.result)) { if(R_SUCCEEDED(res = AM_InstallTitleFinish()) - && R_SUCCEEDED(res = AM_CommitImportTitles((installData->ticket->titleId & 0x0000801000000002) != 0 ? MEDIATYPE_NAND : MEDIATYPE_SD, 1, false, &installData->ticket->titleId))) { + && R_SUCCEEDED(res = AM_CommitImportTitles(util_get_title_destination(installData->ticket->titleId), 1, false, &installData->ticket->titleId))) { util_import_seed(installData->ticket->titleId); if(installData->ticket->titleId == 0x0004013800000002 || installData->ticket->titleId == 0x0004013820000002) { @@ -256,7 +256,7 @@ static void action_install_cdn_update(ui_view* view, void* data, float* progress } static void action_install_cdn_start(install_cdn_data* data) { - FS_MediaType dest = (data->ticket->titleId & 0x0000801000000002) != 0 ? MEDIATYPE_NAND : MEDIATYPE_SD; + FS_MediaType dest = util_get_title_destination(data->ticket->titleId); AM_DeleteTitle(dest, data->ticket->titleId); if(dest == MEDIATYPE_SD) { diff --git a/source/ui/section/action/installcias.c b/source/ui/section/action/installcias.c index 08653ed..d240618 100644 --- a/source/ui/section/action/installcias.c +++ b/source/ui/section/action/installcias.c @@ -122,7 +122,7 @@ static Result action_install_cias_open_dst(void* data, u32 index, void* initialR u64 titleId = util_get_cia_title_id((u8*) initialReadBlock); - FS_MediaType dest = (titleId & 0x0000801000000002) != 0 ? MEDIATYPE_NAND : MEDIATYPE_SD; + FS_MediaType dest = util_get_title_destination(titleId); bool n3ds = false; if(R_SUCCEEDED(APT_CheckNew3DS(&n3ds)) && !n3ds && ((titleId >> 28) & 0xF) == 2) { diff --git a/source/ui/section/action/urlinstall.c b/source/ui/section/action/urlinstall.c index a800576..fb0300b 100644 --- a/source/ui/section/action/urlinstall.c +++ b/source/ui/section/action/urlinstall.c @@ -137,7 +137,7 @@ static Result action_url_install_open_dst(void* data, u32 index, void* initialRe } else if(*(u16*) initialReadBlock == 0x2020) { u64 titleId = util_get_cia_title_id((u8*) initialReadBlock); - FS_MediaType dest = (titleId & 0x0000801000000002) != 0 ? MEDIATYPE_NAND : MEDIATYPE_SD; + FS_MediaType dest = util_get_title_destination(titleId); bool n3ds = false; if(R_SUCCEEDED(APT_CheckNew3DS(&n3ds)) && !n3ds && ((titleId >> 28) & 0xF) == 2) { diff --git a/source/ui/section/networkinstall.c b/source/ui/section/networkinstall.c index afbcd0f..97d403c 100644 --- a/source/ui/section/networkinstall.c +++ b/source/ui/section/networkinstall.c @@ -142,7 +142,7 @@ static Result networkinstall_open_dst(void* data, u32 index, void* initialReadBl } else if(*(u16*) initialReadBlock == 0x2020) { u64 titleId = util_get_cia_title_id((u8*) initialReadBlock); - FS_MediaType dest = (titleId & 0x0000801000000002) != 0 ? MEDIATYPE_NAND : MEDIATYPE_SD; + FS_MediaType dest = util_get_title_destination(titleId); bool n3ds = false; if(R_SUCCEEDED(APT_CheckNew3DS(&n3ds)) && !n3ds && ((titleId >> 28) & 0xF) == 2) { diff --git a/source/ui/section/task/listfiles.c b/source/ui/section/task/listfiles.c index 1dd5721..b9b4b5a 100644 --- a/source/ui/section/task/listfiles.c +++ b/source/ui/section/task/listfiles.c @@ -68,7 +68,7 @@ Result task_create_file_item(list_item** out, FS_Archive archive, const char* pa fileInfo->ciaInfo.installedSize = titleEntry.size; fileInfo->ciaInfo.hasMeta = false; - if((titleEntry.titleID & 0x0000801000000002) != 0 && R_SUCCEEDED(AM_GetCiaFileInfo(MEDIATYPE_NAND, &titleEntry, fileHandle))) { + if(util_get_title_destination(titleEntry.titleID) != MEDIATYPE_SD && R_SUCCEEDED(AM_GetCiaFileInfo(MEDIATYPE_NAND, &titleEntry, fileHandle))) { fileInfo->ciaInfo.installedSize = titleEntry.size; } diff --git a/source/ui/section/task/listtitledb.c b/source/ui/section/task/listtitledb.c index cbc4806..a6aa3e8 100644 --- a/source/ui/section/task/listtitledb.c +++ b/source/ui/section/task/listtitledb.c @@ -10,6 +10,7 @@ #include "../../error.h" #include "../../../core/linkedlist.h" #include "../../../core/screen.h" +#include "../../../core/util.h" #include "../../../json/json.h" #include "../../../stb_image/stb_image.h" @@ -117,7 +118,7 @@ static void task_populate_titledb_thread(void* arg) { } AM_TitleEntry entry; - if(R_SUCCEEDED(AM_GetTitleInfo((titledbInfo->titleId & 0x0000801000000002) != 0 ? MEDIATYPE_NAND : MEDIATYPE_SD, 1, &titledbInfo->titleId, &entry))) { + if(R_SUCCEEDED(AM_GetTitleInfo(util_get_title_destination(titledbInfo->titleId), 1, &titledbInfo->titleId, &entry))) { item->color = COLOR_INSTALLED; } else { item->color = COLOR_NOT_INSTALLED;