Work towards implementing ES_LAUNCH
returning to installed wii menu from a disc based game is working however wiimote does not work launching title from the wii menu has a similar issue only tested photo channel 1.1, channel loads but wiimote does not work as before launching channels requires sysmenu < 3.0 and you can change between sys menus via extracted wads by installing any version IE if 4.2 is installed, right click on 2.0 wad in the gamelist and install to wiimenu and right click on 4.2 wad and install to go back to menu 4.2 git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6175 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
80a9116c0d
commit
9e3dd4d2d4
|
@ -53,7 +53,7 @@
|
||||||
#include "FileUtil.h"
|
#include "FileUtil.h"
|
||||||
#include "AES/aes.h"
|
#include "AES/aes.h"
|
||||||
|
|
||||||
|
#include "../Boot/Boot_DOL.h"
|
||||||
|
|
||||||
CWII_IPC_HLE_Device_es::CWII_IPC_HLE_Device_es(u32 _DeviceID, const std::string& _rDeviceName)
|
CWII_IPC_HLE_Device_es::CWII_IPC_HLE_Device_es(u32 _DeviceID, const std::string& _rDeviceName)
|
||||||
: IWII_IPC_HLE_Device(_DeviceID, _rDeviceName)
|
: IWII_IPC_HLE_Device(_DeviceID, _rDeviceName)
|
||||||
|
@ -680,6 +680,8 @@ bool CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress)
|
||||||
case IOCTL_ES_LAUNCH:
|
case IOCTL_ES_LAUNCH:
|
||||||
{
|
{
|
||||||
_dbg_assert_(WII_IPC_ES, Buffer.NumberInBuffer == 2);
|
_dbg_assert_(WII_IPC_ES, Buffer.NumberInBuffer == 2);
|
||||||
|
bool bSuccess = false;
|
||||||
|
u16 IOSv = 0xffff;
|
||||||
|
|
||||||
u64 TitleID = Memory::Read_U64(Buffer.InBuffer[0].m_Address);
|
u64 TitleID = Memory::Read_U64(Buffer.InBuffer[0].m_Address);
|
||||||
|
|
||||||
|
@ -689,12 +691,60 @@ bool CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress)
|
||||||
u64 titleid = Memory::Read_U64(Buffer.InBuffer[1].m_Address+16);
|
u64 titleid = Memory::Read_U64(Buffer.InBuffer[1].m_Address+16);
|
||||||
u16 access = Memory::Read_U16(Buffer.InBuffer[1].m_Address+24);
|
u16 access = Memory::Read_U16(Buffer.InBuffer[1].m_Address+24);
|
||||||
|
|
||||||
PanicAlert("IOCTL_ES_LAUNCH: src titleID %08x/%08x -> start %08x/%08x \n"
|
/* PanicAlert("IOCTL_ES_LAUNCH: src titleID %08x/%08x -> start %08x/%08x \n"
|
||||||
"This means that dolphin tries to relaunch the WiiMenu or"
|
"This means that dolphin tries to relaunch the WiiMenu or"
|
||||||
"launches code from the an URL. Both wont work and dolphin will prolly hang...",
|
"launches code from the an URL. Both wont work and dolphin will prolly hang...",
|
||||||
(u32)(TitleID>>32), (u32)TitleID, (u32)(titleid>>32), (u32)titleid );
|
(u32)(TitleID>>32), (u32)TitleID, (u32)(titleid>>32), (u32)titleid );
|
||||||
|
*/
|
||||||
|
if ((u32)(TitleID>>32) != 0x00000001 || TitleID == 0x0000000100000002ull)
|
||||||
|
{
|
||||||
|
std::string titlePath = CreateTitleContentPath(TitleID);
|
||||||
|
const DiscIO::INANDContentLoader& ContentLoader = DiscIO::CNANDContentManager::Access().GetNANDLoader(titlePath);
|
||||||
|
if (ContentLoader.IsValid())
|
||||||
|
{
|
||||||
|
u32 bootInd = ContentLoader.GetBootIndex();
|
||||||
|
const DiscIO::SNANDContent* pContent = ContentLoader.GetContentByIndex(bootInd);
|
||||||
|
if (pContent)
|
||||||
|
{
|
||||||
|
LoadWAD(titlePath);
|
||||||
|
CDolLoader DolLoader(pContent->m_pData, pContent->m_Size);
|
||||||
|
PC = DolLoader.GetEntryPoint() | 0x80000000;
|
||||||
|
IOSv = ContentLoader.GetIosVersion();
|
||||||
|
bSuccess = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // IOS, MIOS, BC etc
|
||||||
|
{
|
||||||
|
//TODO: fixme
|
||||||
|
// The following is obviously a hack
|
||||||
|
// Lie to mem about loading a different ios
|
||||||
|
// someone with an affected game should test
|
||||||
|
IOSv = TitleID && 0xffff;
|
||||||
|
}
|
||||||
|
// Pass the "#002 check"
|
||||||
|
// Apploader should write the IOS version and revision to 0x3140, and compare it
|
||||||
|
// to 0x3188 to pass the check, but we don't do it, and i don't know where to read the IOS rev...
|
||||||
|
// Currently we just write 0xFFFF for the revision, copy manually and it works fine :p
|
||||||
|
// TODO : figure it correctly : where should we read the IOS rev that the wad "needs" ?
|
||||||
|
Memory::Write_U16(IOSv, 0x00003140);
|
||||||
|
Memory::Write_U16(0xFFFF, 0x00003142);
|
||||||
|
Memory::Write_U32(Memory::Read_U32(0x00003140), 0x00003188);
|
||||||
|
|
||||||
Memory::Write_U32(0, _CommandAddress + 0x4);
|
/*
|
||||||
|
u8* lSys = new u8[0xe0];
|
||||||
|
memset(lSys, 0, 0x100);
|
||||||
|
*(u64*)lSys = Common::swap64(TitleID);
|
||||||
|
Memory::ReadBigEData(lSys + sizeof(u64), view, 0xD8);
|
||||||
|
char lSysPath[1024];
|
||||||
|
sprintf(lSysPath, "%ssys/launch.sys", File::GetUserPath(D_WIIUSER_IDX));
|
||||||
|
FILE* launchSys = fopen(lSysPath, "wb");
|
||||||
|
fwrite(lSys, 0xe0, 1, launchSys);
|
||||||
|
fclose(launchSys);
|
||||||
|
*/
|
||||||
|
|
||||||
|
//TODO: provide correct return code when bSuccess= false
|
||||||
|
Memory::Write_U32(0, _CommandAddress + 0x4);
|
||||||
|
|
||||||
ERROR_LOG(WII_IPC_ES, "IOCTL_ES_LAUNCH %016llx %08x %016llx %08x %016llx %04x", TitleID,view,ticketid,devicetype,titleid,access);
|
ERROR_LOG(WII_IPC_ES, "IOCTL_ES_LAUNCH %016llx %08x %016llx %08x %016llx %04x", TitleID,view,ticketid,devicetype,titleid,access);
|
||||||
// IOCTL_ES_LAUNCH 0001000248414341 00000001 0001c0fef3df2cfa 00000000 0001000248414341 ffff
|
// IOCTL_ES_LAUNCH 0001000248414341 00000001 0001c0fef3df2cfa 00000000 0001000248414341 ffff
|
||||||
|
@ -764,9 +814,9 @@ std::string CWII_IPC_HLE_Device_es::CreateTicketFileName(u64 _TitleID) const
|
||||||
|
|
||||||
std::string CWII_IPC_HLE_Device_es::CreateTitleContentPath(u64 _TitleID) const
|
std::string CWII_IPC_HLE_Device_es::CreateTitleContentPath(u64 _TitleID) const
|
||||||
{
|
{
|
||||||
char TicketFilename[1024];
|
char ContentPath[1024];
|
||||||
sprintf(TicketFilename, "%stitle/%08x/%08x/content", File::GetUserPath(D_WIIUSER_IDX), (u32)(_TitleID >> 32), (u32)_TitleID);
|
sprintf(ContentPath, "%stitle/%08x/%08x/content", File::GetUserPath(D_WIIUSER_IDX), (u32)(_TitleID >> 32), (u32)_TitleID);
|
||||||
|
|
||||||
return TicketFilename;
|
return ContentPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue