1
0
Fork 0
mirror of https://github.com/DarkMatterCore/nxdumptool.git synced 2024-11-22 18:26:39 +00:00

More code cleanup.

This commit is contained in:
Pablo Curiel 2020-10-14 14:58:33 -04:00
parent 13efdb6074
commit 5b22fe07f2
8 changed files with 75 additions and 55 deletions

View file

@ -385,7 +385,8 @@ static void certCopyCertificateChainDataToMemoryBuffer(void *dst, const Certific
u8 *dst_u8 = (u8*)dst; u8 *dst_u8 = (u8*)dst;
for(u32 i = 0; i < chain->count; i++) for(u32 i = 0; i < chain->count; i++)
{ {
memcpy(dst_u8, chain->certs[i].data, chain->certs[i].size); Certificate *cert = &(chain->certs[i]);
dst_u8 += chain->certs[i].size; memcpy(dst_u8, cert->data, cert->size);
dst_u8 += cert->size;
} }
} }

View file

@ -290,24 +290,26 @@ bool cnmtGenerateAuthoringToolXml(ContentMetaContext *cnmt_ctx, NcaContext *nca_
for(i = 0; i < nca_ctx_count; i++) for(i = 0; i < nca_ctx_count; i++)
{ {
NcaContext *cur_nca_ctx = &(nca_ctx[i]);
/* Check if this NCA is really referenced by our CNMT. */ /* Check if this NCA is really referenced by our CNMT. */
if (nca_ctx[i].content_type != NcmContentType_Meta) if (cur_nca_ctx->content_type != NcmContentType_Meta)
{ {
/* Non-Meta NCAs: check if their content IDs are part of the packaged content info entries from the CNMT. */ /* Non-Meta NCAs: check if their content IDs are part of the packaged content info entries from the CNMT. */
for(j = 0; j < cnmt_ctx->packaged_header->content_count; j++) for(j = 0; j < cnmt_ctx->packaged_header->content_count; j++)
{ {
if (!memcmp(cnmt_ctx->packaged_content_info[j].info.content_id.c, nca_ctx[i].content_id.c, 0x10)) break; if (!memcmp(cnmt_ctx->packaged_content_info[j].info.content_id.c, cur_nca_ctx->content_id.c, 0x10)) break;
} }
invalid_nca = (j >= cnmt_ctx->packaged_header->content_count); invalid_nca = (j >= cnmt_ctx->packaged_header->content_count);
} else { } else {
/* Meta NCAs: quick and dirty pointer comparison because why not. */ /* Meta NCAs: quick and dirty pointer comparison because why not. */
invalid_nca = (cnmt_ctx->nca_ctx != &(nca_ctx[i])); invalid_nca = (cnmt_ctx->nca_ctx != cur_nca_ctx);
} }
if (invalid_nca) if (invalid_nca)
{ {
LOGFILE("NCA \"%s\" isn't referenced by this CNMT!", nca_ctx[i].content_id_str); LOGFILE("NCA \"%s\" isn't referenced by this CNMT!", cur_nca_ctx->content_id_str);
goto end; goto end;
} }
@ -320,12 +322,12 @@ bool cnmtGenerateAuthoringToolXml(ContentMetaContext *cnmt_ctx, NcaContext *nca_
" <KeyGeneration>%u</KeyGeneration>\n" \ " <KeyGeneration>%u</KeyGeneration>\n" \
" <IdOffset>%u</IdOffset>\n" \ " <IdOffset>%u</IdOffset>\n" \
" </Content>\n", \ " </Content>\n", \
titleGetNcmContentTypeName(nca_ctx[i].content_type), \ titleGetNcmContentTypeName(cur_nca_ctx->content_type), \
nca_ctx[i].content_id_str, \ cur_nca_ctx->content_id_str, \
nca_ctx[i].content_size, \ cur_nca_ctx->content_size, \
nca_ctx[i].hash_str, \ cur_nca_ctx->hash_str, \
nca_ctx[i].key_generation, \ cur_nca_ctx->key_generation, \
nca_ctx[i].id_offset)) goto end; cur_nca_ctx->id_offset)) goto end;
} }
utilsGenerateHexStringFromData(digest_str, sizeof(digest_str), cnmt_ctx->digest, CNMT_DIGEST_SIZE); utilsGenerateHexStringFromData(digest_str, sizeof(digest_str), cnmt_ctx->digest, CNMT_DIGEST_SIZE);

View file

@ -682,6 +682,8 @@ static void gamecardLoadInfo(void)
/* Read hash FS partitions. */ /* Read hash FS partitions. */
for(u32 i = 0; i < fs_header->entry_count; i++) for(u32 i = 0; i < fs_header->entry_count; i++)
{ {
GameCardHashFileSystemPartitionInfo *hfs_partition = &(g_gameCardHfsPartitions[i]);
fs_entry = gamecardGetHashFileSystemEntryByIndex(g_gameCardHfsRootHeader, i); fs_entry = gamecardGetHashFileSystemEntryByIndex(g_gameCardHfsRootHeader, i);
if (!fs_entry || !fs_entry->size) if (!fs_entry || !fs_entry->size)
{ {
@ -689,14 +691,14 @@ static void gamecardLoadInfo(void)
goto end; goto end;
} }
g_gameCardHfsPartitions[i].offset = (g_gameCardHeader.partition_fs_header_address + g_gameCardHeader.partition_fs_header_size + fs_entry->offset); hfs_partition->offset = (g_gameCardHeader.partition_fs_header_address + g_gameCardHeader.partition_fs_header_size + fs_entry->offset);
g_gameCardHfsPartitions[i].size = fs_entry->size; hfs_partition->size = fs_entry->size;
/* Partially read the current hash FS partition header. */ /* Partially read the current hash FS partition header. */
GameCardHashFileSystemHeader partition_header = {0}; GameCardHashFileSystemHeader partition_header = {0};
if (!gamecardReadStorageArea(&partition_header, sizeof(GameCardHashFileSystemHeader), g_gameCardHfsPartitions[i].offset, false)) if (!gamecardReadStorageArea(&partition_header, sizeof(GameCardHashFileSystemHeader), hfs_partition->offset, false))
{ {
LOGFILE("Failed to partially read hash FS partition #%u header from offset 0x%lX!", i, g_gameCardHfsPartitions[i].offset); LOGFILE("Failed to partially read hash FS partition #%u header from offset 0x%lX!", i, hfs_partition->offset);
goto end; goto end;
} }
@ -713,21 +715,21 @@ static void gamecardLoadInfo(void)
} }
/* Calculate the full header size for the current hash FS partition and round it to a GAMECARD_MEDIA_UNIT_SIZE bytes boundary. */ /* Calculate the full header size for the current hash FS partition and round it to a GAMECARD_MEDIA_UNIT_SIZE bytes boundary. */
g_gameCardHfsPartitions[i].header_size = (sizeof(GameCardHashFileSystemHeader) + (partition_header.entry_count * sizeof(GameCardHashFileSystemEntry)) + partition_header.name_table_size); hfs_partition->header_size = (sizeof(GameCardHashFileSystemHeader) + (partition_header.entry_count * sizeof(GameCardHashFileSystemEntry)) + partition_header.name_table_size);
g_gameCardHfsPartitions[i].header_size = ALIGN_UP(g_gameCardHfsPartitions[i].header_size, GAMECARD_MEDIA_UNIT_SIZE); hfs_partition->header_size = ALIGN_UP(hfs_partition->header_size, GAMECARD_MEDIA_UNIT_SIZE);
/* Allocate memory for the hash FS partition header. */ /* Allocate memory for the hash FS partition header. */
g_gameCardHfsPartitions[i].header = calloc(g_gameCardHfsPartitions[i].header_size, sizeof(u8)); hfs_partition->header = calloc(hfs_partition->header_size, sizeof(u8));
if (!g_gameCardHfsPartitions[i].header) if (!hfs_partition->header)
{ {
LOGFILE("Unable to allocate memory for the hash FS partition #%u header!", i); LOGFILE("Unable to allocate memory for the hash FS partition #%u header!", i);
goto end; goto end;
} }
/* Finally, read the full hash FS partition header. */ /* Finally, read the full hash FS partition header. */
if (!gamecardReadStorageArea(g_gameCardHfsPartitions[i].header, g_gameCardHfsPartitions[i].header_size, g_gameCardHfsPartitions[i].offset, false)) if (!gamecardReadStorageArea(hfs_partition->header, hfs_partition->header_size, hfs_partition->offset, false))
{ {
LOGFILE("Failed to read full hash FS partition #%u header from offset 0x%lX!", i, g_gameCardHfsPartitions[i].offset); LOGFILE("Failed to read full hash FS partition #%u header from offset 0x%lX!", i, hfs_partition->offset);
goto end; goto end;
} }
} }

