Improve automatic detection of .cnmt files.

This commit is contained in:
Jack 2020-05-23 17:59:54 +08:00
parent 33a6f391e9
commit 4f41774002

View file

@ -758,33 +758,43 @@ bool UserSettings::determineValidCnmtFromSample(const fnd::Vec<byte_t>& sample)
if (sample.size() < minimum_size) if (sample.size() < minimum_size)
return false; return false;
if (data->type == (byte_t)nn::hac::cnmt::ContentMetaType::Application) // include exthdr/data check if applicable
if (data->exhdr_size.get() > 0)
{ {
const nn::hac::sApplicationMetaExtendedHeader* meta = (const nn::hac::sApplicationMetaExtendedHeader*)(sample.data() + sizeof(nn::hac::sContentMetaHeader)); if (data->type == (byte_t)nn::hac::cnmt::ContentMetaType::Application)
if ((meta->patch_id.get() & data->id.get()) != data->id.get()) {
return false; const nn::hac::sApplicationMetaExtendedHeader* meta = (const nn::hac::sApplicationMetaExtendedHeader*)(sample.data() + sizeof(nn::hac::sContentMetaHeader));
} if ((meta->patch_id.get() & data->id.get()) != data->id.get())
else if (data->type == (byte_t)nn::hac::cnmt::ContentMetaType::Patch) return false;
{ }
const nn::hac::sPatchMetaExtendedHeader* meta = (const nn::hac::sPatchMetaExtendedHeader*)(sample.data() + sizeof(nn::hac::sContentMetaHeader)); else if (data->type == (byte_t)nn::hac::cnmt::ContentMetaType::Patch)
if ((meta->application_id.get() & data->id.get()) != meta->application_id.get()) {
return false; const nn::hac::sPatchMetaExtendedHeader* meta = (const nn::hac::sPatchMetaExtendedHeader*)(sample.data() + sizeof(nn::hac::sContentMetaHeader));
if ((meta->application_id.get() & data->id.get()) != meta->application_id.get())
return false;
minimum_size += meta->extended_data_size.get(); minimum_size += meta->extended_data_size.get();
} }
else if (data->type == (byte_t)nn::hac::cnmt::ContentMetaType::AddOnContent) else if (data->type == (byte_t)nn::hac::cnmt::ContentMetaType::AddOnContent)
{ {
const nn::hac::sAddOnContentMetaExtendedHeader* meta = (const nn::hac::sAddOnContentMetaExtendedHeader*)(sample.data() + sizeof(nn::hac::sContentMetaHeader)); const nn::hac::sAddOnContentMetaExtendedHeader* meta = (const nn::hac::sAddOnContentMetaExtendedHeader*)(sample.data() + sizeof(nn::hac::sContentMetaHeader));
if ((meta->application_id.get() & data->id.get()) != meta->application_id.get()) if ((meta->application_id.get() & data->id.get()) != meta->application_id.get())
return false; return false;
} }
else if (data->type == (byte_t)nn::hac::cnmt::ContentMetaType::Delta) else if (data->type == (byte_t)nn::hac::cnmt::ContentMetaType::Delta)
{ {
const nn::hac::sDeltaMetaExtendedHeader* meta = (const nn::hac::sDeltaMetaExtendedHeader*)(sample.data() + sizeof(nn::hac::sContentMetaHeader)); const nn::hac::sDeltaMetaExtendedHeader* meta = (const nn::hac::sDeltaMetaExtendedHeader*)(sample.data() + sizeof(nn::hac::sContentMetaHeader));
if ((meta->application_id.get() & data->id.get()) != meta->application_id.get()) if ((meta->application_id.get() & data->id.get()) != meta->application_id.get())
return false; return false;
minimum_size += meta->extended_data_size.get(); minimum_size += meta->extended_data_size.get();
}
else if (data->type == (byte_t)nn::hac::cnmt::ContentMetaType::SystemUpdate)
{
const nn::hac::sSystemUpdateMetaExtendedHeader* meta = (const nn::hac::sSystemUpdateMetaExtendedHeader*)(sample.data() + sizeof(nn::hac::sContentMetaHeader));
minimum_size += meta->extended_data_size.get();
}
} }
if (sample.size() != minimum_size) if (sample.size() != minimum_size)