mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-27 08:15:33 +01:00
Merge pull request #4519 from sepalani/fix_import_save
Fixes WiiSave import
This commit is contained in:
commit
15de7d507f
@ -337,10 +337,11 @@ void CWiiSaveCrypted::ImportWiiSaveFiles()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::string filename =
|
// Allows files in subfolders to be escaped properly (ex: "nocopy/data00")
|
||||||
Common::EscapeFileName(reinterpret_cast<const char*>(file_hdr_tmp.name));
|
// Special characters in path components will be escaped such as /../
|
||||||
|
std::string file_path = Common::EscapePath(reinterpret_cast<const char*>(file_hdr_tmp.name));
|
||||||
|
|
||||||
std::string file_path_full = m_wii_title_path + filename;
|
std::string file_path_full = m_wii_title_path + file_path;
|
||||||
File::CreateFullPath(file_path_full);
|
File::CreateFullPath(file_path_full);
|
||||||
if (file_hdr_tmp.type == 1)
|
if (file_hdr_tmp.type == 1)
|
||||||
{
|
{
|
||||||
@ -349,7 +350,7 @@ void CWiiSaveCrypted::ImportWiiSaveFiles()
|
|||||||
std::vector<u8> file_data(file_size_rounded);
|
std::vector<u8> file_data(file_size_rounded);
|
||||||
std::vector<u8> file_data_enc(file_size_rounded);
|
std::vector<u8> file_data_enc(file_size_rounded);
|
||||||
|
|
||||||
if (!data_file.ReadBytes(&file_data_enc[0], file_size_rounded))
|
if (!data_file.ReadBytes(file_data_enc.data(), file_size_rounded))
|
||||||
{
|
{
|
||||||
ERROR_LOG(CONSOLE, "Failed to read data from file %d", i);
|
ERROR_LOG(CONSOLE, "Failed to read data from file %d", i);
|
||||||
m_valid = false;
|
m_valid = false;
|
||||||
@ -358,7 +359,7 @@ void CWiiSaveCrypted::ImportWiiSaveFiles()
|
|||||||
|
|
||||||
memcpy(m_iv, file_hdr_tmp.IV, 0x10);
|
memcpy(m_iv, file_hdr_tmp.IV, 0x10);
|
||||||
mbedtls_aes_crypt_cbc(&m_aes_ctx, MBEDTLS_AES_DECRYPT, file_size_rounded, m_iv,
|
mbedtls_aes_crypt_cbc(&m_aes_ctx, MBEDTLS_AES_DECRYPT, file_size_rounded, m_iv,
|
||||||
(const u8*)&file_data_enc[0], &file_data[0]);
|
static_cast<const u8*>(file_data_enc.data()), file_data.data());
|
||||||
|
|
||||||
if (!File::Exists(file_path_full) ||
|
if (!File::Exists(file_path_full) ||
|
||||||
AskYesNoT("%s already exists, overwrite?", file_path_full.c_str()))
|
AskYesNoT("%s already exists, overwrite?", file_path_full.c_str()))
|
||||||
@ -366,7 +367,21 @@ void CWiiSaveCrypted::ImportWiiSaveFiles()
|
|||||||
INFO_LOG(CONSOLE, "Creating file %s", file_path_full.c_str());
|
INFO_LOG(CONSOLE, "Creating file %s", file_path_full.c_str());
|
||||||
|
|
||||||
File::IOFile raw_save_file(file_path_full, "wb");
|
File::IOFile raw_save_file(file_path_full, "wb");
|
||||||
raw_save_file.WriteBytes(&file_data[0], file_size);
|
raw_save_file.WriteBytes(file_data.data(), file_size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (file_hdr_tmp.type == 2)
|
||||||
|
{
|
||||||
|
if (!File::Exists(file_path_full))
|
||||||
|
{
|
||||||
|
if (!File::CreateDir(file_path_full))
|
||||||
|
ERROR_LOG(CONSOLE, "Failed to create directory %s", file_path_full.c_str());
|
||||||
|
}
|
||||||
|
else if (!File::IsDirectory(file_path_full))
|
||||||
|
{
|
||||||
|
ERROR_LOG(CONSOLE,
|
||||||
|
"Failed to create directory %s because a file with the same name exists",
|
||||||
|
file_path_full.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -434,17 +449,17 @@ void CWiiSaveCrypted::ExportWiiSaveFiles()
|
|||||||
std::vector<u8> file_data(file_size_rounded);
|
std::vector<u8> file_data(file_size_rounded);
|
||||||
std::vector<u8> file_data_enc(file_size_rounded);
|
std::vector<u8> file_data_enc(file_size_rounded);
|
||||||
|
|
||||||
if (!raw_save_file.ReadBytes(&file_data[0], file_size))
|
if (!raw_save_file.ReadBytes(file_data.data(), file_size))
|
||||||
{
|
{
|
||||||
ERROR_LOG(CONSOLE, "Failed to read data from file: %s", m_files_list[i].c_str());
|
ERROR_LOG(CONSOLE, "Failed to read data from file: %s", m_files_list[i].c_str());
|
||||||
m_valid = false;
|
m_valid = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
mbedtls_aes_crypt_cbc(&m_aes_ctx, MBEDTLS_AES_ENCRYPT, file_size_rounded, file_hdr_tmp.IV,
|
mbedtls_aes_crypt_cbc(&m_aes_ctx, MBEDTLS_AES_ENCRYPT, file_size_rounded, file_hdr_tmp.IV,
|
||||||
(const u8*)&file_data[0], &file_data_enc[0]);
|
static_cast<const u8*>(file_data.data()), file_data_enc.data());
|
||||||
|
|
||||||
File::IOFile fpData_bin(m_encrypted_save_path, "ab");
|
File::IOFile fpData_bin(m_encrypted_save_path, "ab");
|
||||||
if (!fpData_bin.WriteBytes(&file_data_enc[0], file_size_rounded))
|
if (!fpData_bin.WriteBytes(file_data_enc.data(), file_size_rounded))
|
||||||
{
|
{
|
||||||
ERROR_LOG(CONSOLE, "Failed to write data to file: %s", m_encrypted_save_path.c_str());
|
ERROR_LOG(CONSOLE, "Failed to write data to file: %s", m_encrypted_save_path.c_str());
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user