1
0
Fork 0
mirror of https://github.com/DarkMatterCore/nxdumptool.git synced 2024-10-19 03:41:44 +01:00
nxdumptool/source/main.c

190 lines
4.9 KiB
C
Raw Normal View History

2018-05-15 13:57:40 +01:00
#include <stdio.h>
2018-05-16 17:06:57 +01:00
#include <malloc.h>
2018-05-15 13:57:40 +01:00
#include <switch.h>
2018-05-16 17:06:57 +01:00
#include <memory.h>
2018-05-15 17:00:19 +01:00
#include "dumper.h"
#include "ncmext.h"
#include "ui.h"
#include "util.h"
2018-05-15 13:57:40 +01:00
2018-05-15 17:00:19 +01:00
FsDeviceOperator fsOperatorInstance;
2018-05-15 13:57:40 +01:00
bool gameCardInserted;
2018-06-26 02:11:18 +01:00
u64 gameCardSize = 0, trimmedCardSize = 0;
char gameCardSizeStr[32] = {'\0'}, trimmedCardSizeStr[32] = {'\0'};
char *hfs0_header = NULL;
u64 hfs0_offset = 0, hfs0_size = 0;
u32 hfs0_partition_cnt = 0;
u64 gameCardTitleID = 0;
char gameCardName[0x201] = {'\0'}, gameCardAuthor[0x101] = {'\0'}, gameCardVersion[0x11] = {'\0'};
u32 currentFBWidth, currentFBHeight;
u8 *currentFB;
int main(int argc, char **argv)
{
gfxInitResolutionDefault();
gfxInitDefault();
gfxConfigureAutoResolutionDefault(true);
uiInit();
currentFB = gfxGetFramebuffer(&currentFBWidth, &currentFBHeight);
int ret = 0;
2018-06-22 10:45:41 +01:00
Result result;
char strbuf[512] = {'\0'};
2018-06-22 10:45:41 +01:00
if (R_SUCCEEDED(result = fsInitialize()))
{
2018-06-22 10:45:41 +01:00
if (R_SUCCEEDED(result = fsOpenDeviceOperator(&fsOperatorInstance)))
{
2018-06-22 10:45:41 +01:00
if (R_SUCCEEDED(result = ncmInitialize()))
{
2018-06-22 10:45:41 +01:00
if (R_SUCCEEDED(result = nsInitialize()))
{
2018-06-22 10:45:41 +01:00
bool exitLoop = false;
2018-06-22 01:46:17 +01:00
2018-06-22 10:45:41 +01:00
while(appletMainLoop())
{
2018-06-22 10:45:41 +01:00
currentFB = gfxGetFramebuffer(&currentFBWidth, &currentFBHeight);
uiPrintHeadline();
gameCardInserted = isGameCardInserted(&fsOperatorInstance);
if (gameCardInserted)
{
2018-06-22 10:45:41 +01:00
if (hfs0_header == NULL)
{
// Don't access the gamecard immediately to avoid conflicts with the fsp-srv, ncm and ns services
uiPleaseWait();
getRootHfs0Header(&fsOperatorInstance);
getGameCardTitleID(&gameCardTitleID);
getGameCardControlNacp(gameCardTitleID, gameCardName, sizeof(gameCardName), gameCardAuthor, sizeof(gameCardAuthor), gameCardVersion, sizeof(gameCardVersion));
uiPrintHeadline();
uiUpdateStatusMsg();
}
} else {
if (hfs0_header != NULL)
{
gameCardSize = 0;
memset(gameCardSizeStr, 0, sizeof(gameCardSizeStr));
2018-06-26 02:11:18 +01:00
trimmedCardSize = 0;
memset(trimmedCardSizeStr, 0, sizeof(trimmedCardSizeStr));
2018-06-22 10:45:41 +01:00
free(hfs0_header);
hfs0_header = NULL;
hfs0_offset = hfs0_size = 0;
hfs0_partition_cnt = 0;
gameCardTitleID = 0;
memset(gameCardName, 0, sizeof(gameCardName));
memset(gameCardAuthor, 0, sizeof(gameCardAuthor));
memset(gameCardVersion, 0, sizeof(gameCardVersion));
}
}
2018-06-22 10:45:41 +01:00
hidScanInput();
u32 keysDown = hidKeysDown(CONTROLLER_P1_AUTO);
UIResult result = uiLoop(keysDown);
switch(result)
{
2018-06-22 10:45:41 +01:00
case resultShowMainMenu:
uiSetState(stateMainMenu);
break;
case resultShowXciDumpMenu:
uiSetState(stateXciDumpMenu);
break;
case resultDumpXci:
uiSetState(stateDumpXci);
break;
case resultShowRawPartitionDumpMenu:
uiSetState(stateRawPartitionDumpMenu);
break;
case resultDumpRawPartition:
uiSetState(stateDumpRawPartition);
break;
case resultShowPartitionDataDumpMenu:
uiSetState(statePartitionDataDumpMenu);
break;
case resultDumpPartitionData:
uiSetState(stateDumpPartitionData);
break;
case resultShowViewGameCardFsMenu:
uiSetState(stateViewGameCardFsMenu);
break;
case resultShowViewGameCardFsGetList:
uiSetState(stateViewGameCardFsGetList);
break;
case resultShowViewGameCardFsBrowser:
uiSetState(stateViewGameCardFsBrowser);
break;
case resultViewGameCardFsBrowserCopyFile:
uiSetState(stateViewGameCardFsBrowserCopyFile);
break;
case resultDumpGameCardCertificate:
uiSetState(stateDumpGameCardCertificate);
break;
case resultExit:
exitLoop = true;
break;
default:
break;
}
2018-06-22 10:45:41 +01:00
if (exitLoop) break;
syncDisplay();
}
2018-06-22 10:45:41 +01:00
nsExit();
} else {
snprintf(strbuf, sizeof(strbuf) / sizeof(strbuf[0]), "Failed to initialize the ns service! (0x%08x)", result);
uiDrawString(strbuf, 0, 0, 255, 255, 255);
delay(5);
ret = -4;
}
2018-06-22 10:45:41 +01:00
ncmExit();
} else {
2018-06-22 10:45:41 +01:00
snprintf(strbuf, sizeof(strbuf) / sizeof(strbuf[0]), "Failed to initialize the ncm service! (0x%08x)", result);
uiDrawString(strbuf, 0, 0, 255, 255, 255);
delay(5);
ret = -3;
}
2018-06-22 10:45:41 +01:00
fsDeviceOperatorClose(&fsOperatorInstance);
} else {
2018-06-22 10:45:41 +01:00
snprintf(strbuf, sizeof(strbuf) / sizeof(strbuf[0]), "Failed to open device operator! (0x%08x)", result);
uiDrawString(strbuf, 0, 0, 255, 255, 255);
delay(5);
ret = -2;
}
2018-06-22 10:45:41 +01:00
fsExit();
} else {
2018-06-22 10:45:41 +01:00
snprintf(strbuf, sizeof(strbuf) / sizeof(strbuf[0]), "Failed to initialize the fsp-srv service! (0x%08x)", result);
uiDrawString(strbuf, 0, 0, 255, 255, 255);
delay(5);
ret = -1;
}
if (hfs0_header != NULL) free(hfs0_header);
uiDeinit();
2018-05-15 13:57:40 +01:00
gfxExit();
return ret;
2018-05-15 13:57:40 +01:00
}