View file

@ -265,23 +265,25 @@ static bool keysRetrieveKeysFromProgramMemory(KeysMemoryInfo *info)
{ {
found = false; found = false;
if (!info->keys[i].dst) KeysMemoryKey *key = &(info->keys[i]);
if (!key->dst)
{ {
LOGFILE("Invalid destination pointer for key \"%s\" in program %016lX!", info->keys[i].name, info->location.program_id); LOGFILE("Invalid destination pointer for key \"%s\" in program %016lX!", key->name, info->location.program_id);
goto end; goto end;
} }
/* Hash every key length-sized byte chunk in the process memory buffer until a match is found. */ /* Hash every key length-sized byte chunk in the process memory buffer until a match is found. */
for(u64 j = 0; j < info->location.data_size; j++) for(u64 j = 0; j < info->location.data_size; j++)
{ {
if ((info->location.data_size - j) < info->keys[i].size) break; if ((info->location.data_size - j) < key->size) break;
sha256CalculateHash(tmp_hash, info->location.data + j, info->keys[i].size); sha256CalculateHash(tmp_hash, info->location.data + j, key->size);
if (!memcmp(tmp_hash, info->keys[i].hash, SHA256_HASH_SIZE)) if (!memcmp(tmp_hash, key->hash, SHA256_HASH_SIZE))
{ {
/* Jackpot. */ /* Jackpot. */
memcpy(info->keys[i].dst, info->location.data + j, info->keys[i].size); memcpy(key->dst, info->location.data + j, key->size);
found = true; found = true;
break; break;
} }
@ -289,7 +291,7 @@ static bool keysRetrieveKeysFromProgramMemory(KeysMemoryInfo *info)
if (!found) if (!found)
{ {
LOGFILE("Unable to locate key \"%s\" in process memory from program %016lX!", info->keys[i].name, info->location.program_id); LOGFILE("Unable to locate key \"%s\" in process memory from program %016lX!", key->name, info->location.program_id);
goto end; goto end;
} }
} }

View file

@ -363,7 +363,8 @@ bool nacpGenerateAuthoringToolXml(NacpContext *nacp_ctx, u32 version, u32 requir
/* Title. */ /* Title. */
for(i = 0, count = 0; i < NacpLanguage_Count; i++) for(i = 0, count = 0; i < NacpLanguage_Count; i++)
{ {
if (!strlen(nacp->title[i].name) || !strlen(nacp->title[i].publisher)) continue; NacpTitle *title = &(nacp->title[i]);
if (!strlen(title->name) || !strlen(title->publisher)) continue;
if (!utilsAppendFormattedStringToBuffer(&xml_buf, &xml_buf_size, \ if (!utilsAppendFormattedStringToBuffer(&xml_buf, &xml_buf_size, \
" <Title>\n" \ " <Title>\n" \
@ -372,8 +373,8 @@ bool nacpGenerateAuthoringToolXml(NacpContext *nacp_ctx, u32 version, u32 requir
" <Publisher>%s</Publisher>\n" \ " <Publisher>%s</Publisher>\n" \
" </Title>\n", \ " </Title>\n", \
nacpGetLanguageString(i), nacpGetLanguageString(i),
nacp->title[i].name, title->name,
nacp->title[i].publisher)) goto end; title->publisher)) goto end;
count++; count++;
} }
@ -621,14 +622,16 @@ bool nacpGenerateAuthoringToolXml(NacpContext *nacp_ctx, u32 version, u32 requir
/* ReceivableGroupConfiguration. */ /* ReceivableGroupConfiguration. */
for(i = 0; i < 0x10; i++) for(i = 0; i < 0x10; i++)
{ {
utilsGenerateHexStringFromData(key_str, sizeof(key_str), ndcc->receivable_group_configurations[i].key, sizeof(ndcc->receivable_group_configurations[i].key)); NacpApplicationNeighborDetectionGroupConfiguration *rgc = &(ndcc->receivable_group_configurations[i]);
utilsGenerateHexStringFromData(key_str, sizeof(key_str), rgc->key, sizeof(rgc->key));
if (!utilsAppendFormattedStringToBuffer(&xml_buf, &xml_buf_size, \ if (!utilsAppendFormattedStringToBuffer(&xml_buf, &xml_buf_size, \
" <ReceivableGroupConfiguration>\n" \ " <ReceivableGroupConfiguration>\n" \
" <GroupId>0x%016lx</GroupId>\n" \ " <GroupId>0x%016lx</GroupId>\n" \
" <Key>%s</Key>\n" \ " <Key>%s</Key>\n" \
" </ReceivableGroupConfiguration>\n", \ " </ReceivableGroupConfiguration>\n", \
ndcc->receivable_group_configurations[i].group_id, rgc->group_id,
key_str)) goto end; key_str)) goto end;
} }
@ -649,13 +652,14 @@ bool nacpGenerateAuthoringToolXml(NacpContext *nacp_ctx, u32 version, u32 requir
/* RequiredAddOnContentsSet. */ /* RequiredAddOnContentsSet. */
for(i = 0, count = 0; i < 0x20; i++) for(i = 0, count = 0; i < 0x20; i++)
{ {
if (!raocsbd->descriptors[i].index || !raocsbd->descriptors[i].continue_set) continue; NacpDescriptors *descriptor = &(raocsbd->descriptors[i]);
if (!descriptor->index || !descriptor->continue_set) continue;
if (!utilsAppendFormattedStringToBuffer(&xml_buf, &xml_buf_size, \ if (!utilsAppendFormattedStringToBuffer(&xml_buf, &xml_buf_size, \
" <RequiredAddOnContentsSet>\n" \ " <RequiredAddOnContentsSet>\n" \
" <Index>%u</Index>\n" \ " <Index>%u</Index>\n" \
" </RequiredAddOnContentsSet>\n", " </RequiredAddOnContentsSet>\n",
raocsbd->descriptors[i].index)) goto end; descriptor->index)) goto end;
count++; count++;
} }

View file

@ -441,8 +441,8 @@ NX_INLINE bool ncaValidateHierarchicalSha256Offsets(NcaHierarchicalSha256Data *h
for(u32 i = 0; i < hierarchical_sha256_data->hash_region_count; i++) for(u32 i = 0; i < hierarchical_sha256_data->hash_region_count; i++)
{ {
if (hierarchical_sha256_data->hash_region[i].offset >= section_size || !hierarchical_sha256_data->hash_region[i].size || \ NcaRegion *hash_region = &(hierarchical_sha256_data->hash_region[i]);
(hierarchical_sha256_data->hash_region[i].offset + hierarchical_sha256_data->hash_region[i].size) > section_size) return false; if (hash_region->offset >= section_size || !hash_region->size || (hash_region->offset + hash_region->size) > section_size) return false;
} }
return true; return true;
@ -455,9 +455,8 @@ NX_INLINE bool ncaValidateHierarchicalIntegrityOffsets(NcaIntegrityMetaInfo *int
for(u32 i = 0; i < NCA_IVFC_LEVEL_COUNT; i++) for(u32 i = 0; i < NCA_IVFC_LEVEL_COUNT; i++)
{ {
if (integrity_meta_info->info_level_hash.level_information[i].offset >= section_size || !integrity_meta_info->info_level_hash.level_information[i].size || \ NcaHierarchicalIntegrityVerificationLevelInformation *level_information = &(integrity_meta_info->info_level_hash.level_information[i]);
!integrity_meta_info->info_level_hash.level_information[i].block_order || \ if (level_information->offset >= section_size || !level_information->size || !level_information->block_order || (level_information->offset + level_information->size) > section_size) return false;
(integrity_meta_info->info_level_hash.level_information[i].offset + integrity_meta_info->info_level_hash.level_information[i].size) > section_size) return false;
} }
return true; return true;

View file

@ -583,9 +583,11 @@ TitleApplicationMetadata **titleGetApplicationMetadataEntries(bool is_system, u3
for(u32 i = start_idx; i < max_val; i++) for(u32 i = start_idx; i < max_val; i++)
{ {
TitleApplicationMetadata *cur_app_metadata = &(g_appMetadata[i]);
/* Skip current metadata entry if content data for this title isn't available. */ /* Skip current metadata entry if content data for this title isn't available. */
if ((is_system && !_titleGetInfoFromStorageByTitleId(NcmStorageId_BuiltInSystem, g_appMetadata[i].title_id, false)) || \ if ((is_system && !_titleGetInfoFromStorageByTitleId(NcmStorageId_BuiltInSystem, cur_app_metadata->title_id, false)) || \
(!is_system && !titleIsUserApplicationContentAvailable(g_appMetadata[i].title_id))) continue; (!is_system && !titleIsUserApplicationContentAvailable(cur_app_metadata->title_id))) continue;
/* Reallocate pointer buffer. */ /* Reallocate pointer buffer. */
tmp_app_metadata = realloc(app_metadata, (app_count + 1) * sizeof(TitleApplicationMetadata*)); tmp_app_metadata = realloc(app_metadata, (app_count + 1) * sizeof(TitleApplicationMetadata*));
@ -601,7 +603,7 @@ TitleApplicationMetadata **titleGetApplicationMetadataEntries(bool is_system, u3
tmp_app_metadata = NULL; tmp_app_metadata = NULL;
/* Set current pointer and increase counter. */ /* Set current pointer and increase counter. */
app_metadata[app_count++] = &(g_appMetadata[i]); app_metadata[app_count++] = cur_app_metadata;
} }
if (app_metadata && app_count) if (app_metadata && app_count)
@ -647,9 +649,10 @@ bool titleGetUserApplicationData(u64 app_id, TitleUserApplicationData *out)
/* Get first add-on content title info. */ /* Get first add-on content title info. */
for(u32 i = 0; i < g_titleInfoCount; i++) for(u32 i = 0; i < g_titleInfoCount; i++)
{ {
if (g_titleInfo[i].meta_key.type == NcmContentMetaType_AddOnContent && titleCheckIfAddOnContentIdBelongsToApplicationId(app_id, g_titleInfo[i].meta_key.id)) TitleInfo *title_info = &(g_titleInfo[i]);
if (title_info->meta_key.type == NcmContentMetaType_AddOnContent && titleCheckIfAddOnContentIdBelongsToApplicationId(app_id, title_info->meta_key.id))
{ {
out->aoc_info = &(g_titleInfo[i]); out->aoc_info = title_info;
break; break;
} }
} }
@ -699,7 +702,8 @@ TitleInfo **titleGetInfoFromOrphanTitles(u32 *out_count)
/* Get pointers to orphan title info entries. */ /* Get pointers to orphan title info entries. */
for(u32 i = 0, j = 0; i < g_titleInfoCount && j < g_titleInfoOrphanCount; i++) for(u32 i = 0, j = 0; i < g_titleInfoCount && j < g_titleInfoOrphanCount; i++)
{ {
if ((g_titleInfo[i].meta_key.type == NcmContentMetaType_Patch || g_titleInfo[i].meta_key.type == NcmContentMetaType_AddOnContent) && !g_titleInfo[i].parent) orphan_info[j++] = &(g_titleInfo[i]); TitleInfo *title_info = &(g_titleInfo[i]);
if ((title_info->meta_key.type == NcmContentMetaType_Patch || title_info->meta_key.type == NcmContentMetaType_AddOnContent) && !title_info->parent) orphan_info[j++] = title_info;
} }
/* Sort orphan title info entries by title ID. */ /* Sort orphan title info entries by title ID. */
@ -936,8 +940,11 @@ static bool titleGenerateMetadataEntriesFromSystemTitles(void)
/* Fill new application metadata entries. */ /* Fill new application metadata entries. */
for(u32 i = 0; i < g_systemTitlesCount; i++) for(u32 i = 0; i < g_systemTitlesCount; i++)
{ {
g_appMetadata[g_appMetadataCount + i].title_id = g_systemTitles[i].title_id; TitleApplicationMetadata *app_metadata = &(g_appMetadata[g_appMetadataCount + i]);
sprintf(g_appMetadata[g_appMetadataCount + i].lang_entry.name, g_systemTitles[i].name); const SystemTitleName *system_title = &(g_systemTitles[i]);
app_metadata->title_id = system_title->title_id;
sprintf(app_metadata->lang_entry.name, system_title->name);
} }
/* Sort metadata entries by title ID. */ /* Sort metadata entries by title ID. */
@ -1358,12 +1365,12 @@ static bool titleRetrieveContentMetaKeysFromDatabase(u8 storage_id)
/* Fill information. */ /* Fill information. */
cur_title_info->storage_id = storage_id; cur_title_info->storage_id = storage_id;
memcpy(&(cur_title_info->meta_key), &(meta_keys[i]), sizeof(NcmContentMetaKey)); memcpy(&(cur_title_info->meta_key), &(meta_keys[i]), sizeof(NcmContentMetaKey));
cur_title_info->version.value = meta_keys[i].version; cur_title_info->version.value = cur_title_info->meta_key.version;
if (cur_title_info->meta_key.type <= NcmContentMetaType_Application) cur_title_info->app_metadata = titleFindApplicationMetadataByTitleId(meta_keys[i].id); if (cur_title_info->meta_key.type <= NcmContentMetaType_Application) cur_title_info->app_metadata = titleFindApplicationMetadataByTitleId(cur_title_info->meta_key.id);
/* Retrieve content infos. */ /* Retrieve content infos. */
if (titleGetContentInfosFromTitle(storage_id, &(meta_keys[i]), &(cur_title_info->content_infos), &(cur_title_info->content_count))) if (titleGetContentInfosFromTitle(storage_id, &(cur_title_info->meta_key), &(cur_title_info->content_infos), &(cur_title_info->content_count)))
{ {
/* Calculate title size. */ /* Calculate title size. */
u64 tmp_size = 0; u64 tmp_size = 0;
@ -1779,9 +1786,11 @@ static TitleInfo *_titleGetInfoFromStorageByTitleId(u8 storage_id, u64 title_id,
for(u32 i = start_idx; i < max_val; i++) for(u32 i = start_idx; i < max_val; i++)
{ {
if (g_titleInfo[i].meta_key.id == title_id && (storage_id == NcmStorageId_Any || (storage_id != NcmStorageId_Any && g_titleInfo[i].storage_id == storage_id))) TitleInfo *title_info = &(g_titleInfo[i]);
if (title_info->meta_key.id == title_id && (storage_id == NcmStorageId_Any || (storage_id != NcmStorageId_Any && title_info->storage_id == storage_id)))
{ {
info = &(g_titleInfo[i]); info = title_info;
break; break;
} }
} }

View file

@ -215,7 +215,8 @@ NX_INLINE NcmContentInfo *titleGetContentInfoByTypeAndIdOffset(TitleInfo *info,
for(u32 i = 0; i < info->content_count; i++) for(u32 i = 0; i < info->content_count; i++)
{ {
if (info->content_infos[i].content_type == content_type && info->content_infos[i].id_offset == id_offset) return &(info->content_infos[i]); NcmContentInfo *cur_content_info = &(info->content_infos[i]);
if (cur_content_info->content_type == content_type && cur_content_info->id_offset == id_offset) return cur_content_info;
} }
return NULL; return NULL;