mirror of
https://github.com/GerbilSoft/rvthtool.git
synced 2025-06-18 19:45:35 -04:00
[librvth] RvtH::verifyWiiPartitions(): Use a struct for the hash error count.
Essentially the same as an array, but more explicit.
This commit is contained in:
parent
76746231ca
commit
afa93e5950
@ -398,6 +398,17 @@ public:
|
|||||||
public:
|
public:
|
||||||
/** Verification functions (verify.cpp) **/
|
/** 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.
|
* Verify partitions in a Wii disc image.
|
||||||
*
|
*
|
||||||
@ -415,13 +426,13 @@ public:
|
|||||||
* the H4 hash is correct.
|
* the H4 hash is correct.
|
||||||
*
|
*
|
||||||
* @param bank [in] Bank number (0-7)
|
* @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 callback [in,opt] Progress callback
|
||||||
* @param userdata [in,opt] User data for progress callback
|
* @param userdata [in,opt] User data for progress callback
|
||||||
* @return Error code. (If negative, POSIX error; otherwise, see RvtH_Errors.)
|
* @return Error code. (If negative, POSIX error; otherwise, see RvtH_Errors.)
|
||||||
*/
|
*/
|
||||||
int verifyWiiPartitions(unsigned int bank,
|
int verifyWiiPartitions(unsigned int bank,
|
||||||
unsigned int error_count[5] = nullptr,
|
WiiErrorCount_t *errorCount = nullptr,
|
||||||
RvtH_Verify_Progress_Callback callback = nullptr,
|
RvtH_Verify_Progress_Callback callback = nullptr,
|
||||||
void *userdata = nullptr);
|
void *userdata = nullptr);
|
||||||
};
|
};
|
||||||
|
@ -115,20 +115,20 @@ static bool is_block_zero(const uint8_t *pData, size_t size)
|
|||||||
* the H4 hash is correct.
|
* the H4 hash is correct.
|
||||||
*
|
*
|
||||||
* @param bank [in] Bank number (0-7)
|
* @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 callback [in,opt] Progress callback
|
||||||
* @param userdata [in,opt] User data for progress callback
|
* @param userdata [in,opt] User data for progress callback
|
||||||
* @return Error code. (If negative, POSIX error; otherwise, see RvtH_Errors.)
|
* @return Error code. (If negative, POSIX error; otherwise, see RvtH_Errors.)
|
||||||
*/
|
*/
|
||||||
int RvtH::verifyWiiPartitions(unsigned int bank,
|
int RvtH::verifyWiiPartitions(unsigned int bank,
|
||||||
unsigned int error_count[5],
|
WiiErrorCount_t *errorCount,
|
||||||
RvtH_Verify_Progress_Callback callback,
|
RvtH_Verify_Progress_Callback callback,
|
||||||
void *userdata)
|
void *userdata)
|
||||||
{
|
{
|
||||||
int ret = 0; // errno or RvtH_Errors
|
int ret = 0; // errno or RvtH_Errors
|
||||||
if (error_count) {
|
if (errorCount) {
|
||||||
for (unsigned int i = 0; i < 5; i++) {
|
for (size_t i = 0; i < ARRAY_SIZE(errorCount->errs); i++) {
|
||||||
error_count[i] = 0;
|
errorCount->errs[i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -381,8 +381,8 @@ int RvtH::verifyWiiPartitions(unsigned int bank,
|
|||||||
sha1_digest(&sha1, digest.size(), digest.data());
|
sha1_digest(&sha1, digest.size(), digest.data());
|
||||||
if (memcmp(pContentEntry->sha1_hash, digest.data(), SHA1_DIGEST_SIZE) != 0) {
|
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
|
state.is_zero = is_block_zero((const uint8_t*)H3_tbl.get(), 512); // only check one LBA
|
||||||
if (error_count) {
|
if (errorCount) {
|
||||||
error_count[4]++;
|
errorCount->h4++;
|
||||||
}
|
}
|
||||||
if (callback) {
|
if (callback) {
|
||||||
state.type = RVTH_VERIFY_ERROR_REPORT;
|
state.type = RVTH_VERIFY_ERROR_REPORT;
|
||||||
@ -469,8 +469,8 @@ int RvtH::verifyWiiPartitions(unsigned int bank,
|
|||||||
sha1_digest(&sha1, digest.size(), digest.data());
|
sha1_digest(&sha1, digest.size(), digest.data());
|
||||||
if (memcmp(H3_entry, digest.data(), digest.size()) != 0) {
|
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]));
|
state.is_zero = is_block_zero((const uint8_t*)&gdata_enc[0], sizeof(gdata_enc[0]));
|
||||||
if (error_count) {
|
if (errorCount) {
|
||||||
error_count[3]++;
|
errorCount->h3++;
|
||||||
}
|
}
|
||||||
if (callback) {
|
if (callback) {
|
||||||
state.type = RVTH_VERIFY_ERROR_REPORT;
|
state.type = RVTH_VERIFY_ERROR_REPORT;
|
||||||
@ -489,8 +489,8 @@ int RvtH::verifyWiiPartitions(unsigned int bank,
|
|||||||
sizeof(gdata[0].hashes.H2)) != 0)
|
sizeof(gdata[0].hashes.H2)) != 0)
|
||||||
{
|
{
|
||||||
state.is_zero = is_block_zero((const uint8_t*)&gdata_enc[sector], sizeof(gdata_enc[sector]));
|
state.is_zero = is_block_zero((const uint8_t*)&gdata_enc[sector], sizeof(gdata_enc[sector]));
|
||||||
if (error_count) {
|
if (errorCount) {
|
||||||
error_count[2]++;
|
errorCount->h2++;
|
||||||
}
|
}
|
||||||
if (callback) {
|
if (callback) {
|
||||||
state.type = RVTH_VERIFY_ERROR_REPORT;
|
state.type = RVTH_VERIFY_ERROR_REPORT;
|
||||||
@ -510,8 +510,8 @@ int RvtH::verifyWiiPartitions(unsigned int bank,
|
|||||||
sha1_digest(&sha1, digest.size(), digest.data());
|
sha1_digest(&sha1, digest.size(), digest.data());
|
||||||
if (memcmp(gdata[0].hashes.H2[sg], digest.data(), digest.size()) != 0) {
|
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]));
|
state.is_zero = is_block_zero((const uint8_t*)&gdata_enc[sector], sizeof(gdata_enc[sector]));
|
||||||
if (error_count) {
|
if (errorCount) {
|
||||||
error_count[2]++;
|
errorCount->h2++;
|
||||||
}
|
}
|
||||||
if (callback) {
|
if (callback) {
|
||||||
state.type = RVTH_VERIFY_ERROR_REPORT;
|
state.type = RVTH_VERIFY_ERROR_REPORT;
|
||||||
@ -536,8 +536,8 @@ int RvtH::verifyWiiPartitions(unsigned int bank,
|
|||||||
sizeof(gdata[0].hashes.H1)) != 0)
|
sizeof(gdata[0].hashes.H1)) != 0)
|
||||||
{
|
{
|
||||||
state.is_zero = is_block_zero((const uint8_t*)&gdata_enc[sector], sizeof(gdata_enc[sector]));
|
state.is_zero = is_block_zero((const uint8_t*)&gdata_enc[sector], sizeof(gdata_enc[sector]));
|
||||||
if (error_count) {
|
if (errorCount) {
|
||||||
error_count[1]++;
|
errorCount->h1++;
|
||||||
}
|
}
|
||||||
if (callback) {
|
if (callback) {
|
||||||
state.type = RVTH_VERIFY_ERROR_REPORT;
|
state.type = RVTH_VERIFY_ERROR_REPORT;
|
||||||
@ -557,8 +557,8 @@ int RvtH::verifyWiiPartitions(unsigned int bank,
|
|||||||
sha1_digest(&sha1, digest.size(), digest.data());
|
sha1_digest(&sha1, digest.size(), digest.data());
|
||||||
if (memcmp(gdata[sector].hashes.H1[sector % 8], digest.data(), digest.size()) != 0) {
|
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]));
|
state.is_zero = is_block_zero((const uint8_t*)&gdata_enc[sector], sizeof(gdata_enc[sector]));
|
||||||
if (error_count) {
|
if (errorCount) {
|
||||||
error_count[1]++;
|
errorCount->h1++;
|
||||||
}
|
}
|
||||||
if (callback) {
|
if (callback) {
|
||||||
state.type = RVTH_VERIFY_ERROR_REPORT;
|
state.type = RVTH_VERIFY_ERROR_REPORT;
|
||||||
@ -580,8 +580,8 @@ int RvtH::verifyWiiPartitions(unsigned int bank,
|
|||||||
sha1_digest(&sha1, digest.size(), digest.data());
|
sha1_digest(&sha1, digest.size(), digest.data());
|
||||||
if (memcmp(gdata[sector].hashes.H0[kb], digest.data(), digest.size()) != 0) {
|
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);
|
state.is_zero = is_block_zero(&gdata_enc[sector].data[kb * 1024], 1024);
|
||||||
if (error_count) {
|
if (errorCount) {
|
||||||
error_count[0]++;
|
errorCount->h0++;
|
||||||
}
|
}
|
||||||
if (callback) {
|
if (callback) {
|
||||||
state.type = RVTH_VERIFY_ERROR_REPORT;
|
state.type = RVTH_VERIFY_ERROR_REPORT;
|
||||||
|
@ -164,18 +164,22 @@ int verify(const TCHAR *rvth_filename, const TCHAR *s_bank)
|
|||||||
print_bank(rvth, bank);
|
print_bank(rvth, bank);
|
||||||
putchar('\n');
|
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();
|
const bool isHDD = rvth->isHDD();
|
||||||
unsigned int error_count[5] = {0, 0, 0, 0, 0};
|
|
||||||
if (isHDD) {
|
if (isHDD) {
|
||||||
_tprintf(_T("Verifying Bank %u...\n"), bank+1);
|
_tprintf(_T("Verifying Bank %u...\n"), bank+1);
|
||||||
} else {
|
} else {
|
||||||
_fputts(_T("Verifying disc image...\n"), stdout);
|
_fputts(_T("Verifying disc image...\n"), stdout);
|
||||||
}
|
}
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
ret = rvth->verifyWiiPartitions(bank, error_count, progress_callback);
|
ret = rvth->verifyWiiPartitions(bank, &errorCount, progress_callback);
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
// Add up the errors.
|
// 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) {
|
if (isHDD) {
|
||||||
_tprintf(_T("Bank %u verified with %u error%s.\n"), bank+1, total_errs, (total_errs != 1) ? _T("s") : _T(""));
|
_tprintf(_T("Bank %u verified with %u error%s.\n"), bank+1, total_errs, (total_errs != 1) ? _T("s") : _T(""));
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user