Record md5 of game file to .dtm, and check it when playing back.
This commit is contained in:
parent
1071ccbcd5
commit
ca650d4435
|
@ -36,6 +36,8 @@
|
|||
#include "HW/EXI_Channel.h"
|
||||
#include "HW/DVDInterface.h"
|
||||
#include "../../Common/Src/NandPaths.h"
|
||||
#include "thread.h"
|
||||
#include "Crypto/md5.h"
|
||||
|
||||
// large enough for just over 24 hours of single-player recording
|
||||
#define MAX_DTM_LENGTH (40 * 1024 * 1024)
|
||||
|
@ -69,6 +71,7 @@ bool g_bDiscChange = false;
|
|||
std::string g_discChange = "";
|
||||
std::string author = "";
|
||||
u64 g_titleID = 0;
|
||||
unsigned char MD5[16];
|
||||
|
||||
bool g_bRecordingFromSaveState = false;
|
||||
bool g_bPolled = false;
|
||||
|
@ -167,6 +170,8 @@ void Init()
|
|||
//delete tmpInput;
|
||||
//tmpInput = NULL;
|
||||
}
|
||||
else
|
||||
std::thread md5thread(CheckMD5);
|
||||
}
|
||||
|
||||
void InputUpdate()
|
||||
|
@ -392,10 +397,13 @@ bool BeginRecordingInput(int controllers)
|
|||
|
||||
// This is only done here if starting from save state because otherwise we won't have the titleid. Otherwise it's set in WII_IPC_HLE_Device_es.cpp.
|
||||
// TODO: find a way to GetTitleDataPath() from Movie::Init()
|
||||
if (File::Exists((Common::GetTitleDataPath(g_titleID) + "banner.bin").c_str()))
|
||||
Movie::g_bClearSave = false;
|
||||
else
|
||||
Movie::g_bClearSave = true;
|
||||
if (Core::g_CoreStartupParameter.bWii)
|
||||
{
|
||||
if (File::Exists((Common::GetTitleDataPath(g_titleID) + "banner.bin").c_str()))
|
||||
Movie::g_bClearSave = false;
|
||||
else
|
||||
Movie::g_bClearSave = true;
|
||||
}
|
||||
}
|
||||
g_playMode = MODE_RECORDING;
|
||||
GetSettings();
|
||||
|
@ -655,6 +663,9 @@ void ReadHeader()
|
|||
{
|
||||
author[i] = tmpHeader.author[i];
|
||||
}
|
||||
|
||||
for (int i = 0; i < 16; i++)
|
||||
MD5[i] = tmpHeader.md5[i];
|
||||
}
|
||||
|
||||
bool PlayInput(const char *filename)
|
||||
|
@ -1077,6 +1088,8 @@ void SaveRecording(const char *filename)
|
|||
header.bClearSave = g_bClearSave;
|
||||
strncpy((char *)header.discChange, g_discChange.c_str(),ARRAYSIZE(header.discChange));
|
||||
strncpy((char *)header.author, author.c_str(),ARRAYSIZE(header.author));
|
||||
for (int i = 0; i < 16;i++)
|
||||
header.md5[i] = MD5[i];
|
||||
|
||||
// TODO
|
||||
header.uniqueID = 0;
|
||||
|
@ -1135,4 +1148,43 @@ void GetSettings()
|
|||
g_bClearSave = !File::Exists(SConfig::GetInstance().m_strMemoryCardA);
|
||||
bMemcard = SConfig::GetInstance().m_EXIDevice[0] == EXIDEVICE_MEMORYCARD;
|
||||
}
|
||||
|
||||
void CheckMD5()
|
||||
{
|
||||
if (IsRecordingInput())
|
||||
{
|
||||
Core::DisplayMessage("Calculating md5 of game file...", 2000);
|
||||
for (int i = 0; i < 16; i++)
|
||||
MD5[i] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i=0; i<16; i++)
|
||||
{
|
||||
if (tmpHeader.md5[i] != 0)
|
||||
continue;
|
||||
if (i == 15)
|
||||
return;
|
||||
}
|
||||
Core::DisplayMessage("Checking md5 of game file against recorded game...", 2000);
|
||||
}
|
||||
|
||||
unsigned char gameMD5[16];
|
||||
char game[255];
|
||||
memcpy(game, SConfig::GetInstance().m_LastFilename.c_str(), SConfig::GetInstance().m_LastFilename.size());
|
||||
md5_file(game, gameMD5);
|
||||
|
||||
if (IsPlayingInput())
|
||||
{
|
||||
if (memcmp(gameMD5,MD5,16) == 0)
|
||||
Core::DisplayMessage("MD5 of playing game matches the recorded game.", 2000);
|
||||
else
|
||||
PanicAlert("MD5 of playing game does not match the recorded game!");
|
||||
}
|
||||
else
|
||||
{
|
||||
memcpy(MD5, gameMD5,16);
|
||||
Core::DisplayMessage("Finished Calculating md5.", 2000);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -99,7 +99,7 @@ struct DTMHeader {
|
|||
|
||||
u8 videoBackend[16]; // UTF-8 representation of the video backend
|
||||
u8 audioEmulator[16]; // UTF-8 representation of the audio emulator
|
||||
u8 padBackend[16]; // UTF-8 representation of the input backend
|
||||
unsigned char md5[16]; // MD5 of game iso
|
||||
|
||||
u64 recordingStartTime; // seconds since 1970 that recording started (used for RTC)
|
||||
|
||||
|
@ -178,6 +178,7 @@ bool PlayWiimote(int wiimote, u8* data, const struct WiimoteEmu::ReportFeatures&
|
|||
void EndPlayInput(bool cont);
|
||||
void SaveRecording(const char *filename);
|
||||
void DoState(PointerWrap &p);
|
||||
void CheckMD5();
|
||||
|
||||
std::string GetInputDisplay();
|
||||
|
||||
|
|
Loading…
Reference in New Issue