Fix of issue 408, the game still can't boot.
Implement DVDLowUnencryptedRead, Medal Of Honor Heroes 2 use it to get DVD PartitionsInfo (disk offset 0x40000). and the game try to use IOCtlV, code 0x8b, bushing point out, IOCtlV 0x8b is DVDLowOpenPartition too, so I just return 0 for success. need further work on this. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@2367 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
03a950a1e5
commit
42a7d2fc85
|
@ -98,10 +98,28 @@ bool CWII_IPC_HLE_Device_di::IOCtl(u32 _CommandAddress)
|
||||||
|
|
||||||
bool CWII_IPC_HLE_Device_di::IOCtlV(u32 _CommandAddress)
|
bool CWII_IPC_HLE_Device_di::IOCtlV(u32 _CommandAddress)
|
||||||
{
|
{
|
||||||
PanicAlert("CWII_IPC_HLE_Device_di::IOCtlV() unknown");
|
// PanicAlert("CWII_IPC_HLE_Device_di::IOCtlV() unknown");
|
||||||
|
// DumpCommands(_CommandAddress);
|
||||||
|
u32 ReturnValue = 0;
|
||||||
|
|
||||||
DumpCommands(_CommandAddress);
|
SIOCtlVBuffer CommandBuffer(_CommandAddress);
|
||||||
|
|
||||||
|
switch (CommandBuffer.Parameter)
|
||||||
|
{
|
||||||
|
// DVDLowOpenPartition???
|
||||||
|
case 0x8b:
|
||||||
|
{
|
||||||
|
LOG(WII_IPC_DVD, "DVD IOCtlV: DVDLowOpenPartition");
|
||||||
|
_dbg_assert_msg_(WII_IPC_DVD, 0, "DVD IOCtlV: DVDLowOpenPartition");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LOG(WII_IPC_DVD, "DVD IOCtlV: %i", CommandBuffer.Parameter);
|
||||||
|
_dbg_assert_msg_(WII_IPC_DVD, 0, "DVD: %i", CommandBuffer.Parameter);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Memory::Write_U32(ReturnValue, _CommandAddress+4);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -278,15 +296,35 @@ u32 CWII_IPC_HLE_Device_di::ExecuteCommand(u32 _BufferIn, u32 _BufferInSize, u32
|
||||||
case 0x8c:
|
case 0x8c:
|
||||||
//PanicAlert("DVDLowClosePartition");
|
//PanicAlert("DVDLowClosePartition");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// DVDLowUnencryptedRead
|
// DVDLowUnencryptedRead
|
||||||
case 0x8d:
|
case 0x8d:
|
||||||
PanicAlert("DVDLowUnencryptedRead");
|
//PanicAlert("DVDLowUnencryptedRead");
|
||||||
|
{
|
||||||
|
if (_BufferOut == 0)
|
||||||
|
{
|
||||||
|
PanicAlert("DVDLowRead : _BufferOut == 0");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
u32 Size = Memory::Read_U32(_BufferIn + 0x04);
|
||||||
|
u64 DVDAddress = (u64)Memory::Read_U32(_BufferIn + 0x08) << 2;
|
||||||
|
|
||||||
|
if (Size > _BufferOutSize)
|
||||||
|
{
|
||||||
|
PanicAlert("Detected attempt to read more data from the DVD than fit inside the out buffer. Clamp.");
|
||||||
|
Size = _BufferOutSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (VolumeHandler::RAWReadToPtr(Memory::GetPointer(_BufferOut), DVDAddress, Size) != true)
|
||||||
|
{
|
||||||
|
PanicAlert("Cant read from DVD_Plugin - DVD-Interface: Fatal Error");
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// DVDLowSeek
|
// DVDLowSeek
|
||||||
case 0xab:
|
case 0xab:
|
||||||
// PanicAlert("DVDLowSeek");
|
//PanicAlert("DVDLowSeek");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xe0:
|
case 0xe0:
|
||||||
|
|
|
@ -77,6 +77,17 @@ bool ReadToPtr(u8* ptr, u64 _dwOffset, u64 _dwLength)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool RAWReadToPtr( u8* ptr, u64 _dwOffset, u64 _dwLength )
|
||||||
|
{
|
||||||
|
if (g_pVolume != NULL && ptr)
|
||||||
|
{
|
||||||
|
g_pVolume->RAWRead(_dwOffset, _dwLength, ptr);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool IsValid()
|
bool IsValid()
|
||||||
{
|
{
|
||||||
return g_pVolume != NULL;
|
return g_pVolume != NULL;
|
||||||
|
|
|
@ -33,6 +33,7 @@ void SetVolumeDirectory(const std::string& _rFullPath, bool _bIsWii);
|
||||||
|
|
||||||
u32 Read32(u64 _Offset);
|
u32 Read32(u64 _Offset);
|
||||||
bool ReadToPtr(u8* ptr, u64 _dwOffset, u64 _dwLength);
|
bool ReadToPtr(u8* ptr, u64 _dwOffset, u64 _dwLength);
|
||||||
|
bool RAWReadToPtr(u8* ptr, u64 _dwOffset, u64 _dwLength);
|
||||||
|
|
||||||
bool IsValid();
|
bool IsValid();
|
||||||
bool IsWii();
|
bool IsWii();
|
||||||
|
|
|
@ -38,6 +38,7 @@ class IVolume
|
||||||
|
|
||||||
|
|
||||||
virtual bool Read(u64 _Offset, u64 _Length, u8* _pBuffer) const = 0;
|
virtual bool Read(u64 _Offset, u64 _Length, u8* _pBuffer) const = 0;
|
||||||
|
virtual bool RAWRead(u64 _Offset, u64 _Length, u8* _pBuffer) const = 0;
|
||||||
virtual std::string GetUniqueID() const = 0;
|
virtual std::string GetUniqueID() const = 0;
|
||||||
virtual std::string GetMakerID() const = 0;
|
virtual std::string GetMakerID() const = 0;
|
||||||
virtual std::string GetName() const = 0;
|
virtual std::string GetName() const = 0;
|
||||||
|
|
|
@ -69,6 +69,11 @@ bool CVolumeDirectory::IsValidDirectory(const std::string& _rDirectory)
|
||||||
return File::IsDirectory(directoryName.c_str());
|
return File::IsDirectory(directoryName.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CVolumeDirectory::RAWRead( u64 _Offset, u64 _Length, u8* _pBuffer ) const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool CVolumeDirectory::Read(u64 _Offset, u64 _Length, u8* _pBuffer) const
|
bool CVolumeDirectory::Read(u64 _Offset, u64 _Length, u8* _pBuffer) const
|
||||||
{
|
{
|
||||||
if(_Offset < FST_ADDRESS)
|
if(_Offset < FST_ADDRESS)
|
||||||
|
|
|
@ -42,6 +42,7 @@ class CVolumeDirectory
|
||||||
static bool IsValidDirectory(const std::string& _rDirectory);
|
static bool IsValidDirectory(const std::string& _rDirectory);
|
||||||
|
|
||||||
bool Read(u64 _Offset, u64 _Length, u8* _pBuffer) const;
|
bool Read(u64 _Offset, u64 _Length, u8* _pBuffer) const;
|
||||||
|
bool RAWRead(u64 _Offset, u64 _Length, u8* _pBuffer) const;
|
||||||
|
|
||||||
std::string GetUniqueID() const;
|
std::string GetUniqueID() const;
|
||||||
void SetUniqueID(std::string _ID);
|
void SetUniqueID(std::string _ID);
|
||||||
|
|
|
@ -55,6 +55,11 @@ bool CVolumeGC::Read(u64 _Offset, u64 _Length, u8* _pBuffer) const
|
||||||
return m_pReader->Read(_Offset, _Length, _pBuffer);
|
return m_pReader->Read(_Offset, _Length, _pBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CVolumeGC::RAWRead( u64 _Offset, u64 _Length, u8* _pBuffer ) const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
std::string CVolumeGC::GetUniqueID() const
|
std::string CVolumeGC::GetUniqueID() const
|
||||||
{
|
{
|
||||||
static const std::string NO_UID("NO_UID");
|
static const std::string NO_UID("NO_UID");
|
||||||
|
|
|
@ -30,6 +30,7 @@ public:
|
||||||
CVolumeGC(IBlobReader* _pReader);
|
CVolumeGC(IBlobReader* _pReader);
|
||||||
~CVolumeGC();
|
~CVolumeGC();
|
||||||
bool Read(u64 _Offset, u64 _Length, u8* _pBuffer) const;
|
bool Read(u64 _Offset, u64 _Length, u8* _pBuffer) const;
|
||||||
|
bool RAWRead(u64 _Offset, u64 _Length, u8* _pBuffer) const;
|
||||||
std::string GetUniqueID() const;
|
std::string GetUniqueID() const;
|
||||||
std::string GetMakerID() const;
|
std::string GetMakerID() const;
|
||||||
std::string GetName() const;
|
std::string GetName() const;
|
||||||
|
|
|
@ -41,6 +41,17 @@ CVolumeWiiCrypted::~CVolumeWiiCrypted()
|
||||||
m_pBuffer = NULL;
|
m_pBuffer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CVolumeWiiCrypted::RAWRead( u64 _Offset, u64 _Length, u8* _pBuffer ) const
|
||||||
|
{
|
||||||
|
// HyperIris: hack for DVDLowUnencryptedRead
|
||||||
|
// Medal Of Honor Heroes 2 read this DVD offset for PartitionsInfo
|
||||||
|
// and, PartitionsInfo is not encrypted, let's read it directly.
|
||||||
|
if (!m_pReader->Read(_Offset, _Length, _pBuffer))
|
||||||
|
{
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
CVolumeWiiCrypted::Read(u64 _ReadOffset, u64 _Length, u8* _pBuffer) const
|
CVolumeWiiCrypted::Read(u64 _ReadOffset, u64 _Length, u8* _pBuffer) const
|
||||||
|
@ -255,4 +266,6 @@ CVolumeWiiCrypted::GetSize() const
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
@ -32,6 +32,7 @@ public:
|
||||||
CVolumeWiiCrypted(IBlobReader* _pReader, u64 _VolumeOffset, const unsigned char* _pVolumeKey);
|
CVolumeWiiCrypted(IBlobReader* _pReader, u64 _VolumeOffset, const unsigned char* _pVolumeKey);
|
||||||
~CVolumeWiiCrypted();
|
~CVolumeWiiCrypted();
|
||||||
bool Read(u64 _Offset, u64 _Length, u8* _pBuffer) const;
|
bool Read(u64 _Offset, u64 _Length, u8* _pBuffer) const;
|
||||||
|
bool RAWRead(u64 _Offset, u64 _Length, u8* _pBuffer) const;
|
||||||
std::string GetUniqueID() const;
|
std::string GetUniqueID() const;
|
||||||
std::string GetMakerID() const;
|
std::string GetMakerID() const;
|
||||||
std::string GetName() const;
|
std::string GetName() const;
|
||||||
|
|
Loading…
Reference in New Issue