ctr_Repair/trunk/ConsoleDataMigration/sources/ConsoleBackup/MenuSavedataModifier.cpp
N2614 9a3cfd3e9c MMENの8thNUP不具合を解消のためMMENのシステムセーブデータを修正するように
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@823 385bec56-5757-e545-9c3a-d8741f4650f1
2014-10-20 05:41:10 +00:00

131 lines
4.4 KiB
C++

/*---------------------------------------------------------------------------*
Project: Horizon
File: MenuSavedataModifier.cpp
Copyright (C)2014 Nintendo Co., Ltd. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Rev$
*---------------------------------------------------------------------------*/
#include <nn/fs/fs_ApiSysSaveData.h>
#include <nn/drivers/aes/CTR/ARM946ES/driverAes_Types.h>
#include "MenuSavedataModifier.h"
#include "LauncherSaveData.h"
#include "HeapManager.h"
#include "CommonLogger.h"
namespace ConsoleBackup{
MenuSavedataModifier::MenuSavedataModifier()
{
// TODO 自動生成されたコンストラクター・スタブ
}
MenuSavedataModifier::~MenuSavedataModifier()
{
// TODO Auto-generated destructor stub
}
// MMENのコードを移植
void MenuSavedataModifier::set_initialize_data_802_(LauncherSavedataRaw* mpRaw)
{
// トップのカーソル位置をクリア
mpRaw->mFcsIconIdx = 0; // フォーカスしていたアイコン(初回起動ではゲームカードにあっている)
mpRaw->mHeadIconIdx = 0; // 画面左上のアイコン
// フォルダ内のカーソル位置のクリア
for( int i = 0; i < LauncherSavedataRaw::scmFolderMax; i++ )
{
mpRaw->mFolderFcsIconIdx[ i ] = 0; // フォルダごとのフォーカスしていたアイコン(デフォルト左上)
mpRaw->mFolderHeadIconIdx[ i ] = 0; // フォルダごとの画面左上のアイコン(デフォルト左上)
}
}
nn::Result MenuSavedataModifier::Modify(nn::cfg::CfgRegionCode region, nn::pl::CTR::CardUpdateVersion cup)
{
if(!m_Version.IsModificationRequired(cup.majorVersion, cup.minorVersion))
{
return nn::ResultSuccess();
}
u64 id = GetId(region);
const char* const SYSTEM_SAVEDATA_ARCHIVE_NAME = "ssave:";
const char* const MENU_SAVE_FILE_NAME = "ssave:/Launcher.dat";
NN_UTIL_RETURN_IF_FAILED(
nn::fs::MountSystemSaveData(SYSTEM_SAVEDATA_ARCHIVE_NAME, id));
nn::fs::FileStream file;
NN_UTIL_RETURN_IF_FAILED_1(
file.TryInitialize(MENU_SAVE_FILE_NAME, nn::fs::OPEN_MODE_READ | nn::fs::OPEN_MODE_WRITE),
nn::fs::Unmount(SYSTEM_SAVEDATA_ARCHIVE_NAME));
s64 fileSize = file.GetSize();
common::HeapManager heap(fileSize, AES_BLOCK_SIZE);
void* buf = heap.GetAddr();
if (buf != NULL)
{
s32 readSize;
NN_UTIL_RETURN_IF_FAILED_1(file.TryRead(&readSize, buf, fileSize),
nn::fs::Unmount(SYSTEM_SAVEDATA_ARCHIVE_NAME));
}
else
{
nn::fs::Unmount(SYSTEM_SAVEDATA_ARCHIVE_NAME);
return nn::Result(nn::Result::LEVEL_FATAL, nn::Result::SUMMARY_OUT_OF_RESOURCE, nn::Result::MODULE_COMMON,
nn::Result::DESCRIPTION_OUT_OF_MEMORY);
}
// カーソル位置を初期化
set_initialize_data_802_(reinterpret_cast<LauncherSavedataRaw*>(buf));
// 先頭に移動して書き込み
NN_UTIL_RETURN_IF_FAILED_1(file.TrySeek(0, nn::fs::POSITION_BASE_BEGIN),
nn::fs::Unmount(SYSTEM_SAVEDATA_ARCHIVE_NAME));
s32 writeSize;
NN_UTIL_RETURN_IF_FAILED_1(file.TryWrite(&writeSize, buf, fileSize, true),
nn::fs::Unmount(SYSTEM_SAVEDATA_ARCHIVE_NAME));
// コミットする
NN_UTIL_RETURN_IF_FAILED_1(nn::fs::CommitSystemSaveData(SYSTEM_SAVEDATA_ARCHIVE_NAME),
nn::fs::Unmount(SYSTEM_SAVEDATA_ARCHIVE_NAME));
COMMON_LOGGER_WARN("Modified Menu Savedata\n");
NN_UTIL_RETURN_IF_FAILED(nn::fs::Unmount(SYSTEM_SAVEDATA_ARCHIVE_NAME));
return nn::ResultSuccess();
}
u64 MenuSavedataModifier::GetId(nn::cfg::CfgRegionCode region)
{
using namespace nn::cfg;
if(region == CFG_REGION_JAPAN)
{
return PROGRAM_ID_JP;
}
else if(region == CFG_REGION_AMERICA)
{
return PROGRAM_ID_US;
}
else if(region == CFG_REGION_AUSTRALIA || region == CFG_REGION_EUROPE)
{
return PROGRAM_ID_EU;
}
else
{
return PROGRAM_ID_JP;
}
}
} /* namespace ConsoleBackup */