From afa93e5950268780e28cfe4414292c6cd4a55a0b Mon Sep 17 00:00:00 2001 From: David Korth Date: Fri, 30 May 2025 18:52:40 -0400 Subject: [PATCH] [librvth] RvtH::verifyWiiPartitions(): Use a struct for the hash error count. Essentially the same as an array, but more explicit. --- src/librvth/rvth.hpp | 15 +++++++++++++-- src/librvth/verify.cpp | 38 +++++++++++++++++++------------------- src/rvthtool/verify.cpp | 10 +++++++--- 3 files changed, 39 insertions(+), 24 deletions(-) diff --git a/src/librvth/rvth.hpp b/src/librvth/rvth.hpp index 0c93731..18d0837 100644 --- a/src/librvth/rvth.hpp +++ b/src/librvth/rvth.hpp @@ -398,6 +398,17 @@ public: public: /** Verification functions (verify.cpp) **/ + union WiiErrorCount_t { + struct { + unsigned int h0; + unsigned int h1; + unsigned int h2; + unsigned int h3; + unsigned int h4; + }; + unsigned int errs[5]; + }; + /** * Verify partitions in a Wii disc image. * @@ -415,13 +426,13 @@ public: * the H4 hash is correct. * * @param bank [in] Bank number (0-7) - * @param errors [out] Error counts for all 5 hash tables + * @param errorCount [out] Error counts for all 5 hash tables * @param callback [in,opt] Progress callback * @param userdata [in,opt] User data for progress callback * @return Error code. (If negative, POSIX error; otherwise, see RvtH_Errors.) */ int verifyWiiPartitions(unsigned int bank, - unsigned int error_count[5] = nullptr, + WiiErrorCount_t *errorCount = nullptr, RvtH_Verify_Progress_Callback callback = nullptr, void *userdata = nullptr); }; diff --git a/src/librvth/verify.cpp b/src/librvth/verify.cpp index 6de5e04..f573afd 100644 --- a/src/librvth/verify.cpp +++ b/src/librvth/verify.cpp @@ -115,20 +115,20 @@ static bool is_block_zero(const uint8_t *pData, size_t size) * the H4 hash is correct. * * @param bank [in] Bank number (0-7) - * @param errors [out] Error counts for all 5 hash tables + * @param errorCount [out] Error counts for all 5 hash tables * @param callback [in,opt] Progress callback * @param userdata [in,opt] User data for progress callback * @return Error code. (If negative, POSIX error; otherwise, see RvtH_Errors.) */ int RvtH::verifyWiiPartitions(unsigned int bank, - unsigned int error_count[5], + WiiErrorCount_t *errorCount, RvtH_Verify_Progress_Callback callback, void *userdata) { int ret = 0; // errno or RvtH_Errors - if (error_count) { - for (unsigned int i = 0; i < 5; i++) { - error_count[i] = 0; + if (errorCount) { + for (size_t i = 0; i < ARRAY_SIZE(errorCount->errs); i++) { + errorCount->errs[i] = 0; } } @@ -381,8 +381,8 @@ int RvtH::verifyWiiPartitions(unsigned int bank, sha1_digest(&sha1, digest.size(), digest.data()); if (memcmp(pContentEntry->sha1_hash, digest.data(), SHA1_DIGEST_SIZE) != 0) { state.is_zero = is_block_zero((const uint8_t*)H3_tbl.get(), 512); // only check one LBA - if (error_count) { - error_count[4]++; + if (errorCount) { + errorCount->h4++; } if (callback) { state.type = RVTH_VERIFY_ERROR_REPORT; @@ -469,8 +469,8 @@ int RvtH::verifyWiiPartitions(unsigned int bank, sha1_digest(&sha1, digest.size(), digest.data()); if (memcmp(H3_entry, digest.data(), digest.size()) != 0) { state.is_zero = is_block_zero((const uint8_t*)&gdata_enc[0], sizeof(gdata_enc[0])); - if (error_count) { - error_count[3]++; + if (errorCount) { + errorCount->h3++; } if (callback) { state.type = RVTH_VERIFY_ERROR_REPORT; @@ -489,8 +489,8 @@ int RvtH::verifyWiiPartitions(unsigned int bank, sizeof(gdata[0].hashes.H2)) != 0) { state.is_zero = is_block_zero((const uint8_t*)&gdata_enc[sector], sizeof(gdata_enc[sector])); - if (error_count) { - error_count[2]++; + if (errorCount) { + errorCount->h2++; } if (callback) { state.type = RVTH_VERIFY_ERROR_REPORT; @@ -510,8 +510,8 @@ int RvtH::verifyWiiPartitions(unsigned int bank, sha1_digest(&sha1, digest.size(), digest.data()); if (memcmp(gdata[0].hashes.H2[sg], digest.data(), digest.size()) != 0) { state.is_zero = is_block_zero((const uint8_t*)&gdata_enc[sector], sizeof(gdata_enc[sector])); - if (error_count) { - error_count[2]++; + if (errorCount) { + errorCount->h2++; } if (callback) { state.type = RVTH_VERIFY_ERROR_REPORT; @@ -536,8 +536,8 @@ int RvtH::verifyWiiPartitions(unsigned int bank, sizeof(gdata[0].hashes.H1)) != 0) { state.is_zero = is_block_zero((const uint8_t*)&gdata_enc[sector], sizeof(gdata_enc[sector])); - if (error_count) { - error_count[1]++; + if (errorCount) { + errorCount->h1++; } if (callback) { state.type = RVTH_VERIFY_ERROR_REPORT; @@ -557,8 +557,8 @@ int RvtH::verifyWiiPartitions(unsigned int bank, sha1_digest(&sha1, digest.size(), digest.data()); if (memcmp(gdata[sector].hashes.H1[sector % 8], digest.data(), digest.size()) != 0) { state.is_zero = is_block_zero((const uint8_t*)&gdata_enc[sector], sizeof(gdata_enc[sector])); - if (error_count) { - error_count[1]++; + if (errorCount) { + errorCount->h1++; } if (callback) { state.type = RVTH_VERIFY_ERROR_REPORT; @@ -580,8 +580,8 @@ int RvtH::verifyWiiPartitions(unsigned int bank, sha1_digest(&sha1, digest.size(), digest.data()); if (memcmp(gdata[sector].hashes.H0[kb], digest.data(), digest.size()) != 0) { state.is_zero = is_block_zero(&gdata_enc[sector].data[kb * 1024], 1024); - if (error_count) { - error_count[0]++; + if (errorCount) { + errorCount->h0++; } if (callback) { state.type = RVTH_VERIFY_ERROR_REPORT; diff --git a/src/rvthtool/verify.cpp b/src/rvthtool/verify.cpp index ac2df43..96f582d 100644 --- a/src/rvthtool/verify.cpp +++ b/src/rvthtool/verify.cpp @@ -164,18 +164,22 @@ int verify(const TCHAR *rvth_filename, const TCHAR *s_bank) print_bank(rvth, bank); putchar('\n'); + RvtH::WiiErrorCount_t errorCount; + for (size_t i = 0; i < ARRAY_SIZE(errorCount.errs); i++) { + errorCount.errs[i] = 0; + } + const bool isHDD = rvth->isHDD(); - unsigned int error_count[5] = {0, 0, 0, 0, 0}; if (isHDD) { _tprintf(_T("Verifying Bank %u...\n"), bank+1); } else { _fputts(_T("Verifying disc image...\n"), stdout); } fflush(stdout); - ret = rvth->verifyWiiPartitions(bank, error_count, progress_callback); + ret = rvth->verifyWiiPartitions(bank, &errorCount, progress_callback); if (ret == 0) { // Add up the errors. - unsigned int total_errs = std::accumulate(error_count, error_count + ARRAY_SIZE(error_count), 0); + unsigned int total_errs = std::accumulate(errorCount.errs, errorCount.errs + ARRAY_SIZE(errorCount.errs), 0); if (isHDD) { _tprintf(_T("Bank %u verified with %u error%s.\n"), bank+1, total_errs, (total_errs != 1) ? _T("s") : _T("")); } else {