diff options
| author | Pierre Bourdon <delroth@gmail.com> | 2016-07-12 02:24:04 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-07-12 02:24:04 +0200 |
| commit | f59b8b7536131c7d7bd6375ab4090ed076b4fca2 (patch) | |
| tree | 2b2e68e2eeadd02175fc487e784484fbfdb4bfd4 /Source/Core/DiscIO/DiscScrubber.cpp | |
| parent | ac00b249aaf223d2d16755c04e353b6f5174bfe7 (diff) | |
| parent | 53e7eed28d977feec9371c39509b908aecbf13b8 (diff) | |
Merge pull request #3986 from JosJuice/scrubbing-improvements
Scrubbing improvements
Diffstat (limited to 'Source/Core/DiscIO/DiscScrubber.cpp')
| -rw-r--r-- | Source/Core/DiscIO/DiscScrubber.cpp | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/Source/Core/DiscIO/DiscScrubber.cpp b/Source/Core/DiscIO/DiscScrubber.cpp index 685a8d7b87..cad023f069 100644 --- a/Source/Core/DiscIO/DiscScrubber.cpp +++ b/Source/Core/DiscIO/DiscScrubber.cpp @@ -70,7 +70,7 @@ struct SPartitionGroup static SPartitionGroup PartitionGroup[4]; void MarkAsUsed(u64 _Offset, u64 _Size); -void MarkAsUsedE(u64 _PartitionDataOffset, u64 _Offset, u64 _Size); +void MarkAsUsedE(u64 partition_data_offset, u64 offset, u64 size); bool ReadFromVolume(u64 _Offset, u32& _Buffer, bool _Decrypt); bool ReadFromVolume(u64 _Offset, u64& _Buffer, bool _Decrypt); bool ParseDisc(); @@ -132,7 +132,7 @@ size_t GetNextBlock(File::IOFile& in, u8* buffer) if (m_isScrubbing && m_FreeTable[i]) { DEBUG_LOG(DISCIO, "Freeing 0x%016" PRIx64, CurrentOffset); - std::fill(buffer, buffer + m_BlockSize, 0xFF); + std::fill(buffer, buffer + m_BlockSize, 0x00); in.Seek(m_BlockSize, SEEK_CUR); ReadBytes = m_BlockSize; } @@ -171,23 +171,24 @@ void MarkAsUsed(u64 _Offset, u64 _Size) CurrentOffset += CLUSTER_SIZE; } } -// Compensate for 0x400(SHA-1) per 0x8000(cluster) -void MarkAsUsedE(u64 _PartitionDataOffset, u64 _Offset, u64 _Size) -{ - u64 Offset; - u64 Size; - - Offset = _Offset / 0x7c00; - Offset = Offset * CLUSTER_SIZE; - Offset += _PartitionDataOffset; - Size = _Size / 0x7c00; - Size = (Size + 1) * CLUSTER_SIZE; +// Compensate for 0x400 (SHA-1) per 0x8000 (cluster), and round to whole clusters +void MarkAsUsedE(u64 partition_data_offset, u64 offset, u64 size) +{ + u64 first_cluster_start = offset / 0x7c00 * CLUSTER_SIZE + partition_data_offset; - // Add on the offset in the first block for the case where data straddles blocks - Size += _Offset % 0x7c00; + u64 last_cluster_end; + if (size == 0) + { + // Without this special case, a size of 0 can be rounded to 1 cluster instead of 0 + last_cluster_end = first_cluster_start; + } + else + { + last_cluster_end = ((offset + size - 1) / 0x7c00 + 1) * CLUSTER_SIZE + partition_data_offset; + } - MarkAsUsed(Offset, Size); + MarkAsUsed(first_cluster_start, last_cluster_end - first_cluster_start); } // Helper functions for reading the BE volume |
