-fixed booting IOS reloading games properly

-fixed booting channels from wiiflow neek mode
This commit is contained in:
fix94.1 2012-08-25 22:09:11 +00:00
parent cd339875d7
commit a3bf8fff5a
5 changed files with 37 additions and 51 deletions

View File

@ -158,8 +158,10 @@ s32 Nand::Enable_Emu()
if(emu_enabled) if(emu_enabled)
return 0; return 0;
if(CurrentIOS.Type == IOS_TYPE_NORMAL_IOS) if(CurrentIOS.Type == IOS_TYPE_NORMAL_IOS)
{
loadIOS(mainIOS, true); loadIOS(mainIOS, true);
Open_Inputs();
}
NandDevice *Device = &NandDeviceList[EmuDevice]; NandDevice *Device = &NandDeviceList[EmuDevice];
s32 ret = Nand_Mount(Device); s32 ret = Nand_Mount(Device);
@ -1060,10 +1062,10 @@ void Nand::Init_ISFS()
} }
} }
void Nand::DeInit_ISFS() void Nand::DeInit_ISFS(bool KeepPatches)
{ {
gprintf("Deinit ISFS\n"); gprintf("Deinit ISFS\n");
if(AHBRPOT_Patched()) if(AHBRPOT_Patched() && !KeepPatches)
{ {
// Disable memory protection // Disable memory protection
write16(MEM_PROT, 0); write16(MEM_PROT, 0);

View File

@ -68,7 +68,7 @@ public:
void Set_SSMode(bool ssmode) { FullMode = ssmode ? 0x60 : 0; }; void Set_SSMode(bool ssmode) { FullMode = ssmode ? 0x60 : 0; };
void Init_ISFS(); void Init_ISFS();
void DeInit_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; }; u32 Get_Partition(void) { return Partition; };

View File

@ -84,7 +84,6 @@ bool loadIOS(int ios, bool MountDevices)
{ {
bool ret = true; bool ret = true;
m_music.Stop(); m_music.Stop();
Close_Inputs();
DeviceHandler::Instance()->UnMountAll(); DeviceHandler::Instance()->UnMountAll();
USBStorage2_Deinit(); USBStorage2_Deinit();
SDHC_Close(); SDHC_Close();
@ -93,13 +92,14 @@ bool loadIOS(int ios, bool MountDevices)
mload_close(); mload_close();
if(ios != IOS_GetVersion()) if(ios != IOS_GetVersion())
{ {
WDVD_Close();
Close_Inputs();
gprintf("Reloading into IOS %i from %i...\n", ios, IOS_GetVersion()); gprintf("Reloading into IOS %i from %i...\n", ios, IOS_GetVersion());
Nand::Instance()->DeInit_ISFS(); Nand::Instance()->DeInit_ISFS();
WDVD_Close();
ret = IOS_ReloadIOS(ios) == 0; ret = IOS_ReloadIOS(ios) == 0;
WDVD_Init();
Nand::Instance()->Init_ISFS(); Nand::Instance()->Init_ISFS();
gprintf("AHBPROT after IOS Reload: %u\n", AHBRPOT_Patched()); gprintf("AHBPROT after IOS Reload: %u\n", AHBRPOT_Patched());
WDVD_Init();
} }
#endif #endif

View File

@ -90,7 +90,7 @@ void WiiFlow_ExternalBooter(u8 vidMode, bool vipatch, bool countryString, u8 pat
memcpy((void *)0x90000000, &normalCFG, sizeof(the_CFG)); memcpy((void *)0x90000000, &normalCFG, sizeof(the_CFG));
DCFlushRange((void *)(0x90000000), sizeof(the_CFG)); DCFlushRange((void *)(0x90000000), sizeof(the_CFG));
Nand::Instance()->DeInit_ISFS(); Nand::Instance()->DeInit_ISFS(true); //cIOS loves magic :P
memcpy(EXECUTE_ADDR, wii_game_booter_dol, wii_game_booter_dol_size); memcpy(EXECUTE_ADDR, wii_game_booter_dol, wii_game_booter_dol_size);
DCFlushRange(EXECUTE_ADDR, wii_game_booter_dol_size); DCFlushRange(EXECUTE_ADDR, wii_game_booter_dol_size);
BootHomebrew(); BootHomebrew();

View File

@ -987,33 +987,6 @@ int CMenu::_loadIOS(u8 gameIOS, int userIOS, string id)
return LOAD_IOS_NOT_NEEDED; return LOAD_IOS_NOT_NEEDED;
} }
s32 IOSReloadBlock(u8 reqios, bool enable)
{
s32 ESHandle = IOS_Open("/dev/es", 0);
if (ESHandle < 0)
return ESHandle;
static ioctlv vector[2] ATTRIBUTE_ALIGN(32);
static u32 mode ATTRIBUTE_ALIGN(32);
static u32 ios ATTRIBUTE_ALIGN(32);
mode = enable ? 2 : 0;
vector[0].data = &mode;
vector[0].len = sizeof(u32);
if (enable) {
ios = reqios;
vector[1].data = &ios;
vector[1].len = sizeof(u32);
}
s32 r = IOS_Ioctlv(ESHandle, 0xA0, 2, 0, vector);
IOS_Close(ESHandle);
return r;
}
static const char systems[11] = { 'C', 'E', 'F', 'J', 'L', 'M', 'N', 'P', 'Q', 'W', 'H' }; static const char systems[11] = { 'C', 'E', 'F', 'J', 'L', 'M', 'N', 'P', 'Q', 'W', 'H' };
void CMenu::_launchChannel(dir_discHdr *hdr) void CMenu::_launchChannel(dir_discHdr *hdr)
@ -1072,7 +1045,7 @@ void CMenu::_launchChannel(dir_discHdr *hdr)
m_partRequest = m_cfg.getInt("NAND", "partition", 0); m_partRequest = m_cfg.getInt("NAND", "partition", 0);
int emuPartition = _FindEmuPart(&emuPath, m_partRequest, false); int emuPartition = _FindEmuPart(&emuPath, m_partRequest, false);
bool emu_disabled = m_cfg.getBool("NAND", "disable", true); bool emu_disabled = (m_cfg.getBool("NAND", "disable", true) || neek2o());
int emulate_mode = min(max(0, m_cfg.getInt("NAND", "emulation", 1)), (int)ARRAY_SIZE(CMenu::_NandEmu) - 1); int emulate_mode = min(max(0, m_cfg.getInt("NAND", "emulation", 1)), (int)ARRAY_SIZE(CMenu::_NandEmu) - 1);
int userIOS = m_gcfg2.getInt(id, "ios", 0); int userIOS = m_gcfg2.getInt(id, "ios", 0);
@ -1097,7 +1070,7 @@ void CMenu::_launchChannel(dir_discHdr *hdr)
} }
DeviceHandler::Instance()->UnMountAll(); DeviceHandler::Instance()->UnMountAll();
if(!forwarder) if(!forwarder || neek2o())
{ {
if(!emu_disabled) if(!emu_disabled)
{ {
@ -1127,7 +1100,7 @@ void CMenu::_launchChannel(dir_discHdr *hdr)
gprintf("Return to channel %s %s. Using new d2x way\n", rtrn, IOS_Ioctlv(ESHandle, 0xA1, 1, 0, vector) != -101 ? "Succeeded" : "Failed!" ); gprintf("Return to channel %s %s. Using new d2x way\n", rtrn, IOS_Ioctlv(ESHandle, 0xA1, 1, 0, vector) != -101 ? "Succeeded" : "Failed!" );
IOS_Close(ESHandle); IOS_Close(ESHandle);
} }
if(!emu_disabled && !neek2o()) if(!emu_disabled)
{ {
Nand::Instance()->Init(emuPath.c_str(), emuPartition, false); Nand::Instance()->Init(emuPath.c_str(), emuPartition, false);
if(emulate_mode == 1) if(emulate_mode == 1)
@ -1167,6 +1140,8 @@ void CMenu::_launchGame(dir_discHdr *hdr, bool dvd)
string id(hdr->id); string id(hdr->id);
string path(hdr->path); string path(hdr->path);
m_gameSound.Stop();
CheckGameSoundThread();
Nand::Instance()->Disable_Emu(); Nand::Instance()->Disable_Emu();
if(neek2o()) if(neek2o())
@ -1257,15 +1232,14 @@ void CMenu::_launchGame(dir_discHdr *hdr, bool dvd)
u8 emulate_mode = min((u32)m_gcfg2.getInt(id, "emulate_save", 0), ARRAY_SIZE(CMenu::_SaveEmu) - 1u); u8 emulate_mode = min((u32)m_gcfg2.getInt(id, "emulate_save", 0), ARRAY_SIZE(CMenu::_SaveEmu) - 1u);
if (emulate_mode == 0) if(emulate_mode == 0)
{ {
emulate_mode = min(max(0, m_cfg.getInt("GAMES", "save_emulation", 0)), (int)ARRAY_SIZE(CMenu::_GlobalSaveEmu) - 1); emulate_mode = min(max(0, m_cfg.getInt("GAMES", "save_emulation", 0)), (int)ARRAY_SIZE(CMenu::_GlobalSaveEmu) - 1);
if(emulate_mode != 0) if(emulate_mode != 0)
emulate_mode++; emulate_mode++;
} }
else if(emulate_mode == 1) else if(emulate_mode == 1)
emulate_mode = 0; emulate_mode = 0;
if(!dvd && emulate_mode) if(!dvd && emulate_mode)
{ {
if(emuPartition < 0) if(emuPartition < 0)
@ -1292,7 +1266,6 @@ void CMenu::_launchGame(dir_discHdr *hdr, bool dvd)
Nand::Instance()->CreatePath("%s:/wiiflow/nandemu", DeviceName[emuPartition]); Nand::Instance()->CreatePath("%s:/wiiflow/nandemu", DeviceName[emuPartition]);
} }
} }
char basepath[64]; char basepath[64];
snprintf(basepath, sizeof(basepath), "%s:%s", DeviceName[emuPartition], emuPath.c_str()); snprintf(basepath, sizeof(basepath), "%s:%s", DeviceName[emuPartition], emuPath.c_str());
@ -1313,7 +1286,6 @@ void CMenu::_launchGame(dir_discHdr *hdr, bool dvd)
Nand::Instance()->Do_Region_Change(id); Nand::Instance()->Do_Region_Change(id);
} }
} }
#ifndef DOLPHIN #ifndef DOLPHIN
bool iosLoaded = false; bool iosLoaded = false;
if(!dvd || neek2o()) if(!dvd || neek2o())
@ -1346,7 +1318,6 @@ void CMenu::_launchGame(dir_discHdr *hdr, bool dvd)
SmartBuf cheatFile, gameconfig; SmartBuf cheatFile, gameconfig;
u32 cheatSize = 0, gameconfigSize = 0, returnTo = 0; u32 cheatSize = 0, gameconfigSize = 0, returnTo = 0;
CheckGameSoundThread();
m_cfg.setString("GAMES", "current_item", id); m_cfg.setString("GAMES", "current_item", id);
m_gcfg1.setInt("PLAYCOUNT", id, m_gcfg1.getInt("PLAYCOUNT", id, 0) + 1); m_gcfg1.setInt("PLAYCOUNT", id, m_gcfg1.getInt("PLAYCOUNT", id, 0) + 1);
m_gcfg1.setUInt("LASTPLAYED", id, time(NULL)); m_gcfg1.setUInt("LASTPLAYED", id, time(NULL));
@ -1375,18 +1346,31 @@ void CMenu::_launchGame(dir_discHdr *hdr, bool dvd)
if(CurrentIOS.Type == IOS_TYPE_D2X) if(CurrentIOS.Type == IOS_TYPE_D2X)
{ {
/* Open ES Module */
s32 ESHandle = IOS_Open("/dev/es", 0);
/* IOS Reload Block */
static ioctlv block_vector[2] ATTRIBUTE_ALIGN(32);
static u32 mode ATTRIBUTE_ALIGN(32);
static u32 ios ATTRIBUTE_ALIGN(32);
mode = 2;
block_vector[0].data = &mode;
block_vector[0].len = sizeof(u32);
ios = IOS_GetVersion();
block_vector[1].data = &ios;
block_vector[1].len = sizeof(u32);
gprintf("Block IOS Reload for %i %s\n", ios, IOS_Ioctlv(ESHandle, 0xA0, 2, 0, block_vector) < 0 ? "failed!" : "succeeded");
/* Return to */
if(!m_directLaunch && returnTo) if(!m_directLaunch && returnTo)
{ {
static ioctlv vector[1] ATTRIBUTE_ALIGN(32); static ioctlv rtn_vector[1] ATTRIBUTE_ALIGN(32);
sm_title_id[0] = (((u64)(0x00010001) << 32) | (returnTo & 0xFFFFFFFF)); sm_title_id[0] = (((u64)(0x00010001) << 32) | (returnTo & 0xFFFFFFFF));
vector[0].data = sm_title_id; rtn_vector[0].data = sm_title_id;
vector[0].len = 8; rtn_vector[0].len = sizeof(u64);
s32 ESHandle = IOS_Open("/dev/es", 0); gprintf("Return to channel %s %s. Using new d2x way\n", rtrn, IOS_Ioctlv(ESHandle, 0xA1, 1, 0, rtn_vector) != -101 ? "succeeded" : "failed!");
gprintf("Return to channel %s %s. Using new d2x way\n", rtrn, IOS_Ioctlv(ESHandle, 0xA1, 1, 0, vector) != -101 ? "succeeded" : "failed!");
IOS_Close(ESHandle);
returnTo = 0; returnTo = 0;
} }
IOSReloadBlock(CurrentIOS.Version, true); /* Close ES Module */
IOS_Close(ESHandle);
} }
if(emulate_mode && !neek2o()) if(emulate_mode && !neek2o())
{ {