trunk r375-378をマージ

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@380 385bec56-5757-e545-9c3a-d8741f4650f1
This commit is contained in:
N2614 2011-07-13 04:42:20 +00:00
parent c3260682e7
commit 48de61eb1f
7 changed files with 124 additions and 334 deletions

View File

@ -53,7 +53,6 @@ namespace ConsoleBackup
namespace
{
common::SdReaderWriter s_SdWriter;
common::NtrNorData s_NtrNorData;
common::CfgCountryLanguage s_CountryLanguage;
@ -171,7 +170,8 @@ nn::Result WriteTwlTitleList(std::vector<std::wstring>& programIdList)
writeSize += it->size() + sizeof('\n');
}
return s_SdWriter.WriteBufWithCmac(common::TWL_TITLELIST_PATHNAME, titleListBuf, writeSize);
common::SdReaderWriter sdWriter;
return sdWriter.WriteBufWithCmac(common::TWL_TITLELIST_PATHNAME, titleListBuf, writeSize);
}
else
{
@ -188,7 +188,8 @@ nn::Result WriteRegionData()
nn::cfg::CTR::CfgRegionCode region;
region = nn::cfg::CTR::GetRegion();
return s_SdWriter.WriteBufWithCmac(common::REGION_DATA_PATHNAME, &region, sizeof(nn::cfg::CTR::CfgRegionCode));
common::SdReaderWriter sdWriter;
return sdWriter.WriteBufWithCmac(common::REGION_DATA_PATHNAME, &region, sizeof(nn::cfg::CTR::CfgRegionCode));
}
nn::Result WriteCountryLanguageData()
@ -206,7 +207,8 @@ nn::Result WriteCountryLanguageData()
// 言語設定
s_CountryLanguage.language = nn::cfg::CTR::GetLanguage();
return s_SdWriter.WriteBufWithCmac(common::COUNTRY_SETTING_PATHNAME, &s_CountryLanguage, sizeof(s_CountryLanguage));
common::SdReaderWriter sdWriter;
return sdWriter.WriteBufWithCmac(common::COUNTRY_SETTING_PATHNAME, &s_CountryLanguage, sizeof(s_CountryLanguage));
}
return nn::ResultSuccess();
@ -234,7 +236,8 @@ nn::Result WriteNorData()
result = nn::cfg::nor::CTR::ReadNtrWifiSetting(0, s_NtrNorData.NtrWiFiSetting, common::NTR_WIFI_SETTING_SIZE);
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
return s_SdWriter.WriteBufWithCmac(common::NOR_PATHNAME, &s_NtrNorData, sizeof(common::NtrNorData));
common::SdReaderWriter sdWriter;
return sdWriter.WriteBufWithCmac(common::NOR_PATHNAME, &s_NtrNorData, sizeof(common::NtrNorData));
}
nn::Result WriteSerialNumber(common::HardwareStateManager& manager)
@ -245,7 +248,8 @@ nn::Result WriteSerialNumber(common::HardwareStateManager& manager)
size_t size;
manager.GetSerialNumber(&serial, &size);
return s_SdWriter.WriteBufWithCmac(common::SERIAL_PATHNAME, serial, size);
common::SdReaderWriter sdWriter;
return sdWriter.WriteBufWithCmac(common::SERIAL_PATHNAME, serial, size);
}
nn::Result WriteDeviceId(common::HardwareStateManager& manager)
@ -254,7 +258,8 @@ nn::Result WriteDeviceId(common::HardwareStateManager& manager)
bit32 deviceId = manager.GetDeviceId();
return s_SdWriter.WriteBufWithCmac(common::DEVICE_ID_PATHNAME, &deviceId, sizeof(deviceId));
common::SdReaderWriter sdWriter;
return sdWriter.WriteBufWithCmac(common::DEVICE_ID_PATHNAME, &deviceId, sizeof(deviceId));
}
nn::Result WriteIvs(common::HardwareStateManager& manager)
@ -279,7 +284,8 @@ nn::Result WriteIvs(common::HardwareStateManager& manager)
swAesCtrContest.Initialize(common::iv, common::key, sizeof(common::key));
swAesCtrContest.Encrypt(enc, ivs, size);
return s_SdWriter.WriteBufWithCmac(common::IVS_PATHNAME, enc, size);
common::SdReaderWriter sdWriter;
return sdWriter.WriteBufWithCmac(common::IVS_PATHNAME, enc, size);
}
else
{
@ -292,7 +298,8 @@ void CreateTwlDirectory(enum common::TWL_PATH_INDEX path)
{
NN_ASSERT(path < common::TWL_PATHNAME_MAX);
s_SdWriter.CreateDirectory((::std::wstring(common::SDMC_ROOT_DIRECTORY_PATH) +
common::SdReaderWriter sdWriter;
sdWriter.CreateDirectory((::std::wstring(common::SDMC_ROOT_DIRECTORY_PATH) +
std::wstring(common::SD_TWL_ROOTNAME_TABLE[path])).c_str());
}
@ -366,7 +373,8 @@ void AddCurrentDirectory(std::vector<common::SavePathInfo>* list, std::wstring c
list->push_back(pathInfo);
}
// TWLセーブデータが存在するディレクトリの一覧をlistに追加する
// return: dataディレクトリが存在するかどうか
bool ListTwlSaveDataDirectory(std::wstring currentDirectory, u32 level, std::vector<common::SavePathInfo>* list,
std::vector<std::wstring>* programIdList)
{
@ -375,6 +383,9 @@ bool ListTwlSaveDataDirectory(std::wstring currentDirectory, u32 level, std::vec
nn::Result result;
std::vector<nn::fs::DirectoryEntry> entryList; //カレントディレクトリのエントリ一覧を格納
std::vector<nn::fs::DirectoryEntry>::iterator entryIndex;
// level 0 1 2
// twln:/title/00030005/484e4441/data/
const u8 TWL_SAVEDATA_DIRECTORY_LEVEL = 2; // data ディレクトリまでの階層
const wchar_t* const TWL_SAVEDATA_DIRECTORY_NAME = L"data";
@ -392,7 +403,7 @@ bool ListTwlSaveDataDirectory(std::wstring currentDirectory, u32 level, std::vec
{
dir.Finalize();
bool retValue = false;
bool hasDataDirectory = false;
for (entryIndex = entryList.begin(); entryIndex != entryList.end(); entryIndex++)
{
// レベル2未満のディレクトリなら再帰的に開く
@ -400,18 +411,17 @@ bool ListTwlSaveDataDirectory(std::wstring currentDirectory, u32 level, std::vec
{
if (entryIndex->attributes.isDirectory)
{
if (ListTwlSaveDataDirectory(
if (!ListTwlSaveDataDirectory(
currentDirectory + std::wstring(L"/") + std::wstring(entryIndex->entryName), level + 1,
list, programIdList))
{
NN_LOG("%ls/%ls has data directory.\n", currentDirectory.c_str(), entryIndex->entryName);
retValue = true;
AddCurrentDirectory(list, currentDirectory, entryIndex->entryName);
hasDataDirectory |= false;
}
else
{
return false;
NN_LOG("%ls/%ls has data directory.\n", currentDirectory.c_str(), entryIndex->entryName);
AddCurrentDirectory(list, currentDirectory, entryIndex->entryName);
hasDataDirectory |= true;
}
}
}
@ -421,15 +431,16 @@ bool ListTwlSaveDataDirectory(std::wstring currentDirectory, u32 level, std::vec
if (std::wcscmp(entryIndex->entryName, TWL_SAVEDATA_DIRECTORY_NAME) == 0)
{
// ファイル一覧を取得する
retValue = true;
if (!ListTwlSaveData(
currentDirectory + std::wstring(L"/") + std::wstring(entryIndex->entryName), list))
{
return false;
hasDataDirectory |= false;
}
NN_LOG("%ls/%ls has data directory.\n", currentDirectory.c_str(), entryIndex->entryName);
AddCurrentDirectory(list, currentDirectory, entryIndex->entryName);
AddCurrentProgramIdPath(programIdList, currentDirectory);
hasDataDirectory |= true;
}
}
else
@ -438,12 +449,7 @@ bool ListTwlSaveDataDirectory(std::wstring currentDirectory, u32 level, std::vec
}
}
if (level != 0)
{
return retValue;
}
break;
return hasDataDirectory;
}
else
{
@ -451,8 +457,6 @@ bool ListTwlSaveDataDirectory(std::wstring currentDirectory, u32 level, std::vec
entryList.push_back(entry);
}
}
return true;
}
@ -570,18 +574,17 @@ void WriteTwlSaveData()
COMMON_LOGGER("Export Twl Save Data.\n");
// ディレクトリ作成
result = s_SdWriter.CreateDirectory((::std::wstring(common::SDMC_ROOT_DIRECTORY_PATH) +
common::SdReaderWriter sdWriter;
result = sdWriter.CreateDirectory((::std::wstring(common::SDMC_ROOT_DIRECTORY_PATH) +
std::wstring(common::SD_SAVEDATA_TWL_ROOT_NAME)).c_str());
COMMON_LOGGER_RETURN_VOID_SET_BOOL_IF_FAILED(result, s_IsExportSucceeded);
// セーブデータを含むディレクトリ一覧を生成
result = nn::fs::MountSpecialArchive(common::NAND_TWL_ARCHIVE_NAME, nn::fs::CTR::ARCHIVE_TYPE_TWL_NAND);
COMMON_LOGGER_RETURN_VOID_SET_BOOL_IF_FAILED(result, s_IsExportSucceeded);
ListTwlSaveDataDirectory(std::wstring(common::NAND_TWL_DATA_ROOT_PATHNAME_WITHOUT_SLASH), 0, &fileList, & programIdList);
NN_LOG("No Twl Savedata\n");
if(fileList.size() == 0)
if(!ListTwlSaveDataDirectory(std::wstring(common::NAND_TWL_DATA_ROOT_PATHNAME_WITHOUT_SLASH), 0, &fileList, & programIdList))
{
NN_LOG("No Twl Savedata\n");
s_IsExportSucceeded = true;
return;
}
@ -724,7 +727,8 @@ nn::Result WriteMcuRtcData(common::HardwareStateManager& manager)
{
NN_LOG("RTC = 20%02d/%02d/%02d %02d:%02d:%02d\n", rtc.m_Year, rtc.m_Month, rtc.m_Day, rtc.m_Hour, rtc.m_Minute, rtc.m_Second);
return s_SdWriter.WriteBufWithCmac(common::MCU_RTC_PATHNAME, &rtc, sizeof(rtc));
common::SdReaderWriter sdWriter;
return sdWriter.WriteBufWithCmac(common::MCU_RTC_PATHNAME, &rtc, sizeof(rtc));
}
nn::os::Thread::Sleep(
nn::fnd::TimeSpan::FromMilliSeconds(
@ -824,7 +828,8 @@ nn::Result WriteSaveData(::std::string& sysSaveRoot)
// セーブデータディレクトリ以下のデータをSDカードにコピー
// コピー用ディレクトリ作成
result = s_SdWriter.CreateDirectory((::std::wstring(common::SDMC_ROOT_DIRECTORY_PATH) + ::std::wstring(
common::SdReaderWriter sdWriter;
result = sdWriter.CreateDirectory((::std::wstring(common::SDMC_ROOT_DIRECTORY_PATH) + ::std::wstring(
common::SD_SAVEDATA_ROOT_NAME)).c_str());
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
@ -849,7 +854,8 @@ nn::Result WriteVersionData(common::HardwareStateManager& manager)
common::VerDef versionData;
manager.GetVersionData(&versionData);
return s_SdWriter.WriteBufWithCmac(common::VERSION_DATA_PATHNAME, &versionData, sizeof(common::VerDef));
common::SdReaderWriter sdWriter;
return sdWriter.WriteBufWithCmac(common::VERSION_DATA_PATHNAME, &versionData, sizeof(common::VerDef));
}
bool DeleteNimSaveData()

View File

@ -135,7 +135,6 @@ typedef enum RestoreState
RESTORE_IN_PROGRESS, // 書き込み中
POST_RESTORE, // 書き込み後の処理
RESTORE_DONE, // 書き込み完了
RESTORE_TEST, // 書き込み後のチェック
REBOOTING, // 再起動を行う
ERASE, // 削除処理を行う
RESTORE_CAL, // cfgの一部をcal値で上書きする
@ -796,6 +795,7 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
}
break;
case INITIALIZE_CONSOLE:
{
COMMON_LOGGER("Initialize Console\n");
@ -964,6 +964,7 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
}
break;
case DOWNLOAD_IVS_DONE:
{
operationMessage.push_back(::std::string("Get SDCI Done."));
@ -1094,9 +1095,8 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
{
if(s_NupOnlyMode)
{
ShopOperationSingleTemplate(manager, operationMessage, SHOP_OPERATION_FORCE_UNREGISTER,
"Deleting Account", "Delete Account Finished.\n", "Delete Account Failed. Retrying...",
DELETE_ACCOUNT_DONE);
ShopOperationSingleTemplate(manager, operationMessage, SHOP_OPERATION_FORCE_UNREGISTER, "Deleting Account",
"Delete Account Finished.\n", "Delete Account Failed. Retrying...", DELETE_ACCOUNT_DONE);
}
else
@ -1186,6 +1186,7 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
{
s_RestoreState = FAIL;
}
}
}
break;
@ -1241,7 +1242,6 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
// 処理が完了した
if (!NeedsAcAdater(manager) && IsImportThreadFinished())
{
FinalizeImportThread();
if (IsImportSucceeded())
{
@ -1249,7 +1249,7 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
if (GetProgress() > 99)
{
s_RestoreState = RESTORE_TEST;
s_RestoreState = POST_RESTORE;
}
else
{
@ -1293,32 +1293,6 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
}
break;
case RESTORE_TEST:
{
PutAliveMessage(operationMessage, "Checking Data");
static bool init = true;
if (init)
{
TestCtrData();
init = false;
}
if (IsImportThreadFinished())
{
FinalizeImportThread();
if (IsImportSucceeded())
{
s_RestoreState = POST_RESTORE;
}
else
{
s_RestoreState = FAIL;
}
}
}
break;
// 書き込み後の処理
case POST_RESTORE:
{
@ -1599,6 +1573,7 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
nn::ptm::CTR::ShutdownAsync(0, nn::fnd::TimeSpan::FromSeconds(0));
}
break;
}
}
@ -1690,7 +1665,6 @@ u32 GetProgress()
s_RestoreState == RESTORE_TWL_NAND ||
s_RestoreState == RESTORE_IN_PROGRESS ||
s_RestoreState == POST_RESTORE ||
s_RestoreState == RESTORE_TEST ||
s_RestoreState == RESTORE_DONE)
{
return GetImportProgress();

View File

@ -16,7 +16,6 @@
#include <nn.h>
#include <nn/fs/CTR/fs_ArchiveTypesForSystem.h>
#include <nn/fs/CTR/MPCore/fs_FileSystemBasePrivate.h>
#include <nn/fs/CTR/MPCore/fs_ApiIntegrityVerificationSeed.h>
#include <nn/cfg/CTR/cfg_ApiInit.h>
#include <nn/cfg/CTR/cfg_ApiNor.h> // cfg:norの初期化に必要
#include <nn/cfg/CTR/cfg_Api.h>
@ -623,43 +622,6 @@ bool InitializeFileSystem()
return true;
}
nn::Result GetNewIvs(void* oldBuf, size_t oldBufSize, void* newBuf, size_t newBufSize, size_t* newIvsSize)
{
if (oldBufSize < nn::fs::CTR::SIZE_INTEGRITY_VERIFICATION_SEED
|| newBufSize < nn::fs::CTR::SIZE_INTEGRITY_VERIFICATION_SEED
|| oldBuf == NULL || newBuf == NULL
)
{
return nn::Result(nn::Result::LEVEL_FATAL, nn::Result::SUMMARY_OUT_OF_RESOURCE, nn::Result::MODULE_COMMON,
nn::Result::DESCRIPTION_OUT_OF_MEMORY);
}
nn::Result result;
result = common::SdMountManager::Mount();
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
common::SdReaderWriter sdReader;
size_t readSize;
result = sdReader.ReadBufWithCmac(common::IVS_PATHNAME, oldBuf, oldBufSize, &readSize);
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
*newIvsSize = readSize;
// AES復号化する
nn::crypto::Initialize();
nn::crypto::SwAesCtrContext swAesCtrContest;
swAesCtrContest.Initialize(common::iv, common::key, sizeof(common::key));
result = swAesCtrContest.Decrypt(newBuf, oldBuf, readSize);
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
nn::crypto::Finalize();
result = common::SdMountManager::Unmount();
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
return nn::ResultSuccess();
}
nn::Result ImportIvs()
{
nn::Result result = nn::ResultSuccess();
@ -770,7 +732,6 @@ void ImportThreadFunc()
NN_LOG("Import Thread Finalize\n");
}
namespace
{
@ -1895,72 +1856,6 @@ bool IsImportSucceeded()
return s_IsImportSucceeded;
}
nn::Result GetNewSaveDirRoot(std::wstring& sysSaveRoot)
{
nn::Result result;
const size_t BUF_SIZE = 1024;
common::HeapManager oldBuf(BUF_SIZE);
common::HeapManager newBuf(BUF_SIZE);
size_t ivsSize;
result = GetNewIvs(oldBuf.GetAddr(), BUF_SIZE, newBuf.GetAddr(), BUF_SIZE, &ivsSize);
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
std::string root;
common::Util::GetSaveDataDirectoryRoot(root, newBuf.GetAddr(), ivsSize);
wchar_t rootName[256];
std::mbstowcs(rootName, root.c_str(), root.size() + 1);
sysSaveRoot = rootName;
return nn::ResultSuccess();
}
void TestCtrDataThreadFunc()
{
nn::Result result;
s_IsImportSucceeded = true;
// 新IVSディレクトリを取得
std::wstring sysSaveRoot;
result = GetNewSaveDirRoot(sysSaveRoot);
COMMON_LOGGER_RETURN_VOID_SET_BOOL_IF_FAILED(result, s_IsImportSucceeded);
result = nn::fs::MountSpecialArchive(common::NAND_ARCHIVE_NAME, nn::fs::CTR::ARCHIVE_TYPE_CTR_NAND);
COMMON_LOGGER_RETURN_VOID_SET_BOOL_IF_FAILED(result, s_IsImportSucceeded);
u32 fileNum = 0;
s64 fileSize = 0;
result = common::CalculateFileNum(
::std::wstring(common::NAND_DATA_ROOT_PATHNAME_WITH_SLASH) + sysSaveRoot + std::wstring(L"/"), fileNum,
fileSize);
COMMON_LOGGER_RETURN_VOID_SET_BOOL_IF_FAILED(result, s_IsImportSucceeded);
common::InitializeTransferProgress(fileSize);
size_t bufSize = common::GetAllocatableSize(AES_BLOCK_SIZE);
common::HeapManager buf(bufSize, AES_BLOCK_SIZE);
if(!common::TestReadDirectory((std::wstring(common::NAND_DATA_ROOT_PATHNAME_WITH_SLASH) + sysSaveRoot + std::wstring(L"/")).c_str(), buf.GetAddr(), bufSize
))
{
s_IsImportSucceeded = false;
return;
}
result = nn::fs::Unmount(common::NAND_ARCHIVE_NAME);
COMMON_LOGGER_RETURN_VOID_SET_BOOL_IF_FAILED(result, s_IsImportSucceeded);
}
void TestCtrData()
{
COMMON_LOGGER("Test NAND Data Start...\n");
s_ImportThread.Start(TestCtrDataThreadFunc, s_ImportThreadStack);
}
nn::Result ImportData()
{
static nn::Result result = nn::ResultSuccess();

View File

@ -160,9 +160,6 @@ bool ImportIvsData();
// 書き込みが成功したかどうか
bool IsImportSucceeded();
// 新たにスレッドを立て、CTR-NAND領域をテストする
void TestCtrData();
}
#endif /* IMPORTER_H_ */

View File

@ -93,6 +93,10 @@
return; \
} \
#define COMMON_LOGGER_RETURN_FALSE(result) \
COMMON_LOGGER_RESULT_WITH_LINE(result, __LINE__, __func__); \
return false; \
namespace common
{

View File

@ -674,6 +674,7 @@ bool ConfirmFile(nn::fs::FileInputStream* from_file, nn::fs::FileStream* to_file
COMMON_LOGGER("**********Verification Failed %s, Delete**********\n", GetCharStr(sdPath));
result = nn::fs::TryDeleteFile(tmpPath);
COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result);
return false;
}
else
{
@ -767,88 +768,4 @@ bool AddPathNameAndUpdateContext(nn::fs::FileOutputStream* file, const wchar_t *
return true;
}
bool TestReadDirectory(const wchar_t* path, void* buf, const size_t bufSize)
{
nn::fs::Directory dir;
nn::fs::DirectoryEntry entry;
s32 numread = 0;
std::wostringstream targetStream;
NN_LOG("Read Directory %ls\n", path);
nn::Result result = dir.TryInitialize(path);
COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result);
while (1)
{
result = dir.TryRead(&numread, &entry, 1);
COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result);
if(numread == 0)
{
break;
}
if (std::wcscmp(entry.entryName, L".") == 0 || std::wcscmp(entry.entryName, L"..") == 0)
{
continue;
}
targetStream.str(L"");
targetStream.clear(std::stringstream::goodbit);
targetStream << path << entry.entryName;
// ディレクトリの場合
if (entry.attributes.isDirectory)
{
targetStream << L"/";
// 再帰処理
if (!TestReadDirectory(targetStream.str().c_str(), buf, bufSize))
{
return false;
}
}
// ファイルの場合
else
{
// ファイル作成
nn::fs::FileInputStream file;
s64 filesize;
s32 readsize;
NN_LOG("Read File %ls\n", targetStream.str().c_str());
// 読み込み対象ファイル開く
result = file.TryInitialize(targetStream.str().c_str());
COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result);
// 読み込み対象ファイルのサイズ取得
result = file.TryGetSize(&filesize);
COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result);
// ファイル全体を読みきるまでループ
while (1)
{
result = file.TryRead(&readsize, buf, bufSize);
COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result);
if (readsize == 0)
{
break;
}
else
{
s_FinishedFileSize += readsize;
s_Progress = s_FinishedFileSize * 100 / s_TotalFileSize;
NN_LOG(
"finish = %lld, total = %lld, progress = %lld\n", s_FinishedFileSize, s_TotalFileSize, s_Progress);
}
}
}
}
return true;
}
}

View File

@ -57,9 +57,6 @@ void InitializeTransferProgress(u64 totalSize);
// 内部のバッファを使用するためスレッドアンセーフ
const char* GetCharStr(const wchar_t* path);
// pathで指定したディレクトリ以下を再帰的に読み込んでエラーが発生しないかテストする
bool TestReadDirectory(const wchar_t* path, void* buf, const size_t bufSize);
}
#endif /* FILETRANSFER_H_ */