mirror of
https://github.com/Fledge68/WiiFlow_Lite.git
synced 2024-11-01 00:55:06 +01:00
-unfinished modified code for nand emulation, you can now enter the
nand emu view without loading into some cios, only if you boot a game it will need to reload it (dont even think about it to report bugs yet)
This commit is contained in:
parent
9c4626ab77
commit
f6d08052d2
@ -34,6 +34,7 @@
|
||||
#include <malloc.h>
|
||||
#include "banner.h"
|
||||
#include "MD5.h"
|
||||
#include "nand.hpp"
|
||||
#include "gecko/gecko.hpp"
|
||||
#include "loader/fs.h"
|
||||
#include "unzip/U8Archive.h"
|
||||
@ -162,40 +163,20 @@ u8 *Banner::GetFile(char *name, u32 *size)
|
||||
return file;
|
||||
}
|
||||
|
||||
void Banner::GetBanner(u64 title, char *appname, bool isfs, bool imetOnly)
|
||||
void Banner::GetBanner(u64 title, char *appname, bool imetOnly)
|
||||
{
|
||||
void *buf = NULL;
|
||||
u8 *buf = NULL;
|
||||
u32 size = 0;
|
||||
if (isfs)
|
||||
{
|
||||
buf = ISFS_GetFile(appname, &size, imetOnly ? sizeof(IMET) + IMET_OFFSET : 0);
|
||||
if (size == 0)
|
||||
{
|
||||
if(buf != NULL)
|
||||
free(buf);
|
||||
return;
|
||||
}
|
||||
}
|
||||
s32 len = imetOnly ? sizeof(IMET) + IMET_OFFSET : -1;
|
||||
if(NandHandle.EmulationEnabled())
|
||||
buf = NandHandle.GetEmuFile(appname, &size, len);
|
||||
else
|
||||
buf = ISFS_GetFile(appname, &size, len);
|
||||
if(size == 0)
|
||||
{
|
||||
FILE *fp = fopen(appname, "rb");
|
||||
if(fp == NULL)
|
||||
return;
|
||||
|
||||
u32 size = sizeof(IMET) + IMET_OFFSET;
|
||||
if (!imetOnly)
|
||||
{
|
||||
fseek(fp, 0, SEEK_END);
|
||||
size = ftell(fp);
|
||||
fseek(fp, 0, SEEK_SET);
|
||||
}
|
||||
|
||||
buf = malloc(size);
|
||||
if(!buf)
|
||||
return;
|
||||
|
||||
fread(buf, size, 1, fp);
|
||||
fclose(fp);
|
||||
if(buf != NULL)
|
||||
free(buf);
|
||||
return;
|
||||
}
|
||||
SetBanner((u8 *)buf, size, title);
|
||||
SetBanner(buf, size, title);
|
||||
}
|
||||
|
@ -70,7 +70,7 @@ class Banner
|
||||
bool GetName(wchar_t *name, int language);
|
||||
u8 *GetFile(char *name, u32 *size);
|
||||
|
||||
void GetBanner(u64 title, char *appname, bool isfs, bool imetOnly = false);
|
||||
void GetBanner(u64 title, char *appname, bool imetOnly = false);
|
||||
u8 *GetBannerFile() { return opening; }
|
||||
u32 GetBannerFileSize() { return opening_size; }
|
||||
protected:
|
||||
|
@ -32,10 +32,12 @@
|
||||
#include "channel_launcher.h"
|
||||
#include "channels.h"
|
||||
#include "banner.h"
|
||||
#include "nand.hpp"
|
||||
#include "config/config.hpp"
|
||||
#include "gecko/gecko.hpp"
|
||||
#include "gui/text.hpp"
|
||||
#include "loader/fs.h"
|
||||
#include "loader/sys.h"
|
||||
#include "memory/mem2.hpp"
|
||||
#include "wstringEx/wstringEx.hpp"
|
||||
|
||||
@ -63,12 +65,16 @@ void Channels::Cleanup()
|
||||
u8 Channels::GetRequestedIOS(u64 title)
|
||||
{
|
||||
u8 IOS = 0;
|
||||
|
||||
char tmd[ISFS_MAXPATH] ATTRIBUTE_ALIGN(32);
|
||||
sprintf(tmd, "/title/%08x/%08x/content/title.tmd", TITLE_UPPER(title), TITLE_LOWER(title));
|
||||
|
||||
u32 size;
|
||||
u8 *titleTMD = (u8 *)ISFS_GetFile(tmd, &size, -1);
|
||||
u32 size = 0;
|
||||
u8 *titleTMD = NULL;
|
||||
if(NANDemuView)
|
||||
titleTMD = NandHandle.GetTMD(title, &size);
|
||||
else
|
||||
{
|
||||
char tmd[ISFS_MAXPATH] ATTRIBUTE_ALIGN(32);
|
||||
sprintf(tmd, "/title/%08x/%08x/content/title.tmd", TITLE_UPPER(title), TITLE_LOWER(title));
|
||||
titleTMD = ISFS_GetFile(tmd, &size, -1);
|
||||
}
|
||||
if(titleTMD == NULL)
|
||||
return 0;
|
||||
|
||||
@ -100,15 +106,19 @@ u64 *Channels::GetChannelList(u32 *count)
|
||||
return titles;
|
||||
}
|
||||
|
||||
bool Channels::GetAppNameFromTmd(u64 title, char *app, bool dol, u32 *bootcontent)
|
||||
bool Channels::GetAppNameFromTmd(u64 title, char *app, u32 *bootcontent)
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
char tmd[ISFS_MAXPATH] ATTRIBUTE_ALIGN(32);
|
||||
sprintf(tmd, "/title/%08x/%08x/content/title.tmd", TITLE_UPPER(title), TITLE_LOWER(title));
|
||||
|
||||
u32 size;
|
||||
u8 *data = ISFS_GetFile(tmd, &size, -1);
|
||||
u32 size = 0;
|
||||
u8 *data = NULL;
|
||||
if(NANDemuView)
|
||||
data = NandHandle.GetTMD(title, &size);
|
||||
else
|
||||
{
|
||||
char tmd[ISFS_MAXPATH] ATTRIBUTE_ALIGN(32);
|
||||
sprintf(tmd, "/title/%08x/%08x/content/title.tmd", TITLE_UPPER(title), TITLE_LOWER(title));
|
||||
data = ISFS_GetFile(tmd, &size, -1);
|
||||
}
|
||||
if (data == NULL || size < 0x208)
|
||||
return ret;
|
||||
|
||||
@ -116,7 +126,7 @@ bool Channels::GetAppNameFromTmd(u64 title, char *app, bool dol, u32 *bootconten
|
||||
u16 i;
|
||||
for(i = 0; i < tmd_file->num_contents; ++i)
|
||||
{
|
||||
if(tmd_file->contents[i].index == (dol ? tmd_file->boot_index : 0))
|
||||
if(tmd_file->contents[i].index == 0)
|
||||
{
|
||||
*bootcontent = tmd_file->contents[i].cid;
|
||||
sprintf(app, "/title/%08x/%08x/content/%08x.app", TITLE_UPPER(title), TITLE_LOWER(title), *bootcontent);
|
||||
@ -132,15 +142,12 @@ bool Channels::GetAppNameFromTmd(u64 title, char *app, bool dol, u32 *bootconten
|
||||
|
||||
void Channels::GetBanner(u64 title, bool imetOnly)
|
||||
{
|
||||
u32 cid = 0;
|
||||
CurrentBanner.ClearBanner();
|
||||
char app[ISFS_MAXPATH] ATTRIBUTE_ALIGN(32);
|
||||
u32 cid;
|
||||
if(!GetAppNameFromTmd(title, app, false, &cid))
|
||||
{
|
||||
gprintf("No title found for %08x %08x\n", (u32)(title&0xFFFFFFFF),(u32)(title>>32));
|
||||
if(!GetAppNameFromTmd(title, app, &cid))
|
||||
return;
|
||||
}
|
||||
CurrentBanner.GetBanner(title, app, true, imetOnly);
|
||||
CurrentBanner.GetBanner(title, app, imetOnly);
|
||||
}
|
||||
|
||||
bool Channels::GetChannelNameFromApp(u64 title, wchar_t* name, int language)
|
||||
@ -179,7 +186,11 @@ int Channels::GetLanguage(const char *lang)
|
||||
void Channels::Search()
|
||||
{
|
||||
u32 count;
|
||||
u64 *list = GetChannelList(&count);
|
||||
u64 *list = NULL;
|
||||
if(NANDemuView)
|
||||
list = NandHandle.GetChannels(&count);
|
||||
else
|
||||
list = GetChannelList(&count);
|
||||
if(list == NULL)
|
||||
return;
|
||||
|
||||
@ -190,20 +201,20 @@ void Channels::Search()
|
||||
u32 Type = TITLE_UPPER(list[i]);
|
||||
if(Type == SYSTEM_CHANNELS || Type == DOWNLOADED_CHANNELS || Type == GAME_CHANNELS)
|
||||
{
|
||||
u32 Title = TITLE_LOWER(list[i]);
|
||||
if(Title == RF_NEWS_CHANNEL || Title == RF_FORECAST_CHANNEL)
|
||||
continue; //skip region free news and forecast channel
|
||||
Channel CurrentChan;
|
||||
memset(&CurrentChan, 0, sizeof(Channel));
|
||||
if(GetChannelNameFromApp(list[i], CurrentChan.name, language))
|
||||
{
|
||||
u32 Title = TITLE_LOWER(list[i]);
|
||||
if(Title == RF_NEWS_CHANNEL || Title == RF_FORECAST_CHANNEL)
|
||||
continue; //skip region free news and forecast channel
|
||||
CurrentChan.title = list[i];
|
||||
memcpy(CurrentChan.id, &Title, sizeof(CurrentChan.id));
|
||||
this->push_back(CurrentChan);
|
||||
}
|
||||
}
|
||||
}
|
||||
MEM2_free(list);
|
||||
free(list);
|
||||
}
|
||||
|
||||
wchar_t * Channels::GetName(int index)
|
||||
|
@ -65,7 +65,7 @@ private:
|
||||
|
||||
int GetLanguage(const char *lang);
|
||||
u64* GetChannelList(u32* count);
|
||||
bool GetAppNameFromTmd(u64 title, char* app, bool dol = false, u32* bootcontent = NULL);
|
||||
bool GetAppNameFromTmd(u64 title, char* app, u32* bootcontent = NULL);
|
||||
bool GetChannelNameFromApp(u64 title, wchar_t* name, int language);
|
||||
|
||||
void Search();
|
||||
|
@ -39,6 +39,7 @@
|
||||
#include "identify.h"
|
||||
#include "fileOps/fileOps.h"
|
||||
#include "gecko/gecko.hpp"
|
||||
#include "gui/text.hpp"
|
||||
#include "loader/alt_ios.h"
|
||||
#include "loader/cios.h"
|
||||
#include "loader/fs.h"
|
||||
@ -71,19 +72,16 @@ void Nand::Init()
|
||||
{
|
||||
MountedDevice = 0;
|
||||
EmuDevice = REAL_NAND;
|
||||
Disabled = true;
|
||||
AccessPatched = false;
|
||||
Partition = 0;
|
||||
FullMode = 0x100;
|
||||
memset(NandPath, 0, sizeof(NandPath));
|
||||
}
|
||||
|
||||
void Nand::SetPaths(string path, u32 partition, bool disable)
|
||||
void Nand::SetNANDEmu(u32 partition)
|
||||
{
|
||||
EmuDevice = disable ? REAL_NAND : partition == 0 ? EMU_SD : EMU_USB;
|
||||
Partition = disable ? REAL_NAND : partition > 0 ? partition - 1 : partition;
|
||||
Set_NandPath(path);
|
||||
Disabled = disable;
|
||||
EmuDevice = partition == 0 ? EMU_SD : EMU_USB;
|
||||
Partition = partition > 0 ? partition - 1 : partition;
|
||||
}
|
||||
|
||||
s32 Nand::Nand_Mount(NandDevice *Device)
|
||||
@ -182,17 +180,17 @@ s32 Nand::Enable_Emu()
|
||||
s32 Nand::Disable_Emu()
|
||||
{
|
||||
if(MountedDevice == 0 || !emu_enabled)
|
||||
{
|
||||
emu_enabled = false;
|
||||
return 0;
|
||||
|
||||
NandDevice * Device = &NandDeviceList[MountedDevice];
|
||||
}
|
||||
emu_enabled = false;
|
||||
NandDevice *Device = &NandDeviceList[MountedDevice];
|
||||
|
||||
Nand_Disable();
|
||||
Nand_Unmount(Device);
|
||||
|
||||
MountedDevice = 0;
|
||||
|
||||
emu_enabled = false;
|
||||
usleep(1000);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -201,21 +199,6 @@ bool Nand::EmulationEnabled(void)
|
||||
return emu_enabled;
|
||||
}
|
||||
|
||||
void Nand::Set_NandPath(string path)
|
||||
{
|
||||
if(isalnum(*(path.begin())))
|
||||
path.insert(path.begin(), '/');
|
||||
else
|
||||
*(path.begin()) = '/';
|
||||
|
||||
if(path.size() <= 32)
|
||||
memcpy(NandPath, path.c_str(), path.size());
|
||||
else
|
||||
memset(NandPath, 0, sizeof(NandPath));
|
||||
|
||||
gprintf("NandPath = %s\n", NandPath);
|
||||
}
|
||||
|
||||
void Nand::__Dec_Enc_TB(void)
|
||||
{
|
||||
u32 key = 0x73B5DBFA;
|
||||
@ -815,7 +798,7 @@ void Nand::CreatePath(const char *path, ...)
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
void Nand::CreateTitleTMD(const char *path, dir_discHdr *hdr)
|
||||
void Nand::CreateTitleTMD(dir_discHdr *hdr)
|
||||
{
|
||||
wbfs_disc_t *disc = WBFS_OpenDisc((u8 *)&hdr->id, (char *)hdr->path);
|
||||
if(!disc)
|
||||
@ -831,17 +814,14 @@ void Nand::CreateTitleTMD(const char *path, dir_discHdr *hdr)
|
||||
u32 highTID = *(u32*)(titleTMD+0x18c);
|
||||
u32 lowTID = *(u32*)(titleTMD+0x190);
|
||||
|
||||
CreatePath("%s/title/%08x/%08x/data", path, highTID, lowTID);
|
||||
CreatePath("%s/title/%08x/%08x/content", path, highTID, lowTID);
|
||||
CreatePath("%s/title/%08x/%08x/data", FullNANDPath, highTID, lowTID);
|
||||
CreatePath("%s/title/%08x/%08x/content", FullNANDPath, highTID, lowTID);
|
||||
|
||||
char nandpath[MAX_FAT_PATH];
|
||||
if(path[strlen(path)-1] == '/')
|
||||
snprintf(nandpath, sizeof(nandpath), "%stitle/%08x/%08x/content/title.tmd", path, highTID, lowTID);
|
||||
else
|
||||
snprintf(nandpath, sizeof(nandpath), "%s/title/%08x/%08x/content/title.tmd", path, highTID, lowTID);
|
||||
snprintf(nandpath, sizeof(nandpath), "%s/title/%08x/%08x/content/title.tmd", FullNANDPath, highTID, lowTID);
|
||||
|
||||
struct stat filestat;
|
||||
if (stat(nandpath, &filestat) == 0)
|
||||
if(stat(nandpath, &filestat) == 0)
|
||||
{
|
||||
free(titleTMD);
|
||||
gprintf("%s Exists!\n", nandpath);
|
||||
@ -930,41 +910,41 @@ void Nand::ResetCounters(void)
|
||||
NandDone = 0;
|
||||
}
|
||||
|
||||
s32 Nand::CreateConfig(const char *path)
|
||||
s32 Nand::CreateConfig()
|
||||
{
|
||||
CreatePath(path);
|
||||
CreatePath("%s/shared2", path);
|
||||
CreatePath("%s/shared2/sys", path);
|
||||
CreatePath("%s/title", path);
|
||||
CreatePath("%s/title/00000001", path);
|
||||
CreatePath("%s/title/00000001/00000002", path);
|
||||
CreatePath("%s/title/00000001/00000002/data", path);
|
||||
CreatePath(FullNANDPath);
|
||||
CreatePath("%s/shared2", FullNANDPath);
|
||||
CreatePath("%s/shared2/sys", FullNANDPath);
|
||||
CreatePath("%s/title", FullNANDPath);
|
||||
CreatePath("%s/title/00000001", FullNANDPath);
|
||||
CreatePath("%s/title/00000001/00000002", FullNANDPath);
|
||||
CreatePath("%s/title/00000001/00000002/data", FullNANDPath);
|
||||
|
||||
fake = false;
|
||||
showprogress = false;
|
||||
|
||||
memset(cfgpath, 0, sizeof(cfgpath));
|
||||
snprintf(cfgpath, sizeof(cfgpath), "%s%s", path, SYSCONFPATH);
|
||||
snprintf(cfgpath, sizeof(cfgpath), "%s%s", FullNANDPath, SYSCONFPATH);
|
||||
__DumpNandFile(SYSCONFPATH, cfgpath);
|
||||
|
||||
memset(settxtpath, 0, sizeof(settxtpath));
|
||||
snprintf(settxtpath, sizeof(settxtpath), "%s%s", path, TXTPATH);
|
||||
snprintf(settxtpath, sizeof(settxtpath), "%s%s", FullNANDPath, TXTPATH);
|
||||
__DumpNandFile(TXTPATH, settxtpath);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
s32 Nand::PreNandCfg(const char *path, bool miis, bool realconfig)
|
||||
s32 Nand::PreNandCfg(bool miis, bool realconfig)
|
||||
{
|
||||
CreatePath(path);
|
||||
CreatePath("%s/shared2", path);
|
||||
CreatePath("%s/shared2/sys", path);
|
||||
CreatePath("%s/shared2/menu", path);
|
||||
CreatePath("%s/shared2/menu/FaceLib", path);
|
||||
CreatePath("%s/title", path);
|
||||
CreatePath("%s/title/00000001", path);
|
||||
CreatePath("%s/title/00000001/00000002", path);
|
||||
CreatePath("%s/title/00000001/00000002/data", path);
|
||||
CreatePath(FullNANDPath);
|
||||
CreatePath("%s/shared2", FullNANDPath);
|
||||
CreatePath("%s/shared2/sys", FullNANDPath);
|
||||
CreatePath("%s/shared2/menu", FullNANDPath);
|
||||
CreatePath("%s/shared2/menu/FaceLib", FullNANDPath);
|
||||
CreatePath("%s/title", FullNANDPath);
|
||||
CreatePath("%s/title/00000001", FullNANDPath);
|
||||
CreatePath("%s/title/00000001/00000002", FullNANDPath);
|
||||
CreatePath("%s/title/00000001/00000002/data", FullNANDPath);
|
||||
|
||||
char dest[MAX_FAT_PATH];
|
||||
|
||||
@ -973,16 +953,15 @@ s32 Nand::PreNandCfg(const char *path, bool miis, bool realconfig)
|
||||
|
||||
if(realconfig)
|
||||
{
|
||||
snprintf(dest, sizeof(dest), "%s%s", path, SYSCONFPATH);
|
||||
snprintf(dest, sizeof(dest), "%s%s", FullNANDPath, SYSCONFPATH);
|
||||
__DumpNandFile(SYSCONFPATH, dest);
|
||||
|
||||
snprintf(dest, sizeof(dest), "%s%s", path, TXTPATH);
|
||||
snprintf(dest, sizeof(dest), "%s%s", FullNANDPath, TXTPATH);
|
||||
__DumpNandFile(TXTPATH, dest);
|
||||
}
|
||||
|
||||
if(miis)
|
||||
{
|
||||
snprintf(dest, sizeof(dest), "%s%s", path, MIIPATH);
|
||||
snprintf(dest, sizeof(dest), "%s%s", FullNANDPath, MIIPATH);
|
||||
__DumpNandFile(MIIPATH, dest);
|
||||
}
|
||||
return 0;
|
||||
@ -1123,6 +1102,76 @@ void Nand::Patch_AHB()
|
||||
}
|
||||
}
|
||||
|
||||
u8 *Nand::GetEmuFile(const char *path, u32 *size, s32 len)
|
||||
{
|
||||
u32 filesize = 0;
|
||||
const char *tmp_path = fmt("%s%s", FullNANDPath, path);
|
||||
bool ret = fsop_GetFileSizeBytes(tmp_path, &filesize);
|
||||
if(ret == false || filesize == 0)
|
||||
return NULL;
|
||||
|
||||
if(len > 0)
|
||||
filesize = min(filesize, (u32)len);
|
||||
u8 *tmp_buf = (u8*)MEM2_alloc(filesize);
|
||||
FILE *f = fopen(tmp_path, "rb");
|
||||
fread(tmp_buf, filesize, 1, f);
|
||||
fclose(f);
|
||||
|
||||
DCFlushRange(tmp_buf, filesize);
|
||||
*size = filesize;
|
||||
return tmp_buf;
|
||||
}
|
||||
|
||||
u64 *Nand::GetChannels(u32 *count)
|
||||
{
|
||||
u32 size = 0;
|
||||
u8 *uid_buf = GetEmuFile("/sys/uid.sys", &size);
|
||||
if(uid_buf == NULL || size == 0)
|
||||
return NULL;
|
||||
|
||||
uid *uid_file = (uid*)uid_buf;
|
||||
u32 chans = size/sizeof(uid);
|
||||
u64 *title_buf = (u64*)MEM2_alloc(chans*sizeof(u64));
|
||||
for(u32 i = 0; i < chans; ++i)
|
||||
title_buf[i] = uid_file[i].TitleID;
|
||||
MEM2_free(uid_buf);
|
||||
|
||||
DCFlushRange(title_buf, chans);
|
||||
*count = chans;
|
||||
return title_buf;
|
||||
}
|
||||
|
||||
u8 *Nand::GetTMD(u64 title, u32 *size)
|
||||
{
|
||||
u32 tmd_size = 0;
|
||||
const char *tmd_path = fmt("/title/%08x/%08x/content/title.tmd",
|
||||
TITLE_UPPER(title), TITLE_LOWER(title));
|
||||
u8 *tmd_buf = GetEmuFile(tmd_path, &tmd_size);
|
||||
|
||||
*size = tmd_size;
|
||||
return tmd_buf;
|
||||
}
|
||||
|
||||
void Nand::SetPaths(const char *emuPath, const char *currentPart)
|
||||
{
|
||||
memset(&FullNANDPath, 0, sizeof(FullNANDPath));
|
||||
strcat(FullNANDPath, fmt("%s:", currentPart));
|
||||
if(emuPath[0] == '\0' || emuPath[0] == ' ')
|
||||
return;
|
||||
else if(emuPath[0] != '/' && emuPath[1] != '\0') //missing / before path
|
||||
strcat(FullNANDPath, "/");
|
||||
|
||||
for(u32 i = 0; emuPath[i] != '\0'; i++)
|
||||
{
|
||||
if(emuPath[i] == '/' && emuPath[i+1] == '\0')
|
||||
break;
|
||||
strncat(FullNANDPath, &emuPath[i], 1);
|
||||
}
|
||||
gprintf("Emu NAND Full Path = %s\n", FullNANDPath);
|
||||
strncpy(NandPath, fmt("/%s", strchr(FullNANDPath, ':') + 1), sizeof(NandPath));
|
||||
gprintf("IOS Compatible NAND Path = %s\n", NandPath);
|
||||
}
|
||||
|
||||
/*
|
||||
part of miniunz.c
|
||||
Version 1.01e, February 12th, 2005
|
||||
|
@ -49,6 +49,12 @@ typedef struct _namelist
|
||||
int type;
|
||||
} namelist;
|
||||
|
||||
typedef struct _uid
|
||||
{
|
||||
u64 TitleID;
|
||||
u32 unused;
|
||||
} __attribute__((packed)) uid;
|
||||
|
||||
using namespace std;
|
||||
|
||||
class Nand
|
||||
@ -57,7 +63,7 @@ public:
|
||||
void Init();
|
||||
|
||||
/* Prototypes */
|
||||
void SetPaths(string path, u32 partition, bool disable = false);
|
||||
void SetNANDEmu(u32 partition);
|
||||
s32 Enable_Emu();
|
||||
s32 Disable_Emu();
|
||||
bool EmulationEnabled(void);
|
||||
@ -71,15 +77,19 @@ public:
|
||||
void Init_ISFS();
|
||||
void DeInit_ISFS(bool KeepPatches = false);
|
||||
|
||||
const char * Get_NandPath(void) { return NandPath; };
|
||||
const char *Get_NandPath(void) { return NandPath; };
|
||||
u32 Get_Partition(void) { return Partition; };
|
||||
|
||||
void Set_NandPath(string path);
|
||||
void CreatePath(const char *path, ...);
|
||||
u64 *GetChannels(u32 *count);
|
||||
u8 *GetTMD(u64 title, u32 *size);
|
||||
u8 *GetEmuFile(const char *path, u32 *size, s32 len = -1);
|
||||
void SetPaths(const char *emuPath, const char *currentPart);
|
||||
|
||||
void CreateTitleTMD(const char *path, dir_discHdr *hdr);
|
||||
s32 CreateConfig(const char *path);
|
||||
s32 PreNandCfg(const char *path, bool miis, bool realconfig);
|
||||
void CreatePath(const char *path, ...);
|
||||
void CreateTitleTMD(dir_discHdr *hdr);
|
||||
s32 CreateConfig();
|
||||
|
||||
s32 PreNandCfg(bool miis, bool realconfig);
|
||||
s32 Do_Region_Change(string id);
|
||||
s32 FlashToNAND(const char *source, const char *dest, dump_callback_t i_dumper, void *i_data);
|
||||
s32 DoNandDump(const char *source, const char *dest, dump_callback_t i_dumper, void *i_data);
|
||||
@ -123,7 +133,6 @@ private:
|
||||
u32 FileDone;
|
||||
u32 FilesDone;
|
||||
u32 FoldersDone;
|
||||
bool Disabled;
|
||||
bool fake;
|
||||
bool showprogress;
|
||||
bool AccessPatched;
|
||||
@ -133,6 +142,7 @@ private:
|
||||
u32 Partition ATTRIBUTE_ALIGN(32);
|
||||
u32 FullMode ATTRIBUTE_ALIGN(32);
|
||||
char NandPath[32] ATTRIBUTE_ALIGN(32);
|
||||
char FullNANDPath[64] ATTRIBUTE_ALIGN(32);
|
||||
char cfgpath[1024];
|
||||
char settxtpath[1024];
|
||||
};
|
||||
|
@ -47,6 +47,7 @@ bool AHBRPOT_Patched(void);
|
||||
extern void __exception_setreload(int t);
|
||||
extern int mainIOS;
|
||||
extern bool useMainIOS;
|
||||
extern volatile bool NANDemuView;
|
||||
extern u8 currentPartition;
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -22,11 +22,12 @@
|
||||
|
||||
CMenu mainMenu;
|
||||
bool useMainIOS = false;
|
||||
volatile bool NANDemuView = false;
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
mainIOS = DOL_MAIN_IOS;
|
||||
__exception_setreload(5);
|
||||
__exception_setreload(10);
|
||||
Gecko_Init(); //USB Gecko and SD/WiFi buffer
|
||||
gprintf(" \nWelcome to %s!\nThis is the debug output.\n", VERSION_STRING.c_str());
|
||||
|
||||
|
@ -2221,47 +2221,27 @@ const wstringEx CMenu::_fmt(const char *key, const wchar_t *def)
|
||||
|
||||
bool CMenu::_loadChannelList(void)
|
||||
{
|
||||
string emuPath;
|
||||
string emuPath;
|
||||
string cacheDir;
|
||||
int emuPartition = -1;
|
||||
|
||||
bool disable_emu = (m_cfg.getBool(CHANNEL_DOMAIN, "disable", true) || neek2o());
|
||||
|
||||
if(!disable_emu)
|
||||
NANDemuView = (!neek2o() && m_cfg.getBool(CHANNEL_DOMAIN, "disable", true) == false);
|
||||
if(NANDemuView)
|
||||
{
|
||||
m_partRequest = m_cfg.getInt(CHANNEL_DOMAIN, "partition", 1);
|
||||
emuPartition = _FindEmuPart(&emuPath, m_partRequest, false);
|
||||
|
||||
if(emuPartition < 0)
|
||||
emuPartition = _FindEmuPart(&emuPath, m_partRequest, true);
|
||||
|
||||
if(emuPartition < 0)
|
||||
return false;
|
||||
else
|
||||
currentPartition = emuPartition;
|
||||
}
|
||||
|
||||
if(!disable_emu)
|
||||
{
|
||||
char basepath[64];
|
||||
snprintf(basepath, sizeof(basepath), "%s:%s", DeviceName[currentPartition], emuPath.c_str());
|
||||
NandHandle.PreNandCfg(basepath, m_cfg.getBool(CHANNEL_DOMAIN, "real_nand_miis", false), m_cfg.getBool(CHANNEL_DOMAIN, "real_nand_config", false));
|
||||
}
|
||||
NandHandle.Disable_Emu();
|
||||
if(!disable_emu)
|
||||
{
|
||||
MusicPlayer.Stop();
|
||||
TempLoadIOS();
|
||||
DeviceHandle.UnMount(currentPartition);
|
||||
NandHandle.SetPaths(emuPath.c_str(), currentPartition, disable_emu);
|
||||
if(NandHandle.Enable_Emu() < 0)
|
||||
NandHandle.Disable_Emu();
|
||||
}
|
||||
if(!DeviceHandle.IsInserted(currentPartition))
|
||||
DeviceHandle.Mount(currentPartition);
|
||||
|
||||
string cacheDir;
|
||||
if(!disable_emu)
|
||||
currentPartition = emuPartition;
|
||||
NandHandle.SetNANDEmu(currentPartition); /* Init NAND Emu */
|
||||
NandHandle.SetPaths(emuPath.c_str(), DeviceName[currentPartition]);
|
||||
NandHandle.PreNandCfg(m_cfg.getBool(CHANNEL_DOMAIN, "real_nand_miis", false),
|
||||
m_cfg.getBool(CHANNEL_DOMAIN, "real_nand_config", false));
|
||||
cacheDir = fmt("%s/%s_channels.db", m_listCacheDir.c_str(), DeviceName[currentPartition]);
|
||||
}
|
||||
bool updateCache = m_cfg.getBool(_domainFromView(), "update_cache");
|
||||
vector<string> NullVector;
|
||||
m_gameList.CreateList(m_current_view, currentPartition, std::string(),
|
||||
@ -2272,13 +2252,7 @@ bool CMenu::_loadChannelList(void)
|
||||
bool CMenu::_loadList(void)
|
||||
{
|
||||
CoverFlow.clear();
|
||||
if((m_current_view == COVERFLOW_CHANNEL && m_cfg.getBool(CHANNEL_DOMAIN, "disable", true))
|
||||
|| (m_current_view != COVERFLOW_CHANNEL && NandHandle.EmulationEnabled()))
|
||||
{
|
||||
MusicPlayer.Stop();
|
||||
NandHandle.Disable_Emu();
|
||||
TempLoadIOS(IOS_TYPE_NORMAL_IOS);
|
||||
}
|
||||
NANDemuView = false;
|
||||
gprintf("Switching View to %s\n", _domainFromView());
|
||||
|
||||
bool retval;
|
||||
|
@ -207,19 +207,12 @@ int CMenu::_config1(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (currentPartition != bCurrentPartition)
|
||||
if(currentPartition != bCurrentPartition)
|
||||
{
|
||||
bool disable = (m_cfg.getBool(CHANNEL_DOMAIN, "disable", true) || neek2o())
|
||||
&& m_current_view == COVERFLOW_CHANNEL && !m_tempView;
|
||||
if(!disable)
|
||||
{
|
||||
_showWaitMessage();
|
||||
_loadList();
|
||||
_hideWaitMessage();
|
||||
}
|
||||
_showWaitMessage();
|
||||
_loadList();
|
||||
_hideWaitMessage();
|
||||
}
|
||||
|
||||
_hideConfig();
|
||||
|
||||
return change;
|
||||
|
@ -74,7 +74,6 @@ void CMenu::_showConfig4(void)
|
||||
|
||||
wstringEx channelName = m_loc.getWString(m_curLanguage, "disabled", L"Disabled");
|
||||
|
||||
NandHandle.Disable_Emu();
|
||||
ChannelHandle.Init(m_loc.getString(m_curLanguage, "gametdb_code", "EN"));
|
||||
amountOfChannels = ChannelHandle.Count();
|
||||
|
||||
@ -143,8 +142,6 @@ int CMenu::_config4(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!neek2o() && m_current_view == COVERFLOW_CHANNEL && m_cfg.getBool(CHANNEL_DOMAIN, "disable", true) == false)
|
||||
NandHandle.Enable_Emu();
|
||||
_hideConfig4();
|
||||
return change;
|
||||
}
|
||||
|
@ -427,7 +427,6 @@ s32 CMenu::_networkComplete(s32 ok, void *usrData)
|
||||
|
||||
int CMenu::_initNetwork()
|
||||
{
|
||||
NandHandle.Disable_Emu();
|
||||
while (net_get_status() == -EBUSY || m_thrdNetwork) {}; // Async initialization may be busy, wait to see if it succeeds.
|
||||
if (m_networkInit) return 0;
|
||||
if (!_isNetworkAvailable()) return -2;
|
||||
|
@ -765,8 +765,6 @@ void CMenu::directlaunch(const char *GameID)
|
||||
|
||||
void CMenu::_launch(dir_discHdr *hdr)
|
||||
{
|
||||
/* No need to do that separate */
|
||||
NandHandle.Disable_Emu();
|
||||
/* Lets boot that shit */
|
||||
if(hdr->type == TYPE_WII_GAME)
|
||||
_launchGame(hdr, false);
|
||||
@ -1090,15 +1088,12 @@ void CMenu::_launchChannel(dir_discHdr *hdr)
|
||||
ShutdownBeforeExit();
|
||||
Launch_nk(gameTitle, emuPath.size() > 1 ? emuPath.c_str() : NULL,
|
||||
returnTo ? (((u64)(0x00010001) << 32) | (returnTo & 0xFFFFFFFF)) : 0);
|
||||
while(1);
|
||||
while(1) usleep(500);
|
||||
}
|
||||
DeviceHandle.UnMount(emuPartition);
|
||||
NandHandle.SetPaths(emuPath.c_str(), emuPartition, false);
|
||||
NandHandle.Enable_Emu();
|
||||
NandHandle.SetPaths(emuPath.c_str(), DeviceName[emuPartition]);
|
||||
NANDemuView = true;
|
||||
}
|
||||
gameIOS = ChannelHandle.GetRequestedIOS(gameTitle);
|
||||
if(NAND_Emu && !neek2o())
|
||||
NandHandle.Disable_Emu();
|
||||
if(_loadIOS(gameIOS, userIOS, id, !NAND_Emu) == LOAD_IOS_FAILED)
|
||||
Sys_Exit();
|
||||
if((CurrentIOS.Type == IOS_TYPE_D2X || neek2o()) && returnTo != 0)
|
||||
@ -1108,7 +1103,6 @@ void CMenu::_launchChannel(dir_discHdr *hdr)
|
||||
}
|
||||
if(NAND_Emu && !neek2o())
|
||||
{
|
||||
NandHandle.SetPaths(emuPath.c_str(), emuPartition, false);
|
||||
if(emulate_mode == 1)
|
||||
NandHandle.Set_FullMode(true);
|
||||
else
|
||||
@ -1264,14 +1258,10 @@ void CMenu::_launchGame(dir_discHdr *hdr, bool dvd)
|
||||
NandHandle.CreatePath("%s:/wiiflow/nandemu", DeviceName[emuPartition]);
|
||||
}
|
||||
}
|
||||
|
||||
m_cfg.setInt(WII_DOMAIN, "savepartition", emuPartition);
|
||||
m_cfg.setString(WII_DOMAIN, "savepath", emuPath);
|
||||
m_cfg.save();
|
||||
|
||||
char basepath[64];
|
||||
snprintf(basepath, sizeof(basepath), "%s:%s", DeviceName[emuPartition], emuPath.c_str());
|
||||
|
||||
|
||||
if(emulate_mode == 2 || emulate_mode > 3)
|
||||
{
|
||||
if(emulate_mode == 2)
|
||||
@ -1279,13 +1269,13 @@ void CMenu::_launchGame(dir_discHdr *hdr, bool dvd)
|
||||
m_forceext = false;
|
||||
_hideWaitMessage();
|
||||
if(!_AutoExtractSave(id))
|
||||
NandHandle.CreateTitleTMD(basepath, hdr);
|
||||
NandHandle.CreateTitleTMD(hdr);
|
||||
_showWaitMessage();
|
||||
}
|
||||
}
|
||||
if(emulate_mode > 2)
|
||||
{
|
||||
NandHandle.CreateConfig(basepath);
|
||||
NandHandle.CreateConfig();
|
||||
NandHandle.Do_Region_Change(id);
|
||||
}
|
||||
}
|
||||
@ -1338,9 +1328,9 @@ void CMenu::_launchGame(dir_discHdr *hdr, bool dvd)
|
||||
}
|
||||
if(emulate_mode && !neek2o() && CurrentIOS.Type == IOS_TYPE_D2X)
|
||||
{
|
||||
NandHandle.SetPaths(emuPath.c_str(), emuPartition, false);
|
||||
NANDemuView = true;
|
||||
NandHandle.SetPaths(emuPath.c_str(), DeviceName[emuPartition]);
|
||||
DeviceHandle.UnMount(emuPartition);
|
||||
|
||||
if(emulate_mode == 3)
|
||||
NandHandle.Set_RCMode(true);
|
||||
else if(emulate_mode == 4)
|
||||
@ -1353,8 +1343,6 @@ void CMenu::_launchGame(dir_discHdr *hdr, bool dvd)
|
||||
error(_t("errgame6", L"Enabling emu after reload failed!"));
|
||||
Sys_Exit();
|
||||
}
|
||||
if(!DeviceHandle.IsInserted(currentPartition))
|
||||
DeviceHandle.Mount(currentPartition);
|
||||
DeviceHandle.Mount(emuPartition);
|
||||
}
|
||||
bool wbfs_partition = false;
|
||||
|
@ -150,10 +150,8 @@ void CMenu::_showMain(void)
|
||||
m_btnMgr.show(m_mainLblInit);
|
||||
break;
|
||||
case COVERFLOW_CHANNEL:
|
||||
if(!m_cfg.getBool(CHANNEL_DOMAIN, "disable", true))
|
||||
if(NANDemuView)
|
||||
{
|
||||
NandHandle.Disable_Emu();
|
||||
DeviceHandle.MountAll();
|
||||
_hideMain();
|
||||
if(!_AutoCreateNand())
|
||||
m_cfg.setBool(CHANNEL_DOMAIN, "disable", true);
|
||||
@ -174,8 +172,6 @@ void CMenu::_showMain(void)
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if(!neek2o() && m_current_view == COVERFLOW_CHANNEL && !m_cfg.getBool(CHANNEL_DOMAIN, "disable", true))
|
||||
NandHandle.Enable_Emu();
|
||||
}
|
||||
|
||||
void CMenu::LoadView(void)
|
||||
@ -403,7 +399,6 @@ int CMenu::main(void)
|
||||
_showWaitMessage();
|
||||
m_gameSound.Stop();
|
||||
CheckGameSoundThread();
|
||||
NandHandle.Disable_Emu();
|
||||
/* Create Fake Header */
|
||||
dir_discHdr hdr;
|
||||
memset(&hdr, 0, sizeof(dir_discHdr));
|
||||
@ -1043,15 +1038,9 @@ wstringEx CMenu::_getNoticeTranslation(int sorting, wstringEx curLetter)
|
||||
|
||||
void CMenu::_setPartition(s8 direction)
|
||||
{
|
||||
_cfNeedsUpdate();
|
||||
bool disable = m_current_view == COVERFLOW_CHANNEL && !m_tempView &&
|
||||
(m_cfg.getBool(CHANNEL_DOMAIN, "disable", true) || neek2o());
|
||||
if(disable)
|
||||
if(m_current_view == COVERFLOW_CHANNEL && NANDemuView == false)
|
||||
return;
|
||||
|
||||
if(m_current_view == COVERFLOW_CHANNEL)
|
||||
NandHandle.Enable_Emu();
|
||||
|
||||
_cfNeedsUpdate();
|
||||
if(direction != 0)
|
||||
{
|
||||
u8 limiter = 0;
|
||||
|
@ -92,8 +92,6 @@ bool CMenu::_TestEmuNand(int epart, const char *path, bool indept)
|
||||
|
||||
int CMenu::_FindEmuPart(string *emuPath, int part, bool searchvalid)
|
||||
{
|
||||
NandHandle.Disable_Emu();
|
||||
|
||||
int emuPartition = -1;
|
||||
string tmpPath;
|
||||
if(m_current_view == COVERFLOW_CHANNEL)
|
||||
@ -118,10 +116,6 @@ int CMenu::_FindEmuPart(string *emuPath, int part, bool searchvalid)
|
||||
tmpPath = m_cfg.getString(WII_DOMAIN, "savepath", STDEMU_DIR);
|
||||
}
|
||||
}
|
||||
|
||||
if(!DeviceHandle.IsInserted(emuPartition))
|
||||
DeviceHandle.Mount(emuPartition);
|
||||
|
||||
if(_TestEmuNand(emuPartition, tmpPath.c_str(), true) && DeviceHandle.PartitionUsableForNandEmu(emuPartition))
|
||||
{
|
||||
*emuPath = tmpPath;
|
||||
@ -132,12 +126,8 @@ int CMenu::_FindEmuPart(string *emuPath, int part, bool searchvalid)
|
||||
bool fllscn = emuPartition == -1;
|
||||
for(u8 i = part; i <= USB8; ++i)
|
||||
{
|
||||
if(!DeviceHandle.IsInserted(i))
|
||||
DeviceHandle.Mount(i);
|
||||
|
||||
if(!DeviceHandle.PartitionUsableForNandEmu(i))
|
||||
continue;
|
||||
|
||||
if(_TestEmuNand(i, tmpPath.c_str(), true) || searchvalid)
|
||||
{
|
||||
if(m_current_view == COVERFLOW_CHANNEL)
|
||||
@ -150,7 +140,6 @@ int CMenu::_FindEmuPart(string *emuPath, int part, bool searchvalid)
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
if(i == USB8 && !fllscn)
|
||||
{
|
||||
i = -1;
|
||||
@ -158,7 +147,6 @@ int CMenu::_FindEmuPart(string *emuPath, int part, bool searchvalid)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user