mirror of
https://github.com/DarkMatterCore/nxdumptool.git
synced 2024-11-22 18:26:39 +00:00
Update to v1.0.7.
This commit is contained in:
parent
d22add43bf
commit
fd4b7e933b
4 changed files with 69 additions and 37 deletions
4
Makefile
4
Makefile
|
@ -33,11 +33,11 @@ include $(DEVKITPRO)/libnx/switch_rules
|
||||||
|
|
||||||
VERSION_MAJOR := 1
|
VERSION_MAJOR := 1
|
||||||
VERSION_MINOR := 0
|
VERSION_MINOR := 0
|
||||||
VERSION_MICRO := 6
|
VERSION_MICRO := 7
|
||||||
|
|
||||||
APP_TITLE := gcdumptool
|
APP_TITLE := gcdumptool
|
||||||
APP_AUTHOR := MCMrARM, DarkMatterCore
|
APP_AUTHOR := MCMrARM, DarkMatterCore
|
||||||
APP_VERSION := ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_MICRO}
|
APP_VERSION := ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_MICRO}
|
||||||
|
|
||||||
TARGET := gcdumptool
|
TARGET := gcdumptool
|
||||||
BUILD := build
|
BUILD := build
|
||||||
|
|
|
@ -31,6 +31,11 @@ Thanks to
|
||||||
Changelog
|
Changelog
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
|
**v1.0.7:**
|
||||||
|
|
||||||
|
* Fixed a segmentation fault when trying to free an invalid XML node data pointer when a Scene release from NSWReleases.xml with a matching Title ID misses data related to that node.
|
||||||
|
* Added a message suggesting the user to restart the application after a successful update.
|
||||||
|
|
||||||
**v1.0.6:**
|
**v1.0.6:**
|
||||||
|
|
||||||
* Updated application codebase in order to make it compatible with the latest devkitA64 and libnx releases.
|
* Updated application codebase in order to make it compatible with the latest devkitA64 and libnx releases.
|
||||||
|
|
|
@ -40,7 +40,6 @@ const char *nswReleasesChildrenImageSize = "imagesize";
|
||||||
const char *nswReleasesChildrenTitleID = "titleid";
|
const char *nswReleasesChildrenTitleID = "titleid";
|
||||||
const char *nswReleasesChildrenImgCrc = "imgcrc";
|
const char *nswReleasesChildrenImgCrc = "imgcrc";
|
||||||
const char *nswReleasesChildrenReleaseName = "releasename";
|
const char *nswReleasesChildrenReleaseName = "releasename";
|
||||||
const char *nswReleasesChildrenCard = "card";
|
|
||||||
|
|
||||||
const char *githubReleasesApiUrl = "https://api.github.com/repos/DarkMatterCore/gcdumptool/releases/latest";
|
const char *githubReleasesApiUrl = "https://api.github.com/repos/DarkMatterCore/gcdumptool/releases/latest";
|
||||||
const char *gcDumpToolTmpPath = "sdmc:/switch/gcdumptool.nro.tmp";
|
const char *gcDumpToolTmpPath = "sdmc:/switch/gcdumptool.nro.tmp";
|
||||||
|
@ -426,75 +425,98 @@ void removeDirectory(const char *path)
|
||||||
|
|
||||||
bool parseNSWDBRelease(xmlDocPtr doc, xmlNodePtr cur, u32 crc)
|
bool parseNSWDBRelease(xmlDocPtr doc, xmlNodePtr cur, u32 crc)
|
||||||
{
|
{
|
||||||
|
if (!doc || !cur) return false;
|
||||||
|
|
||||||
xmlChar *key;
|
xmlChar *key;
|
||||||
xmlNodePtr node = cur;
|
xmlNodePtr node = cur;
|
||||||
|
|
||||||
u8 imageSize = (u8)(gameCardSize / GAMECARD_SIZE_1GiB);
|
u8 imageSize = (u8)(gameCardSize / GAMECARD_SIZE_1GiB);
|
||||||
u8 card = (hfs0_partition_cnt == GAMECARD_TYPE1_PARTITION_CNT ? 1 : 2);
|
|
||||||
|
|
||||||
u8 xmlImageSize = 0;
|
u8 xmlImageSize = 0;
|
||||||
u64 xmlTitleID = 0;
|
u64 xmlTitleID = 0;
|
||||||
u32 xmlCrc = 0;
|
u32 xmlCrc = 0;
|
||||||
u8 xmlCard = 0;
|
|
||||||
char xmlReleaseName[256] = {'\0'};
|
char xmlReleaseName[256] = {'\0'};
|
||||||
|
|
||||||
bool found = false;
|
bool found = false;
|
||||||
char strbuf[512] = {'\0'};
|
char strbuf[512] = {'\0'};
|
||||||
|
|
||||||
while (node != NULL)
|
while(node != NULL)
|
||||||
{
|
{
|
||||||
if ((!xmlStrcmp(node->name, (const xmlChar *)nswReleasesChildrenImageSize)))
|
if ((!xmlStrcmp(node->name, (const xmlChar *)nswReleasesChildrenImageSize)))
|
||||||
{
|
{
|
||||||
key = xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
|
key = xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
|
||||||
|
if (key)
|
||||||
xmlImageSize = (u8)atoi((const char*)key);
|
{
|
||||||
|
xmlImageSize = (u8)atoi((const char*)key);
|
||||||
xmlFree(key);
|
xmlFree(key);
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
if ((!xmlStrcmp(node->name, (const xmlChar *)nswReleasesChildrenTitleID)))
|
if ((!xmlStrcmp(node->name, (const xmlChar *)nswReleasesChildrenTitleID)))
|
||||||
{
|
{
|
||||||
key = xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
|
key = xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
|
||||||
|
if (key)
|
||||||
xmlTitleID = strtoull((const char*)key, NULL, 16);
|
{
|
||||||
|
xmlTitleID = strtoull((const char*)key, NULL, 16);
|
||||||
xmlFree(key);
|
xmlFree(key);
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
if ((!xmlStrcmp(node->name, (const xmlChar *)nswReleasesChildrenImgCrc)))
|
if ((!xmlStrcmp(node->name, (const xmlChar *)nswReleasesChildrenImgCrc)))
|
||||||
{
|
{
|
||||||
key = xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
|
key = xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
|
||||||
|
if (key)
|
||||||
xmlCrc = strtoul((const char*)key, NULL, 16);
|
{
|
||||||
|
xmlCrc = strtoul((const char*)key, NULL, 16);
|
||||||
xmlFree(key);
|
xmlFree(key);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ((!xmlStrcmp(node->name, (const xmlChar *)nswReleasesChildrenReleaseName)))
|
if ((!xmlStrcmp(node->name, (const xmlChar *)nswReleasesChildrenReleaseName)))
|
||||||
{
|
{
|
||||||
key = xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
|
key = xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
|
||||||
|
if (key)
|
||||||
snprintf(xmlReleaseName, sizeof(xmlReleaseName) / sizeof(xmlReleaseName[0]), "%s", (char*)key);
|
{
|
||||||
|
snprintf(xmlReleaseName, sizeof(xmlReleaseName) / sizeof(xmlReleaseName[0]), "%s", (char*)key);
|
||||||
xmlFree(key);
|
xmlFree(key);
|
||||||
} else
|
}
|
||||||
if ((!xmlStrcmp(node->name, (const xmlChar *)nswReleasesChildrenCard)))
|
|
||||||
{
|
|
||||||
key = xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
|
|
||||||
|
|
||||||
xmlCard = (u8)atoi((const char*)key);
|
|
||||||
|
|
||||||
xmlFree(key);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
node = node->next;
|
node = node->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
//snprintf(strbuf, sizeof(strbuf) / sizeof(strbuf[0]), "Cartridge Image Size: %u\nCartridge Title ID: %016lX\nCartridge Image CRC32: %08X\nCartridge Type: %u\n\nXML Image Size: %u\nXML Title ID: %016lX\nXML Image CRC32: %08X\nXML Release Name: %s\nXML Card Type: %u", imageSize, gameCardTitleID, crc, card, xmlImageSize, xmlTitleID, xmlCrc, xmlReleaseName, xmlCard);
|
/*if (xmlImageSize && xmlTitleID && strlen(xmlReleaseName))
|
||||||
//uiDrawString(strbuf, 0, 0, 255, 255, 255);
|
{
|
||||||
|
snprintf(strbuf, sizeof(strbuf) / sizeof(strbuf[0]), "Cartridge Image Size: %u.", imageSize);
|
||||||
|
uiDrawString(strbuf, 0, breaks * font_height, 255, 255, 255);
|
||||||
|
breaks++;
|
||||||
|
|
||||||
|
snprintf(strbuf, sizeof(strbuf) / sizeof(strbuf[0]), "Cartridge Title ID: %016lX.", gameCardTitleID);
|
||||||
|
uiDrawString(strbuf, 0, breaks * font_height, 255, 255, 255);
|
||||||
|
breaks++;
|
||||||
|
|
||||||
|
snprintf(strbuf, sizeof(strbuf) / sizeof(strbuf[0]), "Cartridge Image CRC32: %08X.", crc);
|
||||||
|
uiDrawString(strbuf, 0, breaks * font_height, 255, 255, 255);
|
||||||
|
breaks += 2;
|
||||||
|
|
||||||
|
snprintf(strbuf, sizeof(strbuf) / sizeof(strbuf[0]), "XML Image Size: %u.", xmlImageSize);
|
||||||
|
uiDrawString(strbuf, 0, breaks * font_height, 255, 255, 255);
|
||||||
|
breaks++;
|
||||||
|
|
||||||
|
snprintf(strbuf, sizeof(strbuf) / sizeof(strbuf[0]), "XML Title ID: %016lX.", xmlTitleID);
|
||||||
|
uiDrawString(strbuf, 0, breaks * font_height, 255, 255, 255);
|
||||||
|
breaks++;
|
||||||
|
|
||||||
|
snprintf(strbuf, sizeof(strbuf) / sizeof(strbuf[0]), "XML Image CRC32: %08X.", xmlCrc);
|
||||||
|
uiDrawString(strbuf, 0, breaks * font_height, 255, 255, 255);
|
||||||
|
breaks++;
|
||||||
|
|
||||||
|
snprintf(strbuf, sizeof(strbuf) / sizeof(strbuf[0]), "XML Release Name: %s.", xmlReleaseName);
|
||||||
|
uiDrawString(strbuf, 0, breaks * font_height, 255, 255, 255);
|
||||||
|
breaks += 2;
|
||||||
|
}*/
|
||||||
|
|
||||||
if (xmlImageSize == imageSize && xmlTitleID == gameCardTitleID && xmlCrc == crc && xmlCard == card)
|
if (xmlImageSize == imageSize && xmlTitleID == gameCardTitleID && xmlCrc == crc)
|
||||||
{
|
{
|
||||||
snprintf(strbuf, sizeof(strbuf) / sizeof(strbuf[0]), "Found matching Scene release: \"%s\" (CRC32: %08X). This is a good dump!", xmlReleaseName, xmlCrc);
|
snprintf(strbuf, sizeof(strbuf) / sizeof(strbuf[0]), "Found matching Scene release: \"%s\" (CRC32: %08X). This is a good dump!", xmlReleaseName, xmlCrc);
|
||||||
uiDrawString(strbuf, 0, breaks * font_height, 0, 255, 0);
|
uiDrawString(strbuf, 0, breaks * font_height, 0, 255, 0);
|
||||||
|
|
||||||
found = true;
|
found = true;
|
||||||
} else {
|
} else {
|
||||||
snprintf(strbuf, sizeof(strbuf) / sizeof(strbuf[0]), "Dump doesn't match Scene release: \"%s\"! (CRC32: %08X)", xmlReleaseName, xmlCrc);
|
snprintf(strbuf, sizeof(strbuf) / sizeof(strbuf[0]), "Dump doesn't match Scene release: \"%s\"! (CRC32: %08X)", xmlReleaseName, xmlCrc);
|
||||||
|
@ -545,7 +567,7 @@ void gameCardDumpNSWDBCheck(u32 crc)
|
||||||
uiRefreshDisplay();
|
uiRefreshDisplay();
|
||||||
|
|
||||||
u32 i;
|
u32 i;
|
||||||
for (i = 0; i < nodeSet->nodesetval->nodeNr; i++)
|
for(i = 0; i < nodeSet->nodesetval->nodeNr; i++)
|
||||||
{
|
{
|
||||||
xmlNodePtr node = nodeSet->nodesetval->nodeTab[i]->xmlChildrenNode;
|
xmlNodePtr node = nodeSet->nodesetval->nodeTab[i]->xmlChildrenNode;
|
||||||
|
|
||||||
|
@ -943,9 +965,14 @@ void updateApplication()
|
||||||
|
|
||||||
if (res == CURLE_OK && http_code >= 200 && http_code <= 299 && size > 0)
|
if (res == CURLE_OK && http_code >= 200 && http_code <= 299 && size > 0)
|
||||||
{
|
{
|
||||||
|
success = true;
|
||||||
|
|
||||||
snprintf(strbuf, sizeof(strbuf) / sizeof(strbuf[0]), "Successfully downloaded %.0lf bytes!", size);
|
snprintf(strbuf, sizeof(strbuf) / sizeof(strbuf[0]), "Successfully downloaded %.0lf bytes!", size);
|
||||||
uiDrawString(strbuf, 0, breaks * font_height, 0, 255, 0);
|
uiDrawString(strbuf, 0, breaks * font_height, 0, 255, 0);
|
||||||
success = true;
|
breaks++;
|
||||||
|
|
||||||
|
snprintf(strbuf, sizeof(strbuf) / sizeof(strbuf[0]), "Please restart the application to reflect the changes.", size);
|
||||||
|
uiDrawString(strbuf, 0, breaks * font_height, 0, 255, 0);
|
||||||
} else {
|
} else {
|
||||||
snprintf(strbuf, sizeof(strbuf) / sizeof(strbuf[0]), "Error: failed to request latest update binary! HTTP status code: %ld", http_code);
|
snprintf(strbuf, sizeof(strbuf) / sizeof(strbuf[0]), "Error: failed to request latest update binary! HTTP status code: %ld", http_code);
|
||||||
uiDrawString(strbuf, 0, breaks * font_height, 255, 0, 0);
|
uiDrawString(strbuf, 0, breaks * font_height, 255, 0, 0);
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
#define MiB (1024.0 * KiB)
|
#define MiB (1024.0 * KiB)
|
||||||
#define GiB (1024.0 * MiB)
|
#define GiB (1024.0 * MiB)
|
||||||
|
|
||||||
#define APP_VERSION "1.0.6"
|
#define APP_VERSION "1.0.7"
|
||||||
|
|
||||||
#define NAME_BUF_LEN 4096
|
#define NAME_BUF_LEN 4096
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue