diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/ActCompleter.cpp b/trunk/ConsoleDataMigration/sources/ConsoleRestore/ActCompleter.cpp index 2ab8b9c..1a06593 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/ActCompleter.cpp +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/ActCompleter.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include "AgeChecker.h" @@ -215,9 +216,11 @@ nn::Result ActCompleter::SaveApprovalId() // Cave-accountのファイル書き込み設定 const char* const SYSTEM_SAVEDATA_ARCHIVE_NAME = "ssave:"; const char* const CAVE_FILE_NAME = "ssave:/s.bin"; - const size_t CAVE_FILE_SIZE = 143360; const u32 APPROVAL_ID_OFFSET = 0x11000; + // Cave-accountのデフォルト値 + const char* const CAVE_DEFAULT_FILE = "rom:/CAVE_ACCOUNT_save_0.bin"; + NN_UTIL_RETURN_IF_FAILED( nn::fs::CreateSystemSaveData(CAVE_ACCOUNT_US_SAVEDATA_ID, MAX_FILES, MAX_DIRECTORIES, SAVE_DATA_SIZE, true)); @@ -227,23 +230,34 @@ nn::Result ActCompleter::SaveApprovalId() { nn::fs::FileOutputStream out(CAVE_FILE_NAME, true); - // ファイルサイズ分のダミーデータを書く - common::HeapManager dummyWriteData(CAVE_FILE_SIZE); - void* buf = dummyWriteData.GetAddr(); + // デフォルトデータを書く + nn::fs::FileInputStream defaultFile; + NN_UTIL_RETURN_IF_FAILED_1( + defaultFile.TryInitialize(CAVE_DEFAULT_FILE), + nn::fs::Unmount(SYSTEM_SAVEDATA_ARCHIVE_NAME)); + + s64 fileSize = defaultFile.GetSize(); + common::HeapManager heap(fileSize, AES_BLOCK_SIZE); + void* buf = heap.GetAddr(); if(buf != NULL) { - std::memset(buf, 0, CAVE_FILE_SIZE); + s32 readSize; + NN_UTIL_RETURN_IF_FAILED_1( + defaultFile.TryRead(&readSize, buf, fileSize), + nn::fs::Unmount(SYSTEM_SAVEDATA_ARCHIVE_NAME)); s32 writeSize; NN_UTIL_RETURN_IF_FAILED_1( - out.TryWrite(&writeSize, buf, CAVE_FILE_SIZE, true), + out.TryWrite(&writeSize, buf, fileSize, true), 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); } + // 所定の位置までシークしてApproval IDを書く NN_UTIL_RETURN_IF_FAILED_1( out.TrySeek(APPROVAL_ID_OFFSET, nn::fs::POSITION_BASE_BEGIN), nn::fs::Unmount(SYSTEM_SAVEDATA_ARCHIVE_NAME)); @@ -252,6 +266,7 @@ nn::Result ActCompleter::SaveApprovalId() out.TryWrite(&writeSize, &s_ApprovalId, sizeof(s_ApprovalId), 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)); diff --git a/trunk/ConsoleDataMigration/sources/common/romfiles/CAVE_ACCOUNT_save_0.bin b/trunk/ConsoleDataMigration/sources/common/romfiles/CAVE_ACCOUNT_save_0.bin new file mode 100644 index 0000000..9a7009d Binary files /dev/null and b/trunk/ConsoleDataMigration/sources/common/romfiles/CAVE_ACCOUNT_save_0.bin differ