mirror of
https://github.com/DarkMatterCore/nxdumptool.git
synced 2024-11-26 20:22:17 +00:00
15431ec2c8
* AES: moved CTR initializing/updating functions here from nca.c. * BKTR/RomFS/PFS: check if we're dealing with a NCA with titlekey crypto and the titlekey hasn't been retrieved. * BFTTF: use void pointers for output font data. * Mem: Only exclude Unmapped/Uo/ThreadLocal/Reserved memory pages if dealing with FS. * NCA: use content type context pointers inside NCA contexts to manage ContentMeta, ProgramInfo, Nacp and LegalInfo contexts. * NCA: added 'written' bool elements to patch structs to indicate patch write completion. * NPDM: remove unnecessary inline functions, generate PFS patch right after changing ACID data, add a pfsWriteEntryPatchToMemoryBuffer wrapper. * PFS: added PartitionFileSystemFileContext and related functions to deal with NSP headers. * ProgramInfo: removed unnecessary inline functions. * Save: added commented code to dump a full system savefile - will probably use it down the road. * Tik: added support for volatile tickets (thanks to @shchmue and @Whovian9369!), added a rights ID string representation to the Ticket struct, clear Volatile and ELicenseRequired flags in conversions to common tickets. * Title: added a function to calculate the number of titles (current + siblings) from a TItleInfo block. * Utils: added a function to generate a dynamically allocated path string using a prefix, a filename and a extension. * Removed explicit offset checks throughout all the code. * Codestyle fixes. * Updated to-do.
81 lines
No EOL
5.1 KiB
C
81 lines
No EOL
5.1 KiB
C
if (g_titleInfo && g_titleInfoCount)
|
|
{
|
|
mkdir("sdmc:/records", 0777);
|
|
|
|
FILE *title_infos_txt = NULL, *icon_jpg = NULL;
|
|
char icon_path[FS_MAX_PATH] = {0};
|
|
|
|
title_infos_txt = fopen("sdmc:/records/title_infos.txt", "wb");
|
|
if (title_infos_txt)
|
|
{
|
|
for(u32 i = 0; i < g_titleInfoCount; i++)
|
|
{
|
|
fprintf(title_infos_txt, "Storage ID: 0x%02X\r\n", g_titleInfo[i].storage_id);
|
|
fprintf(title_infos_txt, "Title ID: %016lX\r\n", g_titleInfo[i].meta_key.id);
|
|
fprintf(title_infos_txt, "Version: %u (%u.%u.%u-%u.%u)\r\n", g_titleInfo[i].meta_key.version, g_titleInfo[i].version.major, \
|
|
g_titleInfo[i].version.minor, g_titleInfo[i].version.micro, g_titleInfo[i].version.major_relstep, \
|
|
g_titleInfo[i].version.minor_relstep);
|
|
fprintf(title_infos_txt, "Type: 0x%02X\r\n", g_titleInfo[i].meta_key.type);
|
|
fprintf(title_infos_txt, "Install Type: 0x%02X\r\n", g_titleInfo[i].meta_key.install_type);
|
|
fprintf(title_infos_txt, "Title Size: %s (0x%lX)\r\n", g_titleInfo[i].size_str, g_titleInfo[i].size);
|
|
|
|
fprintf(title_infos_txt, "Content Count: %u\r\n", g_titleInfo[i].content_count);
|
|
for(u32 j = 0; j < g_titleInfo[i].content_count; j++)
|
|
{
|
|
char content_id_str[SHA256_HASH_SIZE + 1] = {0};
|
|
utilsGenerateHexStringFromData(content_id_str, sizeof(content_id_str), g_titleInfo[i].content_infos[j].content_id.c, SHA256_HASH_SIZE / 2);
|
|
|
|
u64 content_size = 0;
|
|
titleConvertNcmContentSizeToU64(g_titleInfo[i].content_infos[j].size, &content_size);
|
|
|
|
char content_size_str[32] = {0};
|
|
utilsGenerateFormattedSizeString(content_size, content_size_str, sizeof(content_size_str));
|
|
|
|
fprintf(title_infos_txt, " Content #%u:\r\n", j + 1);
|
|
fprintf(title_infos_txt, " Content ID: %s\r\n", content_id_str);
|
|
fprintf(title_infos_txt, " Content Size: %s (0x%lX)\r\n", content_size_str, content_size);
|
|
fprintf(title_infos_txt, " Content Type: 0x%02X\r\n", g_titleInfo[i].content_infos[j].content_type);
|
|
fprintf(title_infos_txt, " ID Offset: 0x%02X\r\n", g_titleInfo[i].content_infos[j].id_offset);
|
|
}
|
|
|
|
if ((g_titleInfo[i].meta_key.type == NcmContentMetaType_Application && g_titleInfo[i].app_metadata) || ((g_titleInfo[i].meta_key.type == NcmContentMetaType_Patch || \
|
|
g_titleInfo[i].meta_key.type == NcmContentMetaType_AddOnContent) && g_titleInfo[i].parent && g_titleInfo[i].parent->app_metadata))
|
|
{
|
|
TitleApplicationMetadata *app_metadata = (g_titleInfo[i].meta_key.type == NcmContentMetaType_Application ? g_titleInfo[i].app_metadata : g_titleInfo[i].parent->app_metadata);
|
|
|
|
if (strlen(app_metadata->lang_entry.name)) fprintf(title_infos_txt, "Name: %s\r\n", app_metadata->lang_entry.name);
|
|
if (strlen(app_metadata->lang_entry.author)) fprintf(title_infos_txt, "Author: %s\r\n", app_metadata->lang_entry.author);
|
|
|
|
if (g_titleInfo[i].meta_key.type == NcmContentMetaType_Application && app_metadata->icon_size && app_metadata->icon)
|
|
{
|
|
fprintf(title_infos_txt, "JPEG Icon Size: 0x%X\r\n", app_metadata->icon_size);
|
|
|
|
sprintf(icon_path, "sdmc:/records/%016lX.jpg", app_metadata->title_id);
|
|
|
|
icon_jpg = fopen(icon_path, "wb");
|
|
if (icon_jpg)
|
|
{
|
|
fwrite(app_metadata->icon, 1, app_metadata->icon_size, icon_jpg);
|
|
fclose(icon_jpg);
|
|
icon_jpg = NULL;
|
|
utilsCommitSdCardFileSystemChanges();
|
|
}
|
|
}
|
|
}
|
|
|
|
if (g_titleInfo[i].meta_key.type == NcmContentMetaType_Patch || g_titleInfo[i].meta_key.type == NcmContentMetaType_AddOnContent)
|
|
{
|
|
if (g_titleInfo[i].previous) fprintf(title_infos_txt, "Previous %s ID: %016lX\r\n", g_titleInfo[i].meta_key.type == NcmContentMetaType_Patch ? "Patch" : "AOC", g_titleInfo[i].previous->meta_key.id);
|
|
if (g_titleInfo[i].next) fprintf(title_infos_txt, "Next %s ID: %016lX\r\n", g_titleInfo[i].meta_key.type == NcmContentMetaType_Patch ? "Patch" : "AOC", g_titleInfo[i].next->meta_key.id);
|
|
}
|
|
|
|
fprintf(title_infos_txt, "\r\n");
|
|
|
|
fflush(title_infos_txt);
|
|
}
|
|
|
|
fclose(title_infos_txt);
|
|
title_infos_txt = NULL;
|
|
utilsCommitSdCardFileSystemChanges();
|
|
}
|
|
} |