mirror of
https://github.com/rvtr/ctr_Repair.git
synced 2025-10-31 13:51:08 -04:00
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
131 lines
4.4 KiB
C++
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 */
|