mirror of
https://github.com/DarkMatterCore/nxdumptool.git
synced 2024-11-13 22:16:45 +00:00
0f1055c84e
This commit uses my yet unmerged libnx PR to update ncm_types.h. PoC code hasn't been updated yet, so proper support for DLC updates will arrive at a later time. Note to self: implement a way to provide access to loaded DataPatch TitleInfo entries (linked list hell). * bktr: renamed bktrBucketInitializeSubStorageReadParams to bktrInitializeSubStorageReadParams to avoid redundancy, added debug code to dump BucketInfo and BucketTree tables if BucketTree storage initialization fails. * cnmt: updated ContentMetaAddOnContentMetaExtendedHeader struct to its 15.x equivalent, added ContentMetaLegacyAddOnContentMetaExtendedHeader struct, added ContentMetaDataPatchMetaExtendedHeader struct, updated the cnmtGetRequiredTitleId and cnmtGetRequiredTitleVersion functions to support DataPatch titles, updated cnmtInitializeContext to support both the new AddOnContent extended header and DataPatch titles, added debug code to dump the whole CNMT if context initialization fails, updated cnmtGenerateAuthoringToolXml to support DataPatch titles. * keys: updated block hashes to match 15.x keyset, use case-insensitive comparison while looking for entry names in keysReadKeysFromFile, make sure the eticket_rsa_kek is non-zero before proceeding in keysGetDecryptedEticketRsaDeviceKey. * nca: updated NcaKeyGeneration enum, added reminder about updating NcaSignatureKeyGeneration if necessary, replaced ncaFsSectionCheckHashRegionAccess with ncaFsSectionCheckPlaintextHashRegionAccess, removed all extents checks on Patch RomFS and sparse sections, updated ncaGetFsSectionTypeName to reflect if a FS section holds a sparse layer or not. * nca_storage: updated ncaStorageInitializeContext to avoid initializing a compressed storage if a sparse layer is also used (fixes issues with Them's Fightin' Herds), updated ncaStorageSetPatchOriginalSubStorage to enforce the presence of a compressed storage in a patch if the base FS holds a compressed storage. * npdm: added reminder about updating NpdmSignatureKeyGeneration if necessary, updated NpdmFsAccessControlFlags enum, updated NpdmAccessibility enum, updated NpdmSystemCallId enum, fixed typos. * title: updated all relevant functions that deal with NcmContentMetaType values to also handle DataPatch titles, added functions to handle DataPatchId values, removed titleConvertNcmContentSizeToU64 and titleConvertU64ToNcmContentSize functions in favor of ncmContentInfoSizeToU64 and ncmU64ToContentInfoSize from my unmerged libnx PR, updated internal arrays to match 15.x changes, renamed titleOrphanTitleInfoSortFunction to titleInfoEntrySortFunction and updated it to also sort entries by version and storage ID, updated titleGenerateTitleInfoEntriesForTitleStorage to sort TitleInfo entries, simplified titleDuplicateTitleInfo a bit by using macros.
80 lines
4.5 KiB
C
80 lines
4.5 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, sizeof(g_titleInfo[i].content_infos[j].content_id.c), false);
|
|
|
|
u64 content_size = 0;
|
|
ncmContentInfoSizeToU64(&(g_titleInfo[i].content_infos[j]), &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].app_metadata)
|
|
{
|
|
TitleApplicationMetadata *app_metadata = g_titleInfo[i].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();
|
|
}
|
|
}
|